Итак, две проблемы:
ethtool
получает статистику с помощью SIOCETHTOOL
ioctl, который принимает указатель на struct ethtool_stats
. Чтобы получить статистику, поле cmd
структуры должно иметь значение ETHTOOL_GSTATS
. Прежде чем вызывать этот ioctl, вы должны использовать другой ethtool ioctl (также SIOCETHTOOL
либо с указателем на struct ethtool_sset_info
с его полем cmd
, инициализированным значением ETHTOOL_GSSET_INFO
, либо с указателем на struct ethtool_drvinfo
с его cmd
. ] поле инициализировано значением ETHTOOL_GDRVINFO
), чтобы узнать количество различных значений статистики, которые драйвер собирается вернуть, чтобы вы могли выделить достаточно памяти для struct ethtool_stats
.
...И если вы не программируете на C, очень плотное, богатое -жаргоном описание, приведенное выше, вероятно, не имело для вас никакого смысла. Если вам нужно получить доступ к статистике ethtool
в сценарии, я бы рекомендовал использовать язык сценариев, который имеет доступные привязки для интерфейса ethtool,например Perl (модульLinux::Ethtool
)или Python (по-видимомуhttps://pypi.org/project/netifaces/). Это должно упростить доступ к статистике.
Конечно, вы всегда можете проанализировать вывод команды ethtool
, но если вы хотите опрашивать статистику каждую секунду, может быть полезно исключить необходимость vfork()
запускать один или два новых процесса каждый раз, когда вы нужна статистика.
Результирующие значения поступают от драйвера сетевой карты. Тот факт, что разработчик драйвера не добавил код для доступа к соответствующей статистике ни через /sys/class/net/<name>/statistics
, ни через /proc/net/dev
, откуда ifconfig
получает их, предполагает, что драйвер может определять эти значения несколько иначе, чем /proc/net/dev
и/ или /sys/class/net/*/statistics
... или это может просто указывать на то, что реализация драйвера, к сожалению, не идеальна.
(Разработчик, возможно, решил сначала реализовать ethtool
API, поскольку он является самым новым, и оставил старые интерфейсы статистики незавершенными, «когда у меня будет время». Также обратите внимание, что команда ifconfig
устарела в большинстве дистрибутивов, поскольку она больше не поддерживается должным образом.)
Чтобы узнать подробности, вам, возможно, придется прочитать документацию и/или комментарии к исходному коду самого драйвера. Поскольку вы не указали ни модель сетевой карты, ни имя драйвера, никто другой не сможет это сделать за вас. Выходные данные ethtool -i wlp2s0
будут очень полезны для идентификации драйвера сетевой карты.