При большом количестве 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, решили эту проблему, но у многих других это случается. Какие у меня варианты?
С уважением
Я не думаю, что ваша проблема в ядре, и я не думаю, что ваши узкие места в вычислениях связаны с вашей сетью, в зависимости от вашего оборудования.
Я провел следующий эксперимент:
Серверный компьютер 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 ЦП):