内核代码执行对最高负载的影响?

我试图testingiptables用于NAT的CPU数量。 说“netfilter内核模块”使用的CPU数量可能会更准确。

我采取的方法是试图剥离所有用户空间进程的系统,运行stream,并检查Load average最高。 在这种情况下,负载平均值相当低,就好像处理器不受分组路由的影响一样。

然而,在读了一下关于什么平均负载意味着( 这里 ),它似乎并不代表CPU利用率,而是处理队列的长度。

从我目前的理解来看,内核模块的执行不被视为进程,这就是为什么它永远不会被列在进程队列中。

这是否意味着通过内核代码检测CPU超载的唯一方法是使用用户空间代码运行它并查看由于没有获取处理器时间而导致的用户空间代码失败?

一个简单的例子来制定这个问题。 如果有一个内核代码有一个“忙等待”的bug,你会如何检测到它是过度使用CPU的内核?

您可以简单地添加自己的跟踪规则 (通过使用未使用的TCP端口,例如):

 for table in $(</proc/net/ip_tables_names);do while read dsc nam foo ;do if [ "$dsc" == "Chain" ];then iptables -t $table -I $nam -p tcp --dport 8 -j LOG --log-prefix "start-${table}-${nam} " iptables -t $table -A $nam -p tcp --dport 8 -j LOG --log-prefix "end-${table}-${nam} " fi done < <(iptables -n -t $table -L) done 

一旦规则准备就绪,您可以从其他地方build立联系:

 nc 192.168.1.31 8 (UNKNOWN) [192.168.1.31] 8 (?) : Connection refused 

比看看你的kern.log

 Dec 22 12:15:33 localhost kernel: [4237698.275654] start-nat-PREROUTING IN=br0 OUT= PHYSIN=eth0 MAC=01... Dec 22 12:15:33 localhost kernel: [4237698.275662] end-nat-PREROUTING IN=br0 OUT= PHYSIN=eth0 MAC=01... Dec 22 12:15:33 localhost kernel: [4237698.275674] start-filter-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01... Dec 22 12:15:33 localhost kernel: [4237698.275681] end-filter-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01... Dec 22 12:15:33 localhost kernel: [4237698.275688] start-nat-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01... Dec 22 12:15:33 localhost kernel: [4237698.275695] end-nat-INPUT IN=br0 OUT= PHYSIN=eth0 MAC=01... 

这个testing规则可以简单地删除:

 iptables-save | sed -ne '/^\*/{s/^.//;h;}; /dport 8 -j LOG/{G;s/^-A\(.*\)\n\(.*\)$/iptables -t \2 -D\1/;p} ' | sh