我正在尝试测试 iptables 用于 NAT 的 CPU 数量。也许说“netfilter 内核模块”使用的 CPU 数量会更准确。
我采取的方法是尝试剥离系统中的所有用户空间进程,运行流式传输并检查顶部Load average
。在这种情况下,平均负载非常低,就好像处理器没有受到数据包路由的影响一样。
然而,在阅读了一些关于平均负载的含义之后(这里) 似乎它并不代表CPU利用率而是代表进程队列的长度。
据我目前的理解,内核模块的执行不被视为进程,这就是为什么它永远不会被列在进程队列中。
这是否意味着检测内核代码 CPU 过载的唯一方法是使用用户空间代码运行它并观察用户空间代码因未获得处理器时间而失败?
举一个简单的例子来阐述这个问题。如果一段内核代码有一个“忙等待”错误,你如何检测出是内核过度使用了 CPU?
答案1
您可以简单地添加自己的追踪规则(使用未使用的 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
一旦规则准备好,您就可以从其他地方建立连接:
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...
这测试规则可以简单地删除:
iptables-save |
sed -ne '/^\*/{s/^.//;h;};
/dport 8 -j LOG/{G;s/^-A\(.*\)\n\(.*\)$/iptables -t \2 -D\1/;p}
' | sh