Мягкие прерывания по-прежнему сосредоточены на одном ядре после включения RPS (Receive Packet Steering) и RFS (Receive Flow Steering).

Вопрос или проблема

Я провожу тест производительности 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

Дополнительная информация:

  1. Сначала сервис irqbalance был включен, но не помог, поэтому я его остановил вначале.
  2. Гипервизор – VMWare Workstation 17.5.0 на Windows 12
  3. Процессор: AMD Ryzen 5 7640H с графикой Radeon(TM) 760M
  4. Запускаю сервис 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, обеспечивая привязку потока к конкретному ядру на основе сокетов, что улучшает кеширование и производительность.

Примеры

На примере, представленном из вашей конфигурации, видим следующее:

  1. Настройка 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).

  2. Вывод команды top:
    Видно, что софт-прерывания сильно концентрируются на CPU0, несмотря на настройки RPS и RFS.

Применение

  1. Проверка корректности настроек и их применения:

    • Перезапуск сетевого интерфейса: После изменения настроек RPS и RFS, требуется убедиться, что они применены корректно, например, с помощью перезапуска интерфейса:

      sudo ifdown ens33 && sudo ifup ens33
    • Проверка на наличие очередей: Убедитесь, что оборудование поддерживает многопоточные операции и правильно настроены очереди приема и передачи пакетов.

  2. Включение и настройка irqbalance:

    RPS и RFS помогают распределять обработку пакетов, но они не воздействуют напрямую на сами IRQ (аппаратные прерывания). По этому irqbalance может обеспечить лучшее распределение аппаратной составляющей.

  3. Обновление и исправление гипервизора:

    Так как ваша система виртуализирована с помощью VMware, возможны проблемы, связанные с версией гипервизора или его настройками. Обновите гипервизор до последней версии и проверьте настройки распределения ресурсов.

  4. Использование альтернативных методов:

    Если стандартные методы не помогают, можно рассмотреть использование:

    • Модулей типа ethtool для более низкоуровневого управления настройками сети.
    • Анализа и, возможно, изменения сетевых драйверов в системе.
  5. Полный аудит всех сторонних сервисов и настроек ОС:

    Проверьте, какие еще системные службы могут конкурировать за ресурсы и повлиять на распределение нагрузок. Особое внимание уделите настройкам numa и драйверам сетевой карты.

Подведем итоги, несмотря на правильно настроенные RPS и RFS, некоторые специфические особенности вашей виртуальной машины или сетевых настроек могут ограничивать их эффективную работу. Дополнительный анализ и ключевые корректировки позволят лучше распределить софт-прерывания между ядрами и повысить сетевую производительность.

Оцените материал
Добавить комментарий

Капча загружается...