Em uma máquina do Squeeze, confie em /proc/net/dev
. É uma maneira mais direta e confiável de analisar os mesmos dados.
Para o caso específico da contagem ignorada, não consigo explicar o problema exato, mas posso observá-lo em outras caixas do Squeeze. Se eu me importasse, eu reportaria isso como um bug para o Debian (e sugiro que alguém faça e relate isso aqui).
Ambos usam o número do campo tx_dropped
de net_device_stats
. Em /proc/net/dev
, a linha é gerada por dev_seq_printf_stats
de net/core/dev.c
.
ip
, como sempre, passa pelo netlink e, mais precisamente, pelas estatísticas de dispositivos de rede, o rtnetlink. A estrutura passada para userspace, rtnl_link_stats
.
A estrutura nativa usa unsigned long
s, rtnetlink
usa __u32
, uma conversão mais ou menos implícita é feita em copy_rtnl_link_stats
.
É muito fácil pegar a versão de 32 bits sendo usada desde o início da estrutura, rx_packets: enquanto /proc/net/dev
mostra 1258629839430, ip
mostra 244248462, que corresponde aproximadamente aos últimos 32 bits (mais alguns mais bytes entre os comandos); mesma coisa com a contagem de pacotes.
Aqui está o processamento de números para esses dois primeiros campos:
% echo '1258629839430 % (2^32)'|bc; echo 244248462
204421702
244248462
% echo '12545003042 % (2^32)'|bc; echo 3955476484
3955068450
3955476484
As coisas melhoraram com a introdução de IFLA_STATS64
:
- no kernel (do commit 10708f37ae729baba9b67bd134c3720709d4ae62, disponível no upstream na v2.6.35 e posterior)
- no iproute2 (do commit 8864ac9dc5bd5ce049280337deb21191673a02d0, disponível no upstream em v2.6.33-36 e posterior).