Назад | Перейти на главную страницу

Влияние выполнения кода ядра на среднюю нагрузку вверху?

Я пытаюсь проверить количество процессора, которое 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