LINUX.ORG.RU
решено ФорумAdmin

раскидать прерывания по процессорам


1

1

Есть обычный сервер centos6 с nginx, принимает некоторое большое количество соединений в единицу времени. Проблема состоит в том, что, как показывает htop, один процессор из 4х забит под завязку softirq. остальные простаивают. При попытке назначить обработку прерываний одной сетевой карты нескольким процессорам

echo '03' > /proc/irq/20/smp_affinity
используется только один. Тут советуют обновить ядро до 2.6.24.3 из-за проблем с CONFIG_HOTPLUG_CPU, но у меня и так 2.6.32. Там же говорится про

APIC works in physical “destination mode” and low priority “delivery mode”.

где и как это можно посмотреть и переключить в low priority ?


Ответ на: комментарий от Pinkbyte
[root@balancer-38 ~]# cd /proc/irq/32
[root@balancer-38 32]# cat ./smp_affinity
f

в таком режиме используется CPU3

[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3
  32:     844362      23301   19240922   21022073   IO-APIC-fasteoi   eth0

[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3
  32:     844362      23301   19240922   21214395   IO-APIC-fasteoi   eth0

делаю как в примере

[root@balancer-38 32]# echo 0f > smp_affinity
[root@balancer-38 32]# cat smp_affinity
f

ничего не поменялось, продолжает приходить на CPU3

[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3
  32:     844362      23301   19240922   22354468   IO-APIC-fasteoi   eth0

что бы я ни отправил в smp_affinity, используется только один CPU. я могу переключать обработку прерываний между ними - поставить CPU0 или CPU1 вместо CPU3 например, но не могу сделать, чтобы они получали прерывания одновременно.

этот параметр тоже упоминался в примерах - выглядит вот так

[root@balancer-38 32]# cat /proc/irq/default_smp_affinity
f

fjoe
() автор топика
Ответ на: комментарий от GotF

судя по его конфигу он делает то же самое, что я с smp_affinity, только в автоматическом режиме. если невозможно раскидать прерывания с одной сетевой карты на много cpu, он будет просто переносить 100% загрузки от подного процессора к другому и глобально ничего не изменится. или у него какой-то другой принцип работы и всё не так понял?

fjoe
() автор топика
Ответ на: комментарий от ssbury

да, это работает. но теперь я всё нагрузку направил на CPU1

[root@balancer-38 32]# echo '2' > smp_affinity
[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3       
  32:     860305     169956   19284547   28538337   IO-APIC-fasteoi   eth0
[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3       
  32:     860305     176768   19284547   28538337   IO-APIC-fasteoi   eth0
остальные бездействуют

fjoe
() автор топика
Ответ на: комментарий от fjoe

рискну предположить, что инженегры, делавшие сетевуху, рассчитывали, что в её физические порты будет ломиться только 1(один прописью) процессор.

ckotinko ☆☆☆
()
Ответ на: комментарий от cyclon

How about writing “3″ into the file. In theory, this should cause APIC to divert interrupts to CPU0 and CPU1.

маска бинарная 0011 использовать первые 2 процессора. от

[root@balancer-38 32]# echo '3' > smp_affinity
(без 0) эффект тот же.

fjoe
() автор топика
Ответ на: комментарий от ckotinko

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

fjoe
() автор топика
Ответ на: комментарий от GotF

Выключил, включил обратно. никакого эффекта.

fjoe
() автор топика

Чтобы сетевуха могла распределять нагрузку по процессорам, она должна иметь очереди, к примеру так:

 185:          8          0          0          0          0          0    5807445          0          0          0          0          0   PCI-MSI-edge      card2_p1-TxRx-0
 186:          7          0          0          0          0          0          0    6499846          0          0          0          0   PCI-MSI-edge      card2_p1-TxRx-1
 187:          7          0          0          0          0          0          0          0    5480166          0          0          0   PCI-MSI-edge      card2_p1-TxRx-2
 188:          7          0          0          0          0          0          0          0          0    5288493          0          0   PCI-MSI-edge      card2_p1-TxRx-3
 189:          7          0          0          0          0          0          0          0          0          0    5180689          0   PCI-MSI-edge      card2_p1-TxRx-4
 190:          7          0          0          0          0          0          0          0          0          0          0    5324049   PCI-MSI-edge      card2_p1-TxRx-5
 191:          7          0          0          0          0          0    9834903          0          0          0          0          0   PCI-MSI-edge      card2_p1-TxRx-6
 192:          7          0          0          0          0          0          0   12384785          0          0          0          0   PCI-MSI-edge      card2_p1-TxRx-7
 193:          7          0          0          0          0          0          0          0   11531528          0          0          0   PCI-MSI-edge      card2_p1-TxRx-8
 194:          7          0          0          0          0          0          0          0          0   11251271          0          0   PCI-MSI-edge      card2_p1-TxRx-9
 195:          7          0          0          0          0          0          0          0          0          0   11171030          0   PCI-MSI-edge      card2_p1-TxRx-10
 196:          7          0          0          0          0          0          0          0          0          0          0   10775056   PCI-MSI-edge      card2_p1-TxRx-11
 197:          1          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      card2_p1:lsc
Как видно - у каждой очереди свой IRQ, который привязан к своему ядру... Так умеют как минимум интелы гигабит 82576/82580, и 10гбит 82599/82598

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

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


[root@x-1-44 97]# cat /proc/interrupts | grep 'CPU\|97:'
            CPU0       CPU1       CPU2       CPU3       
  97: 4250157685 4254852119 4251615794 4254995427   PCI-MSI-edge      eth0

[root@x-1-44 97]# cat /proc/interrupts | grep 'CPU\|97:'
            CPU0       CPU1       CPU2       CPU3       
  97: 4250163377 4254857813 4251621488 4255001121   PCI-MSI-edge      eth0

fjoe
() автор топика
Ответ на: комментарий от ssbury

опять CPU1

[root@balancer-38 32]# echo '7' > smp_affinity
[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3       
  32:     860305   38949908   19329056   28538337   IO-APIC-fasteoi   eth0
[root@balancer-38 32]# cat /proc/interrupts | grep 'CPU\|32:'
            CPU0       CPU1       CPU2       CPU3       
  32:     860305   38972136   19329056   28538337   IO-APIC-fasteoi   eth0

fjoe
() автор топика
Ответ на: комментарий от Pinkbyte

отказывается понимать.

[root@balancer-38 32]# echo 0xffff > smp_affinity
-bash: echo: write error: Invalid argument

[root@balancer-38 32]# echo '0xffff' > smp_affinity
-bash: echo: write error: Invalid argument

fjoe
() автор топика
Ответ на: комментарий от fjoe

Это не распределение в чистом виде, в данном случае миграция прерываний по ядрам даже может мешать. Возможно это зависит от того, на чём висит девайс и от его драйвера.

blind_oracle ★★★★★
()
Ответ на: комментарий от fjoe

да, тут я ступил - это пример для большего числа процессоров/ядер
ну, значит драйвер не поддерживает. на другом сервере(где все работает) такая же сетевуха или другая?

Pinkbyte ★★★★★
()
Ответ на: комментарий от blind_oracle

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

fjoe
() автор топика
Ответ на: комментарий от blind_oracle

от миграции как правило страдает отзывчивость приложений(latency), а пропускная способность(throughput) наоборот будет выше

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

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

fjoe
() автор топика
Ответ на: комментарий от fjoe

Вот MSI вполне возможно и приносит щастье. Хотя вот у меня пролиант дл380 стоит, на котором и APIC по ядрам раскидывается:

 18:       1043       1040       1059       1052   IO-APIC-fasteoi   uhci_hcd:usb4
В твоем случае я думаю проще купить за несколько тыщ 2-4 портовую сетевуху интель с очередями.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

вот и я говорю, что может ровно раскидывать даже без MSI, а что где надо включить - не могу найти.

fjoe
() автор топика
Ответ на: комментарий от fjoe

ну вообще-то аппаратно любая карточка поддерживает доступ с одного процессора в один момент. у нее внутри нет потоков, понятненько?

что толку от разбрасывания irq?

ckotinko ☆☆☆
()

В вашей карточке раскидать прерывания вряд ли получится, тк нет msi, да и это собственно прироста не даст - только деградацию из-за непопаданий в кеш. Однако можете попробовать 35 ядро и RPS - то есть разбросать softirq. А для облегчения жизни с hirq можно драйвер с NAPI собрать, если ваша сетевка умеет.

ventilator ★★★
()
Ответ на: комментарий от ventilator

RPS присутствует:

[root@balancer-38 ]# cat /sys/class/net/eth0/queues/rx-0/rps_cpus 
0
и драйвер с NAPI
[root@balancer-38 ~]# modinfo e1000 | grep NAPI
version:        7.3.21-k6-1-NAPI

всё бы хорошо, но при установке маски в rps_cpus

[root@balancer-38 ]# echo 3 > /sys/class/net/eth0/queues/rx-0/rps_cpus 
я опять получаю переключение между CPU вместо равномерного распределения. хотя, тут я вижу, что hirq работают на одном процессоре, а softirq нагружают уже совсем другой. получается, только с 2.6.35 можно задать в rps несколько CPU сразу?

fjoe
() автор топика
Ответ на: комментарий от fjoe

У меня как то вообще не было /sys/class/net/eth0/queues/rx-0/rps_cpus в ядрах до 35. Какое точно у вас ядро? От чего больше нагрузка, от hirq или sirq?

ventilator ★★★
()
Ответ на: комментарий от ventilator

Mожно еще попробовать rfs, у вас не транзитный трафик и это может помочь, если дело в sirq Попробуйте в /sys/class/net/eth0/queues/rx-0/rps_flow_cnt и /proc/sys/net/core/rps_sock_flow_entries записать максимальное количество открытых у вас сокетов. Никаких правил в иптейблс нет?

ventilator ★★★
()
Ответ на: комментарий от ventilator

ядро

[root@balancer-38 ~]# uname -r
2.6.32-71.29.1.el6.x86_64
нагружает больше всего именно softirq, обычное hirq я почти не вижу. просто до издевательств над rps_cpus, softirq висело на тех же CPU, что и hirq. замеры трафика
Total rates:      27551.3 kbits/sec
                  18122.2 packets/sec

Incoming rates:   13983.6 kbits/sec
                   9157.4 packets/sec

Outgoing rates:   13567.7 kbits/sec
                   8964.8 packets/sec

открытых сокетов у меня немного - nginx отрабатывает достаточно быстро, поэтому параллельных соединений к нему не больше сотни.но я на всякий случай поставил побольше - эффекта пока не заметил. в iptables есть десяток правил - разрешенные IP для доступа на ssh. но service iptables stop опять же ни на что не влияет.

слегка погуглив нашел /proc/softirqs. когда изменяю rps_cpus, вижу в NET_RX который из CPU работает с прерываниями, но, опять же, только один.

fjoe
() автор топика
Ответ на: комментарий от fjoe

Это какие то детские цифры, как для четырехядерного процессора. Какой процессор, какой clocksource. Conntrack спользуется в правилах иптейблс? Если да то покажите:

net.netfilter.nf_conntrack_max                                                                                  
net.netfilter.nf_conntrack_count                                                                                    
net.netfilter.nf_conntrack_buckets
Попробуйте вообще выгрузить все модули ядра связанные с netfilter, чтобы трекинг соединений тоже отключился. Неплохо также собрать perf (tools/perf в дереве исходников ядра) и посмотреть чего так много sirq.

ventilator ★★★
()
Ответ на: комментарий от ventilator

процессор(ы)

root@balancer-38 ~]# cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 15
model		: 4
model name	: Intel(R) Xeon(TM) CPU 3.00GHz
stepping	: 3
cpu MHz		: 3000.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 5
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc pebs bts pni dtes64 monitor ds_cpl cid cx16 xtpr
bogomips	: 6000.09
clflush size	: 64
cache_alignment	: 128
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 15
model		: 4
model name	: Intel(R) Xeon(TM) CPU 3.00GHz
stepping	: 3
cpu MHz		: 3000.000
cache size	: 2048 KB
physical id	: 3
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 6
initial apicid	: 6
fpu		: yes
fpu_exception	: yes
cpuid level	: 5
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc pebs bts pni dtes64 monitor ds_cpl cid cx16 xtpr
bogomips	: 6000.12
clflush size	: 64
cache_alignment	: 128
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 2
vendor_id	: GenuineIntel
cpu family	: 15
model		: 4
model name	: Intel(R) Xeon(TM) CPU 3.00GHz
stepping	: 3
cpu MHz		: 3000.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 5
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc pebs bts pni dtes64 monitor ds_cpl cid cx16 xtpr
bogomips	: 6000.12
clflush size	: 64
cache_alignment	: 128
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 3
vendor_id	: GenuineIntel
cpu family	: 15
model		: 4
model name	: Intel(R) Xeon(TM) CPU 3.00GHz
stepping	: 3
cpu MHz		: 3000.000
cache size	: 2048 KB
physical id	: 3
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 7
initial apicid	: 7
fpu		: yes
fpu_exception	: yes
cpuid level	: 5
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc pebs bts pni dtes64 monitor ds_cpl cid cx16 xtpr
bogomips	: 6000.17
clflush size	: 64
cache_alignment	: 128
address sizes	: 36 bits physical, 48 bits virtual
power management:

clocksource (если правильно нагуглил)

[root@balancer-38 ~]# cat /sys/devices/system/clocksource/clocksource0/available_clocksource 
tsc hpet acpi_pm 
[root@balancer-38 ~]# cat /sys/devices/system/clocksource/clocksource0/current_clocksource 
tsc

conntrack не используется

[root@balancer-38 ~]# lsmod | grep conntrack
[root@balancer-38 ~]#

еще cделал так:

root@balancer-38 ~]# service iptables stop; service ip6tables stop;
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
ip6tables: Flushing firewall rules:                        [  OK  ]
ip6tables: Setting chains to policy ACCEPT: filter         [  OK  ]
ip6tables: Unloading modules:                              [  OK  ]
[root@balancer-38 ~]# 
нагрузка не изменилась

perf нашелся готовым пакетом - буду смотреть что в нем и куда.

fjoe
() автор топика
Ответ на: комментарий от fjoe

В softirq обычно iptables/NAT/юзерлевел туннели (VPN как пример)/FUSE ФС.

RPS/RFS действительно работает, и весьма неплохо. Правда у меня эдак 33% si оставалось на одном ядре, а остальное - разносилось по указанным ядрам. Но скорее всего это от драйвера зависит.

В качестве мониторинга - рекомендую oprofile. Заметно информативнее, чем perf. Ну и debuginfo ядра ему ессно надобно.

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

юзерлевел В softirq обычно iptables/NAT/юзерлевел туннели (VPN как пример)/FUSE ФС.

благодаря этому было нейдено неожиданное решение. nginx это тоже юзерлевел. потому я просто раскидал tasksetом его workerы по менее загруженным процессорам вот так:

[root@balancer-38 ~]# taskset -pc 0,1 22342
pid 22342's current affinity list: 0-3
pid 22342's new affinity list: 0,1
[root@balancer-38 ~]# taskset -pc 0,1 22343
pid 22343's current affinity list: 0-3
pid 22343's new affinity list: 0,1

и он забрал часть softirq с собой.

hirq на cpu2

echo 4 > /proc/irq/32/smp_affinity;

softirq драйвера сетевухи на cpu3

echo 8 > /sys/class/net/eth0/queues/rx-0/rps_cpus;

получилось достаточно ровно. вот результат

Решено.

Спасибо всем кто помогал.

fjoe
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.