Quando executo o comando ethtool -S wlp2s0
, recebo as seguintes informações:
NIC statistics:
rx_packets: 63
rx_bytes: 14163
rx_duplicates: 2
rx_fragments: 58
rx_dropped: 30
tx_packets: 60
tx_bytes: 9668
tx_filtered: 0
tx_retry_failed: 0
tx_retries: 39
sta_state: 4
txrate: 115600000
rxrate: 130000000
signal: 189
channel: 0
(...)
No entanto, quando vou para a /sys/class/net/wlp2s0/statistics
pasta, as estatísticas são diferentes do ethtool (e parecem ser as impressas pelo ifconfig). Por exemplo, quando exponho rx_dropped
a partir da pasta, o resultado é sempre 0
.
Esta é a ifconfig
exibição da interface:
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.115 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::6f9d:4eac:5bec:1ea6 prefixlen 64 scopeid 0x20<link>
ether 88:b1:11:6a:1d:82 txqueuelen 1000 (Ethernet)
RX packets 42483 bytes 55964467 (55.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9309 bytes 1393476 (1.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Minha pergunta é, se eu quisesse saber os pacotes descartados em intervalos de 1 segundo, onde eu poderia obter essa informação? ethtool
parece ser uma boa opção, mas não sei de onde vem a informação e não entendo porque a informação é diferente da pasta de estatísticas...
Além disso, o que significaria esse valor de 30 no rx_dropped? São os pacotes descartados desde que a interface está ativa?
ethtool
obtém as estatísticas usando oSIOCETHTOOL
ioctl, que leva um ponteiro parastruct ethtool_stats
. Para obter as estatísticas, ocmd
campo da struct deve ter o valorETHTOOL_GSTATS
. Antes de chamar esse ioctl, você deve usar outro ethtool ioctl (tambémSIOCETHTOOL
, com um ponteiro parastruct ethtool_sset_info
com seucmd
campo inicializado paraETHTOOL_GSSET_INFO
, ou um ponteiro parastruct ethtool_drvinfo
com seucmd
campo inicializado paraETHTOOL_GDRVINFO
) para saber o número de diferentes valores estatísticos que o driver está prestes a retornar, para que você possa alocar memória suficiente parastruct ethtool_stats
....E se você não programa em C, a descrição muito densa e rica em jargões acima provavelmente não fez nenhum sentido para você. Se você precisar acessar
ethtool
estatísticas em um script, eu recomendaria usar uma linguagem de script que tenha ligações para a interface ethtool disponíveis, como Perl (moduleLinux::Ethtool
) ou Python (aparentemente https://pypi.org/project/netifaces/ ). Isso deve tornar o acesso às estatísticas muito mais simples.É claro que você sempre pode analisar a saída do
ethtool
comando, mas se quiser pesquisar as estatísticas uma vez a cada segundo, pode ser benéfico eliminar a necessidade devfork()
um novo processo ou dois sempre que precisar das estatísticas.Os valores resultantes vêm do driver NIC. O fato de o desenvolvedor do driver não ter adicionado o código para acessar as estatísticas relevantes também via
/sys/class/net/<name>/statistics
nem via de/proc/net/dev
ondeifconfig
as obtém sugere que o driver pode definir esses valores de maneira um pouco diferente de/proc/net/dev
e/ou/sys/class/net/*/statistics
... ou pode simplesmente indicar que o driver a implementação infelizmente não é perfeita.(O desenvolvedor pode ter escolhido implementar a API primeiro, já que é
ethtool
a mais nova, e deixou as interfaces de estatísticas mais antigas incompletas para "quando eu tiver tempo".ifconfig
bem conservado mais.)Para descobrir os detalhes, talvez seja necessário ler a documentação e/ou os comentários do código-fonte do driver real. Como você não especificou o modelo da NIC nem o nome do driver, ninguém mais pode fazer isso por você. A saída de
ethtool -i wlp2s0
seria de grande utilidade na identificação do driver NIC.