网卡中断数量差值

1、背景

判断中断是否均衡时,经常需要统计一段时间内各个中断号上的中断数量,手动计算还是比较麻烦的,用个小脚本就很方便了。

cat /proc/interrupts | grep eth > file1;sleep 30;cat /proc/interrupts | grep eth > file2;awk 'NR==FNR{for(i=1;i++<(NF-1);)a[FNR,i]=$i;next}{for(i=1;i++<(NF-1);)$i=$i-a[FNR,i]}{print $0}' file1 file2 

该语句统计30s内各个中断在各个CPU上的差值,可以直观看出中断是否均衡。

2、解释

  • /proc/interrupts中记录了系统上所有中断在每个CPU上的统计,我们通过grep eth的方式获取网卡中断,并保存在file1文件中,如果网卡名称不是eth*形式,替换成对应形式即可

  • awk中,NR和FNR表示当前读取的数据行数,区别在于NR对多个文件时会累计,FNR只对当前文件统计。也就是说,如果同时操作a、b文件时,操作a文件时,两个变量值一样,但是操作b文件时,NR会在a文件行号的基础上计数,而FNR则重新计数

  • NR==FNR为真时执行第一条语句,为假时,也就是打开第二个文件时,执行第二条语句

  • awk中NF代表列数,因此该awk语句的思想就是,遍历file1文件,将每个中断号在每个CPU上的数量存放在二维数组a中,等到处理file2文件时,用对应中断号,对应CPU上的中断数量减去上个时间段的数量,就得到差值

  • 最后通过{print $0}打印结果即可

3、实际效果

[root@localhost ~]# cat /proc/interrupts | grep eth > file1;sleep 30;cat /proc/interrupts | grep eth > file2;awk 'NR==FNR{for(i=1;i++<(NF-1);)a[FNR,i]=$i;next}{for(i=1;i++<(NF-1);)$i=$i-a[FNR,i]}{print $0}' file1 file2 
57: 0 2255 0 0 0 eth0-rxtx-0
58: 630 0 0 0 0 eth0-rxtx-1
59: 0 0 634 0 0 eth0-rxtx-2
60: 0 0 0 674 0 eth0-rxtx-3

实际输出中间会多出一列0值,因为/proc/interrupts倒数第二列是对中断号的解释,我们没有过滤。

从输入结果可以看出,系统进行了中断绑定,但是57号中断过多。

你可能感兴趣的:(小工具,Linux)