Làm thế nào để tìm hiểu lý do tại sao giao diện mạng bị rớt gói?


18

Có cách nào trên Linux để lấy số liệu thống kê về các lý do khác nhau khiến các gói bị bỏ không?

Trên tất cả các giao diện mạng (openSUSE 12.3) trên một số máy chủ ifconfignetstat -iđang báo cáo các gói bị rơi tại quầy lễ tân. Khi tôi thực hiện tcpdump, số lượng gói bị rơi sẽ ngừng tăng, nghĩa là các hàng đợi giao diện không đầy và làm rơi dữ liệu. Vì vậy, phải có những lý do khác tại sao điều này xảy ra (ví dụ: pkts multicast nhận được trong khi giao diện không phải là một phần của nhóm phát đa hướng này).

Tôi có thể tìm thấy thông tin đó ở đâu? (/ Proc? / sys? một số nhật ký?)

Ví dụ về thống kê (hợp nhất đầu ra / sys / class / net / <dev> / stats và ethtool):

alloc_rx_buff_failed: 0
collisions: 0
dropped_smbus: 0
multicast: 1644
rx_align_errors: 0
rx_broadcast: 23626
rx_bytes: 1897203
rx_compressed: 0
rx_crc_errors: 0
rx_csum_offload_errors: 0
rx_csum_offload_good: 0
rx_dropped: 4738
rx_errors: 0
rx_fifo_errors: 0
rx_flow_control_xoff: 0
rx_flow_control_xon: 0
rx_frame_errors: 0
rx_length_errors: 0
rx_long_byte_count: 1998731
rx_long_length_errors: 0
rx_missed_errors: 0
rx_multicast: 1644
rx_no_buffer_count: 0
rx_over_errors: 0
rx_packets: 25382
rx_short_length_errors: 0
rx_smbus: 0
tx_aborted_errors: 0
tx_abort_late_coll: 0
tx_broadcast: 7
tx_bytes: 11300
tx_carrier_errors: 0
tx_compressed: 0
tx_deferred_ok: 0
tx_dropped: 0
tx_errors: 0
tx_fifo_errors: 0
tx_flow_control_xoff: 0
tx_flow_control_xon: 0
tx_heartbeat_errors: 0
tx_multicast: 43
tx_multi_coll_ok: 0
tx_packets: 63
tx_restart_queue: 0
tx_single_coll_ok: 0
tx_smbus: 0
tx_tcp_seg_failed: 0
tx_tcp_seg_good: 0
tx_timeout_count: 0
tx_window_errors: 0

Câu trả lời:


23

Hãy thử /sys/class/net/eth0/statistics/ (ví dụ như eth0), nó không hoàn hảo nhưng nó phá vỡ các lỗi bằng cách truyền / nhận và bởi nhà cung cấp dịch vụ, cửa sổ, fifo, crc, khung, độ dài (và một vài lỗi nữa).

Giọt không giống như "bị bỏ qua", netstathiển thị thống kê cấp độ giao diện, gói đa tuyến bị bỏ qua bởi cấp cao hơn (lớp 3, ngăn xếp IP) sẽ không hiển thị dưới dạng thả (mặc dù nó có thể hiển thị dưới dạng "được lọc" trên một số Thống kê NIC). Thống kê có thể phức tạp phần nào bởi các tính năng giảm tải khác nhau.

Bạn có thể nhận được nhiều số liệu thống kê hơn nếu bạn có ethtool:

# ethtool -S eth0
 rx_packets: 60666755
 tx_packets: 2206194
 rx_bytes: 6630349870
 tx_bytes: 815877983
 rx_broadcast: 58230114
 tx_broadcast: 9307
 rx_multicast: 8406
 tx_multicast: 17
 rx_errors: 0
 tx_errors: 0
 tx_dropped: 0
 multicast: 8406
 collisions: 0
 rx_length_errors: 0
 rx_over_errors: 0
 rx_crc_errors: 0
 rx_frame_errors: 0
 rx_no_buffer_count: 0
 rx_missed_errors: 0
 tx_aborted_errors: 0
 tx_carrier_errors: 0
 tx_fifo_errors: 0
 tx_heartbeat_errors: 0
 [...]

Một số thống kê phụ thuộc vào trình điều khiển NIC, cũng như ý nghĩa chính xác. Trên đây là từ một Intel e1000. Đã xem xét một số trình điều khiển, một số thu thập nhiều số liệu thống kê hơn các trình điều khiển khác (số liệu thống kê có sẵn cho ethtool có xu hướng được giữ trong tệp nguồn riêng biệt, ví dụ: drivers/net/ethernet/intel/e1000/e1000_ethtool.cnếu bạn cần lục lọi).

ethtool -i eth0sẽ hiển thị chi tiết trình điều khiển, đầu ra của lspci -vnên chi tiết hơn, mặc dù với một chút lộn xộn quá.


Cập nhật Trong tg3.cchức năng tg3_rx()chỉ có một nơi có vẻ giống với a tp->rx_dropped++, nhưng mã bị lấp đầy bởi gotos, do đó, có một số nguyên nhân khác không rõ ràng, tức là bất cứ điều gì có goto drop_it hoặc goto drop_it_no_recycle. (Lưu ý rằng bộ đếm thả là một trong số ít được duy trì bởi trình điều khiển, phần còn lại được duy trì bởi chính thiết bị.)

Nguồn tài xế tôi phải giao là 3.123. Dự đoán tốt nhất của tôi là mã này:

           if (len > (tp->dev->mtu + ETH_HLEN) &&
                skb->protocol != htons(ETH_P_8021Q)) {
                    dev_kfree_skb(skb);
                    goto drop_it_no_recycle;
            }

Kiểm tra MTU, nguyên nhân có thể là khung jumbo hoặc khung ethernet hơi quá khổ để cho phép đóng gói. Tôi không thể giải thích tại sao tcpdumpcó thể thay đổi hành vi, không biết thay đổi giao diện MTU. Cũng lưu ý rằng bạn có thể "thấy" các gói lớn hơn MTU tcpdumpnếu TSO / LRO được bật ( giải thích ).


Cảm ơn bạn đã trả lời đề xuất của bạn. Thông tin được cung cấp bởi thư mục thống kê sysfs hoặc ethtool -Stương tự (ít nhất là trên hệ thống của tôi) và tôi chỉ nhận được thông tin về số lượng gói bị bỏ. Tôi sẽ cập nhật bài viết của tôi với đầu ra.
Huygens

Tôi đã kiểm tra mã nguồn trình điều khiển (tg3.c) và chỉ tìm thấy tham chiếu cho các lỗi Vlan và độ dài bộ đệm ổ cắm không chính xác. Tôi không biết phải kết luận điều gì từ đó ...
Huygens

Cảm ơn đã cập nhật, thật đáng buồn là tôi không thể +1 lần thứ hai ;-) Tôi sẽ có một cái nhìn nếu tcpdump đang báo cáo các khung hình lớn hoặc khung lớn hơn MTU của tôi (1500).
Huygens

Tôi có TSO và LRO 'trên'. Tcpdump không báo cáo các khung lớn hơn MTU của tôi, nhưng tôi sẽ cần xem liệu đây có phải là do LRO không ... tôi sẽ thấy vào thứ Hai. Thời gian để được vào cuối tuần bây giờ.
Huygens

2
Nếu tg3là một mô-đun và bạn thực sự muốn đi đến tận cùng của nó, bạn có thể sử dụng printk()giống như netdev_info()để ghi lại một số sự kiện, có những trường hợp đã có trong mã để bạn sao chép. Xem include/linux/skbuff.hcho sk_buffcấu trúc (không dành cho người yếu tim). Rắc một vài cuộc gọi tại các địa điểm có liên quan tg3_rx(), xây dựng lại và tải lại mô-đun, và chờ ...
mr.spuratic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.