Вопрос или проблема
Я провожу тест производительности HTTP на своей виртуальной машине с CentOS7 (4 ядра, 2 ГБ). Я использую wrk
для генерации HTTP-трафика на этой виртуальной машине.
Во время теста я обнаружил, что софтовые прерывания сосредоточены на одном ядре, поэтому я попытался включить RPS и RFS, чтобы сбалансировать загрузку софтовых прерываний. Но top
показывает, что это не работает:
[root@centos7 ~]# top
top - 16:15:38 up 6:28, 3 users, load average: 1.78, 1.95, 1.86
Tasks: 119 total, 3 running, 116 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 3.0 sy, 0.0 ni, 3.0 id, 0.0 wa, 0.0 hi, 93.9 si, 0.0 st
%Cpu1 : 0.0 us, 12.9 sy, 0.0 ni, 74.2 id, 0.0 wa, 0.0 hi, 12.9 si, 0.0 st
%Cpu2 : 3.1 us, 15.6 sy, 0.0 ni, 68.8 id, 0.0 wa, 0.0 hi, 12.5 si, 0.0 st
%Cpu3 : 0.0 us, 13.3 sy, 0.0 ni, 73.3 id, 0.0 wa, 0.0 hi, 13.3 si, 0.0 st
KiB Mem : 1863028 total, 1168228 free, 206960 used, 487840 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1460180 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7535 root 20 0 953652 6320 1260 S 167.6 0.3 0:07.27 wrk
6 root 20 0 0 0 0 S 24.3 0.0 47:02.31 ksoftirqd/0
14 root 20 0 0 0 0 S 2.7 0.0 3:27.85 ksoftirqd/1
19 root 20 0 0 0 0 S 2.7 0.0 3:31.53 ksoftirqd/2
24 root 20 0 0 0 0 S 2.7 0.0 3:25.61 ksoftirqd/3
Настройка RPS & RFS:
[root@centos7 ~]# cat /sys/class/net/ens33/queues/rx-0/rps_cpus
00000000,00000000,00000000,0000000f
[root@centos7 ~]#
[root@centos7 ~]# cat /proc/sys/net/core/rps_sock_flow_entries
32768
[root@centos7 ~]# cat /sys/class/net/ens33/queues/rx-0/rps_flow_cnt
32768
Интерфейс этой виртуальной машины – 1 канал:
[root@centos7 ~]# ls /sys/class/net/ens33/queues/
rx-0 tx-0
/proc/softirqs & /proc/interrupts:
[root@centos7 ~]# cat /proc/softirqs | cut -c 1-64
CPU0 CPU1 CPU2 CPU3
HI: 0 0 1 0
TIMER: 749756 203643 205166 221818
NET_TX: 5219 119335 117627 119905
NET_RX: 13242396 4500180 4501054 4515730
BLOCK: 4490 0 678 0
BLOCK_IOPOLL: 0 0 0 0
TASKLET: 23 0 56 0
SCHED: 271772 210391 111599 96429
HRTIMER: 0 0 0 0
RCU: 59909 41100 41668 47634
[root@centos7 ~]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 34 0 0 0 IO-APIC-edge timer
1: 10 0 0 0 IO-APIC-edge i8042
8: 1 0 0 0 IO-APIC-edge rtc0
9: 0 0 0 0 IO-APIC-fasteoi acpi
12: 16 0 0 0 IO-APIC-edge i8042
14: 0 0 0 0 IO-APIC-edge ata_piix
15: 1171 0 0 0 IO-APIC-edge ata_piix
16: 64 0 0 2481 IO-APIC-fasteoi vmwgfx, snd_ens1371
17: 4073 0 696 0 IO-APIC-fasteoi ehci_hcd:usb1, ioc0
18: 64 0 0 0 IO-APIC-fasteoi uhci_hcd:usb2
19: 11305951 0 0 0 IO-APIC-fasteoi ens33
24: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
25: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
26: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
27: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
28: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
29: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
30: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
31: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
32: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
33: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
34: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
35: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
36: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
37: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
38: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
39: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
40: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
41: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
42: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
43: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
44: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
45: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
46: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
47: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
48: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
49: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
50: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
51: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
52: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
53: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
54: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
55: 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
56: 0 0 0 0 PCI-MSI-edge vmw_vmci
57: 0 0 0 0 PCI-MSI-edge vmw_vmci
NMI: 54 25 25 25 Не маскируемые прерывания
LOC: 832729 237880 239757 255931 Локальные прерывания таймера
SPU: 0 0 0 0 Ложные прерывания
PMI: 54 25 25 25 Прерывания мониторинга производительности
IWI: 2924 2183 2153 5062 Прерывания работы IRQ
RTR: 0 0 0 0 Повторные попытки чтения APIC ICR
RES: 719727 3598567 3442168 3421581 Прерывания переназначения задач
CAL: 4890 4966191 4968070 4983825 Прерывания вызова функций
TLB: 368 371 365 315 Перезаписи TLB
TRM: 0 0 0 0 Прерывания событий перегрева
THR: 0 0 0 0 Пороговые прерывания APIC
DFR: 0 0 0 0 Отложенные прерывания APIC
MCE: 0 0 0 0 Исключения контроля машины
MCP: 4 4 4 4 Kontroli mccheques
ERR: 0
MIS: 0
PIN: 0 0 0 0 События уведомлений о постинг-перерыве
NPI: 0 0 0 0 События вложенных постинг-перерывов
PIW: 0 0 0 0 События пробуждения постинг-перерыва
HTTP трафик:
HTTP-трафик просто запрашивает 64KB HTML с 10 потоками и 100 соединениями с поддержкой keep-alive.
[root@centos7 ~]# sar -n DEV 2 2
Linux 3.10.0-1160.el7.x86_64 (centos7) 01/17/2025 _x86_64_ (4 CPU)
04:28:00 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
04:28:02 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:28:02 PM ens33 359934.00 26815.00 520809.18 1884.65 0.00 0.00 0.00
04:28:02 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
04:28:04 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:28:04 PM ens33 365623.00 27299.50 528957.58 1917.63 0.00 0.00 0.00
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: ens33 362778.50 27057.25 524883.38 1901.14 0.00 0.00 0.00
Дополнительная информация:
- Сначала сервис irqbalance был включен, но не помог, поэтому я его остановил вначале.
- Гипервизор – VMWare Workstation 17.5.0 на Windows 12
- Процессор: AMD Ryzen 5 7640H с графикой Radeon(TM) 760M
- Запускаю сервис nginx на этой виртуальной машине и принимаю нагрузку
wrk
от другой виртуальной машины, я вижу, что софт-прерывания распределяются на все 4 ядра. Но при отправке HTTP-трафика с этой ВМ софт-прерывания концентрируются на одном ядре.
Я хочу разрешить узкое место, вызванное софт-прерываниями, чтобы wrk
мог использовать производительность всех четырех ядер. Что мне делать?
Ответ или решение
Для решения проблемы концентрации софт-прерываний на одном ядре в виртуальной машине CentOS 7, несмотря на активированные механизмы RPS (Receive Packet Steering) и RFS (Receive Flow Steering), необходимо внимательно разобрать и проанализировать настройки и конфигурацию системы. Давайте рассмотрим теоретическую основу, приведем примеры и обсудим применение для вашего конкретного случая.
Теория
Софт-прерывания и их распределение:
Софт-прерывания (softirqs) — это механизм в Linux для обработки различных задач, связанных с сетью, планированием и другими событиями. Эти прерывания зачастую обрабатываются на том же ядре, где произошли, что может привести к неравномерному распределению нагрузки.
RPS и RFS:
-
RPS (Receive Packet Steering): Позволяет распределять обработку входящих пакетов по различным ядрам процессора. Настраивается через файл
/sys/class/net/<интерфейс>/queues/rx-<номер очереди>/rps_cpus
. -
RFS (Receive Flow Steering): Дополняет RPS, обеспечивая привязку потока к конкретному ядру на основе сокетов, что улучшает кеширование и производительность.
Примеры
На примере, представленном из вашей конфигурации, видим следующее:
-
Настройка RPS и RFS:
cat /sys/class/net/ens33/queues/rx-0/rps_cpus 00000000,00000000,00000000,0000000f cat /proc/sys/net/core/rps_sock_flow_entries 32768 cat /sys/class/net/ens33/queues/rx-0/rps_flow_cnt 32768
Эти настройки указывают на включение RPS с распределением нагрузки на все доступные ядра (0-3).
-
Вывод команды
top
:
Видно, что софт-прерывания сильно концентрируются на CPU0, несмотря на настройки RPS и RFS.
Применение
-
Проверка корректности настроек и их применения:
-
Перезапуск сетевого интерфейса: После изменения настроек RPS и RFS, требуется убедиться, что они применены корректно, например, с помощью перезапуска интерфейса:
sudo ifdown ens33 && sudo ifup ens33
-
Проверка на наличие очередей: Убедитесь, что оборудование поддерживает многопоточные операции и правильно настроены очереди приема и передачи пакетов.
-
-
Включение и настройка irqbalance:
RPS и RFS помогают распределять обработку пакетов, но они не воздействуют напрямую на сами IRQ (аппаратные прерывания). По этому irqbalance может обеспечить лучшее распределение аппаратной составляющей.
-
Обновление и исправление гипервизора:
Так как ваша система виртуализирована с помощью VMware, возможны проблемы, связанные с версией гипервизора или его настройками. Обновите гипервизор до последней версии и проверьте настройки распределения ресурсов.
-
Использование альтернативных методов:
Если стандартные методы не помогают, можно рассмотреть использование:
- Модулей типа
ethtool
для более низкоуровневого управления настройками сети. - Анализа и, возможно, изменения сетевых драйверов в системе.
- Модулей типа
-
Полный аудит всех сторонних сервисов и настроек ОС:
Проверьте, какие еще системные службы могут конкурировать за ресурсы и повлиять на распределение нагрузок. Особое внимание уделите настройкам
numa
и драйверам сетевой карты.
Подведем итоги, несмотря на правильно настроенные RPS и RFS, некоторые специфические особенности вашей виртуальной машины или сетевых настроек могут ограничивать их эффективную работу. Дополнительный анализ и ключевые корректировки позволят лучше распределить софт-прерывания между ядрами и повысить сетевую производительность.