Liên kết mèo / Proc / net / dev và ip ip -s link Hiển thị số liệu thống kê khác nhau. Cái nào nói dối?


8

Tôi nhận thấy rằng /proc/net/deveth3 có 1753 drops. ip -s linkhiển thị 0 dropped. Tại sao lại có một sự khác biệt? Dữ liệu khác nhau đến từ đâu? Điều nào là đúng?

Tôi đã loại bỏ dữ liệu bổ sung.

# uname -a
Linux example09 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012 x86_64 GNU/Linux

# lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.4 (squeeze)
Release:        6.0.4
Codename:       squeeze

# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  eth3:1258629839430 12545003042    0 1753    0     0          0  10594858 6666255952912 10026428444    0    0    0     0       0          0

# ip -s link
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:15:17:96:0b:61 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    244248462  3955476484 0       0       0       10595400
    TX: bytes  packets  errors  dropped carrier collsns
    683632524  1436809416 0       0       0       0

Tương tự ở đây. Nó trông giống như cuộn qua số nguyên 32 bit trong các chương trình không gian người dùng ( ifconfigthực hiện tương tự ở đây) nhưng theo bc, không phải 1258629839430%(2^32)204421702244248462, vì vậy tôi không chắc đó là gì (trừ khi bạn chạy ip~
40 MB

@DerfK Có, khoảng 40 MB âm thanh đúng. Chỉ vài giây, nhưng đó là một máy chủ bận rộn.
ablackhat

Câu trả lời:


11

Trên một máy ép, tin tưởng /proc/net/dev. Đó là một cách đơn giản và đáng tin cậy hơn để xem xét cùng một dữ liệu.

Đối với trường hợp cụ thể của số đếm bị giảm, tôi không thể giải thích chính xác vấn đề, nhưng tôi có thể quan sát nó trên các hộp Bóp khác. Nếu tôi quan tâm, tôi sẽ báo cáo đó là lỗi cho Debian (và đề nghị ai đó thực hiện và báo cáo lại tại đây).

Cả hai lấy số từ tx_droppedlĩnh vực net_device_stats. Trong /proc/net/dev, dòng được tạo bởi dev_seq_printf_statstừ net/core/dev.c.

ipnhư thường lệ, thông qua netlink, và chính xác hơn là thống kê thiết bị mạng, rtnetlink. Cấu trúc được chuyển đến không gian người dùng , rtnl_link_stats.

Cấu trúc gốc sử dụng unsigned longs, rtnetlinksử dụng __u32, một chuyển đổi ngầm định ít nhiều được thực hiện trong copy_rtnl_link_stats.

Rất dễ để bắt phiên bản 32 bit đang được sử dụng từ đầu cấu trúc, rx_packets: trong khi /proc/net/devhiển thị 1258629839430, iphiển thị 244248462, tương ứng với 32 bit cuối cùng (cộng thêm một vài byte giữa các lệnh); điều tương tự với số lượng gói.

Đây là con số khủng khiếp cho 2 trường đầu tiên:

% echo '1258629839430 % (2^32)'|bc; echo 244248462
204421702
244248462
% echo '12545003042 % (2^32)'|bc; echo 3955476484 
3955068450
3955476484

Mọi thứ trở nên tốt hơn xung quanh việc giới thiệu IFLA_STATS64:

  • trong kernel (từ cam kết 10708f37ae729baba9b67bd134c3720709d4ae62, có sẵn ngược dòng trong v2.6.35 trở lên)
  • trong iproute2 (từ cam kết 8864ac9dc5bd5ce049280337deb21191673a02d0, có sẵn ngược dòng trong v2.6.33-36 trở lên).

Tuyệt vời, đây chính xác là những gì tôi đang tìm kiếm.
ablackhat

-2

Trên hầu hết các thiết bị, / Proc / net / dev được đọc từ bộ đếm phần cứng. Số liệu thống kê khác được cập nhật từ ngăn xếp mạng trong cấu trúc thiết bị.

Giọt có nhiều khả năng không khớp vì phần cứng có thể được tạo ra: đích mac gói không phải là thiết bị cũng không phải là đa hướng và thiết bị không bị bừa bãi: phần cứng trực tiếp làm rơi gói, ngăn xếp sẽ không bao giờ biết nó tồn tại.

Cuối cùng, bạn có thể tự hỏi tại sao không đồng bộ hóa chúng hoặc luôn sử dụng số liệu thống kê phần cứng? Khi stack làm rơi gói tin vì bất kỳ lý do gì, nó không thể cập nhật bộ đếm phần cứng và để gỡ lỗi, thật hữu ích khi biết bạn có thể tìm từng gói để theo dõi nơi gói được thả.

Hi vọng điêu nay co ich

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.