Su una macchina Squeeze, fidati di /proc/net/dev
. È un modo più diretto e affidabile di esaminare gli stessi dati.
Per il caso particolare del conteggio delle cadute, non posso spiegare il problema esatto, ma posso osservarlo su altre scatole di Squeeze. Se mi interessasse, lo segnalerei come un bug a Debian (e suggerirei che qualcuno lo faccia e lo riporti qui).
Entrambi prendono il numero dal tx_dropped
campo di net_device_stats
. In /proc/net/dev
, la riga è generata da dev_seq_printf_stats
da net/core/dev.c
.
ip
va, come al solito, tramite netlink, e più precisamente per le statistiche dei dispositivi di rete, rtnetlink. La struttura passata allo spazio utente, rtnl_link_stats
.
La struttura nativa utilizza unsigned long
s, rtnetlink
utilizza __u32
, viene eseguita una conversione più o meno implicita in copy_rtnl_link_stats
.
È piuttosto facile rilevare che la versione a 32 bit viene utilizzata dall'inizio della struttura, rx_packets:while /proc/net/dev
mostra 1258629839430, ip
mostra 244248462, che corrisponde all'incirca agli ultimi 32 bit (più qualche altro byte tra i comandi); stessa cosa con il conteggio dei pacchetti.
Ecco il numero che scricchiola per quei 2 primi campi:
% echo '1258629839430 % (2^32)'|bc; echo 244248462
204421702
244248462
% echo '12545003042 % (2^32)'|bc; echo 3955476484
3955068450
3955476484
Le cose sono migliorate con l'introduzione di IFLA_STATS64
:
- nel kernel (dal commit 10708f37ae729baba9b67bd134c3720709d4ae62, disponibile a monte nella v2.6.35 e successive)
- in iproute2 (dal commit 8864ac9dc5bd5ce049280337deb21191673a02d0, disponibile a monte nella versione 2.6.33-36 e successive).