Percebo que /proc/net/dev
diz eth3 tem 1753 drop
s. ip -s link
mostra 0 dropped
. Por que existe uma diferença? De onde vêm os diferentes dados? Qual deles está correto?
Eu retirei os dados extras.
# 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
linux
networking
ip
ablackhat
fonte
fonte
ifconfig
faz a mesma coisa aqui), mas de acordo combc
,1258629839430%(2^32)
é204421702
não 244.248.462, então eu não tenho certeza de que é isso (a menos que você correuip
~ 40MB mais tarde)Respostas:
Em uma máquina Squeeze, confie
/proc/net/dev
. É uma maneira mais direta e confiável de ver os mesmos dados.Para o caso específico da contagem reduzida, não consigo explicar o problema exato, mas posso observá-lo em outras caixas do Squeeze. Se eu me importasse, eu o reportaria como um bug ao Debian (e sugiro que alguém o faça e reporte aqui).
Ambos pegam o número do
tx_dropped
campo denet_device_stats
. In/proc/net/dev
, a linha é gerada pordev_seq_printf_stats
fromnet/core/dev.c
.ip
passa, como de costume, pelo netlink e, mais precisamente, pelas estatísticas de dispositivos de rede, rtnetlink. A estrutura passada para o espaço do usuáriortnl_link_stats
,.A estrutura nativa usa
unsigned long
s,rtnetlink
uses__u32
, uma conversão mais ou menos implícita é feita emcopy_rtnl_link_stats
.É muito fácil entender que a versão de 32 bits está 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 bytes entre os comandos); mesma coisa com a contagem de pacotes.Aqui está o número de processamento desses dois primeiros campos:
As coisas melhoraram com a introdução de
IFLA_STATS64
:fonte
Na maioria dos dispositivos, / proc / net / dev é lido nos contadores de hardware. Outras estatísticas são atualizadas da pilha de rede nas estruturas do dispositivo.
É mais provável que as gotas não correspondam, pois podem ser feitas pelo hardware: o destino do pacote mac não é nem dispositivo nem multicast, e o dispositivo não é promíscuo: o hardware descarta o pacote diretamente, a pilha nunca saberá que ele existia.
Finalmente, você pode estar se perguntando por que não sincronizá-los ou sempre usar estatísticas de hardware? Quando a pilha descarta um pacote por qualquer motivo, ele não pode atualizar o contador de hardware e, para depuração, é útil saber que você pode encontrar cada um para rastrear onde o pacote foi descartado.
Espero que isto ajude
fonte