我想以最简单的方式获取用户空间中的NIC驱动程序64位统计信息。 API 函数 getifaddrs() 的手册页建议了一个简单的示例程序,该程序使用 32 位“struct rtnl_link_stats”来执行此操作(例如可以在这里看到它:http://man7.org/linux/man-pages/ man3/getifaddrs.3.html).
这个结构体的问题很明显:32 位变量快速环绕(超过 2^32)(例如“rx_bytes”)。
在包含 struct rtnl_link_stats 的同一个头文件(linux/if_link.h)中,有一个类似的具有 64 位变量的结构:struct rtnl_link_stats64。 我确信我非常接近在 64 位变量上获得相同的统计数据,但不幸的是,我没有这样做。
有类似 dev_get_stats() 的函数,但它们都是为内核空间编写的。
像“ethtool -S”这样的程序以 64 位值显示这些统计信息,但我认为它们做了一些操作并且没有以简单的方式填充struct rtnl_link_stats64。
直接从 /sys/class/net/ethX/statistics/rx_bytes 读取(使用 fopen、fscanf...)是可以的,但它的性能不如使用 API 读取。
有没有一种简单的方法在用户空间让struct rtnl_link_stats64填充我想念的相关统计数据?
显然,我发现的最好的(性能方面)方法是使用 libnl 库中的 netlink API。
这是我找到的一个简单示例程序的链接,它实现了它: https://gist.github.com/beejeebus/cc4fb07472cf5a0afd41
我检查了 Linux 内核如何在
/proc/net/snmp
/proc/net/snmp6
和 /proc/net/netstat
中获取统计信息。
https://github.com/torvalds/linux/blob/master/net/ipv4/proc.c#L394
所有这些文件都已经有 64 位计数器,Linux 希望您在 proc 中使用
file API
或直接使用 procfs API
。祝你好运:)