Огромная нагрузка на ЦП при большом количестве TCP-соединений

При большом количестве TCP-соединений одно ядро ​​ЦП всегда будет работать до 100%. После этого вся виртуальная машина начнет отставать, и будет очевидная потеря пакетов.

Есть ли способ решить эту проблему, заставить TCP-соединения использовать меньше ЦП или даже ограничить скорость?

ПРИМЕЧАНИЕ: ограничение скорости с помощью iptables не работает. Пробовал следующее:

iptables -A INPUT -i eth0 -m state --state NEW -p tcp -m limit --limit 30/minute --dport 25565 -j ACCEPT

iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 25565 -j DROP

Обратите внимание, что даже отключение порта с помощью iptables -A INPUT -p tcp --dport 25565 -j DROP не сработает.

В разделе htop я не вижу, какой процесс занимает процессор, поэтому я полагаю, что это что-то с ядром. Некоторые хостинг-провайдеры, такие как OVH, решили эту проблему, но у многих других это случается. Какие у меня варианты?

С уважением

0
задан 23 August 2021 в 17:14

1 ответ

Я не думаю, что ваша проблема в ядре, и я не думаю, что ваши узкие места в вычислениях связаны с вашей сетью, в зависимости от вашего оборудования.

Я провел следующий эксперимент:

Серверный компьютер 1: используйте hping3 для генерации SYN-пакетов со скоростью 28 870 в секунду (получено экспериментально и считается достаточно близким к тому, что вы делаете), чтобы порт 25565 на серверном компьютере 2. Используемая команда:

$ sudo /usr/sbin/hping3 -p 25565 --syn --interval u20 s19

Где «s19» - это серверный компьютер 2, а «u20» имеет накладные расходы и фактически дает 28 870 пакетов в секунду вместо 50 000.

Серверный компьютер 2: имеет одно правило DROP iptables. Turbostat также был запущен для наблюдения за мощностью и загрузкой процессора. Были выполнены следующие команды:

doug@s19:~/tmp$ sudo iptables -xvnL ; sleep 10 ; sudo iptables -xvnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
 2293479 91739160 DROP       tcp  --  br0    *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25565

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
 2582175 103287000 DROP       tcp  --  br0    *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25565

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Итак, 2582175 - 2293479 = 288 696 пакетов за 10 секунд или 28 870 в секунду. Примечание: у меня меньше байтов на пакет, чем у вас, на 40, тогда как у вас, похоже, 60.

$ sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt,CorWatt --interval 6
Busy%   Bzy_MHz IRQ     PkgTmp  PkgWatt CorWatt GFXWatt RAMWatt
0.61    4800    196262  38      17.91   17.25   0.00    0.89
0.61    4800    196844  38      17.95   17.29   0.00    0.89
0.60    4800    197409  39      18.01   17.35   0.00    0.89

Незначительная загрузка ЦП, но используется примерно на 16 Вт больше, чем в режиме ожидания (в режиме ожидания = 1,5 Вт).

Настольный компьютер 1: Виртуальная машина qemu / kvm 20.04, работающая в качестве гостя на серверном компьютере 2.

Команда hping3 серверного компьютера 1 принимает следующий вид:

$ sudo /usr/sbin/hping3 -p 25565 --syn --interval u20 192.168.111.19

И результат:

doug@desk-ff:~$ sudo iptables -xvnL ; sleep 100 ; sudo iptables -xvnL
Chain INPUT (policy ACCEPT 117 packets, 9384 bytes)
    pkts      bytes target     prot opt in     out     source               destination
 2086906 83476240 DROP       tcp  --  enp1s0 *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25565

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 73 packets, 9116 bytes)
    pkts      bytes target     prot opt in     out     source               destination
Chain INPUT (policy ACCEPT 144 packets, 12151 bytes)
    pkts      bytes target     prot opt in     out     source               destination
 4970267 198810680 DROP       tcp  --  enp1s0 *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:25565

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 77 packets, 9996 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Итак, 4970267 - 2086906 = 288 361 пакет за 100 секунд или 28 834 в секунду.

и на главном компьютере:

$ sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,RAMWatt,GFXWatt,CorWatt --interval 6
Busy%   Bzy_MHz IRQ     PkgTmp  PkgWatt CorWatt GFXWatt RAMWatt
9.61    4800    207685  58      31.19   30.53   0.00    0.89
9.64    4800    211088  58      31.14   30.48   0.00    0.89
9.44    4800    202499  59      30.72   30.07   0.00    0.89

У меня 12 ЦП, поэтому загрузка превышает 100% от 1 ЦП. Или через top:

top - 11:58:16 up 10 days, 18:57,  2 users,  load average: 1.00, 0.99, 0.81
Tasks: 239 total,   1 running, 238 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu8  :  0.0 us,  0.0 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  1.7 si,  0.0 st
%Cpu9  :  0.0 us,  3.1 sy,  0.0 ni, 95.6 id,  0.0 wa,  0.0 hi,  1.4 si,  0.0 st
%Cpu10 :  8.3 us, 90.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  1.3 si,  0.0 st
%Cpu11 :  0.0 us,  0.0 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  1.7 si,  0.0 st

Итак, да, то, что вы делаете это на виртуальной машине, похоже, потребляет намного больше ресурсов ЦП. Один из вариантов - не делать этого на виртуальной машине. Или назначьте виртуальной машине больше виртуальных ЦП.Мне удалось достичь 118 283 пакетов в секунду (параметр интервала «u1» hping3), при этом общая загрузка ЦП на хосте увеличилась всего на пару процентов.

РЕДАКТИРОВАТЬ: Использование хост-процессора в сравнении с количеством пакетов в секунду для виртуальной машины довольно интересно с ответом типа ступенчатой ​​функции от 5000 до 6000 пакетов в секунду (напомним, что 8,33% - это 100% от 1 ЦП для этого хоста с 12 ЦП):

enter image description here

2
ответ дан 4 September 2021 в 09:28

Другие вопросы по тегам:

Похожие вопросы: