Я пытаюсь проверить количество процессора, которое iptables использует для NAT. Возможно, точнее будет сказать «объем процессора, который использует модуль ядра netfilter».
Подход, который я использовал, заключался в том, чтобы попытаться удалить из системы все процессы пользовательского пространства, запустить потоковую передачу и проверить Load average
вверху. В этом случае средние значения нагрузки довольно низкие, как если бы маршрутизация пакетов не влияла на процессор.
Однако, прочитав немного о том, что означает средняя загрузка (Вот) кажется, что это не загрузка ЦП, а длина очереди процессов.
Насколько я понимаю, выполнение модулей ядра не рассматривается как процессы, поэтому оно никогда не будет отображаться в очереди процессов.
Означает ли это, что единственный способ обнаружить перегрузку процессора по коду ядра - запустить его с кодом пользовательского пространства и увидеть, как код пользовательского пространства не работает из-за отсутствия процессорного времени?
Простой пример для формулировки вопроса. Если бы в коде ядра была ошибка «занятое ожидание», как бы вы обнаружили, что это ядро чрезмерно использует процессор?
Вы можете просто добавить свой правила отслеживания (с использованием неиспользуемого 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