如何强制重置 rx_bytes 和 tx_bytes?

如何强制重置 rx_bytes 和 tx_bytes?

我正在跟踪网络接口上的数据传输,但希望将它们重置为0每月 1 日。

当我尝试echo 0rx_bytes文件时tx_bytes,我得到以下信息:

bash: /sys/class/net/wlan0/statistics/rx_bytes: Permission denied

我以 root 身份运行该命令。

我还尝试复制(覆盖)文件:

cp: cannot create regular file:‘/sys/class/net/wlan0/statistics/rx_bytes’: Permission denied

我还尝试将权限更改为777(默认为444

答案1

通常的方法是在月份变化时保存该值,并计算与该值的差异。通过这种方式,您可以轻松地对多个时间间隔内的值进行计数,并且还可以将单个数据源与多个独立的消费者一起使用,而无需他们踩踏彼此的数字。此外,将计数器清零需要一种自动读取和清除计数器的方法,否则您将丢失读取计数器和将其清零之间的流量计数。像 SNMP 这样的东西通常也会给你一个只读计数器。

所以我不认为你真的想清理柜台。

为绘制网络统计数据而设计的程序通常可以处理环绕问题(例如rrdtool具有COUNTER模式)。尽管您仍然想使用 64 位计数器,因为我记得使用千兆位接口和 5 分钟轮询率时遇到过 32 位溢出问题。

答案2

您正在执行的文件操作操作可能不起作用,因为 /proc 中的文件并不是常识中真正的文件,而是为 Linux 内核中的变量提供“窗口”/接口的虚拟文件。

重置接口计数器的唯一方法是卸载并再次加载相应的接口内核模块。

找出eth0的内核模块:

$sudo ethtool -i eth0 | grep driver
driver: vmxnet3

然后卸载并加载内核模块:

sudo -- sh -c  'ifdown eth0 ; modprobe -r vmxnet3; modprobe vmxnet3 ; ifup eth0'

如果您不使用上述 sudo 语法,我建议您使用上述命令创建一个脚本,否则在某些情况下您可能会失去对远程 Linux 计算机的控制。

请注意,如果您有监视 eth0 的进程(例如看门狗),您也必须在卸载模块之前停止它们。

答案3

好的,所以就我而言,强制重置计数器的唯一方法是重新启动服务器。并不理想,但情况就是如此。

正如所提到的伊尔卡丘,最好的方法可能是在新月初保存该值,然后从该点开始计算。然而,我无法用我当前设置的脚本以一种优雅的方式来完成此任务。

因此,我选择了每月重新启动一次我的服务器的方案。我在下面包含了我使用的代码片段:

# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
        # CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
        echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi

# CREATE A NEW FILE EVERY TIME THIS IS RUN WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/this_month

# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
        # RUN YOUR RELEVANT CODE HERE #
        echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month     # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
        reboot now                                                              # REBOOT
        exit 0                                                                  # AND EXIT THIS SCRIPT
fi

相关内容