LINUX.ORG.RU

Linux Большой softirq при приличной сетевой нагрузке.


0

0

Предистория такая - захотелось потестировать nginx а заодно попытаться получьше понять как работает система с ним и где какие узкие места.
Есть машина с http_load которая очень часто дергает страничку на host:nginx и может нагружать его по самое то что нужно. Во время нагрузки на host:nginx такая картина: # mpstat -P ALL 1
19:10:19 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
19:10:20 all 8,25 0,00 9,75 0,00 1,00 14,00 0,00 67,00 17301,98
19:10:20 0 0,99 0,00 0,99 0,00 0,00 0,00 0,00 98,02 991,09
19:10:20 1 0,99 0,00 0,99 0,00 0,00 0,99 0,00 97,03 0,00
19:10:20 2 18,81 0,00 23,76 0,00 0,00 1,98 0,00 54,46 0,00
19:10:20 3 12,87 0,00 13,86 0,00 3,96 51,49 0,00 17,82 16312,87

# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 1992370 0 0 0 IO-APIC-edge timer
1: 2 0 0 0 IO-APIC-edge i8042
6: 3 0 0 0 IO-APIC-edge floppy
8: 1 0 0 0 IO-APIC-edge rtc
9: 0 0 0 0 IO-APIC-level acpi
14: 3077 466 2482 94 IO-APIC-edge ide0
169: 0 0 0 0 IO-APIC-level uhci_hcd:usb3
177: 0 0 0 0 IO-APIC-level uhci_hcd:usb1
185: 0 0 0 0 IO-APIC-level uhci_hcd:usb2
193: 22 131508 0 1893886 IO-APIC-level eth0
NMI: 0 0 0 0
LOC: 1991855 1991854 1991853 1991852
ERR: 0
MIS: 0

#bwm-ng
bwm-ng v0.5 (probing every 0.500s), press 'h' for help
input: /proc/net/dev type: avg (30s)
\ iface Rx Tx Total
===========================================================================
lo: 0.00 P/s 0.00 P/s 0.00 P/s
eth0: 72182.23 P/s 71727.73 P/s 143909.97 P/s
---------------------------------------------------------------------------
total: 72182.23 P/s 71727.73 P/s 143909.97 P/s

# top
top - 19:13:54 up 35 min, 1 user, load average: 1.59, 0.98, 0.42
Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie
Cpu0 : 8.6%us, 11.0%sy, 0.0%ni, 77.1%id, 0.0%wa, 0.0%hi, 3.3%si, 0.0%st
Cpu1 : 7.6%us, 10.0%sy, 0.0%ni, 80.4%id, 0.0%wa, 0.0%hi, 2.0%si, 0.0%st
Cpu2 : 12.4%us, 15.1%sy, 0.0%ni, 71.6%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st
Cpu3 : 9.0%us, 10.3%sy, 0.0%ni, 24.3%id, 0.0%wa, 3.7%hi, 52.7%si, 0.0%st
Mem: 6235512k total, 702180k used, 5533332k free, 8272k buffers
Swap: 104312k total, 0k used, 104312k free, 655392k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1708 root 16 0 8052 3944 560 R 66 0.1 1:05.76 nginx
1705 root 16 0 8052 3944 560 S 17 0.1 1:05.75 nginx
1706 root 16 0 8052 3944 560 S 17 0.1 0:56.01 nginx
170 root 15 0 0 0 0 S 0 0.0 0:00.76 pdflush
398 root 10 -5 0 0 0 S 0 0.0 0:02.44 md0_raid1

Не знаю уместно ли но еще есть strace на 1 из дочерних процесов nginx'а:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
23.52 0.139426 0 297574 write
21.35 0.126514 0 297583 close
14.08 0.083476 0 297573 writev
11.79 0.069878 0 297575 accept
8.16 0.048345 0 297573 recv
7.01 0.041553 0 297805 epoll_wait
6.17 0.036566 0 298013 epoll_ctl
4.37 0.025907 0 297805 gettimeofday
3.55 0.021044 0 297575 ioctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.592709 2679076 total
Если убрать логирование - write() пропадает и обрабатывается на ~25% больше запросов.

На нагрузочной машине показывает ~15085.8 fetches/sec

На nginx 2.6.18-53.1.19.el5_PAE ядро. 2x"Intel(R) Xeon(TM) CPU 3.06GHz", Intel e1000-NAPI По мониторингу я так понимаю что очередь пакетов разбарается 1 процессором(softriq) что наверно не очень хорошо, но c другой стороны на этом процессоре еще %idle 17,82 получается, и возмножно затык не в этом. А если все же там то хочется понять как разнести разбор очереди по разным процессорам, если такое возможно. В общем складывается такое впечатление что можно что-то поднакрутить, без жеских патчей в ядре.

P.S. Так как серьезных знаний по ядру нет, прошу сильно не бить :-)
P.P.S.Еще заметил на 2.6.25 ядре обрабатывается в 2 раза меньше запросов.

> А если все же там то хочется понять как разнести разбор очереди по 
> разным процессорам

это происходит автоматически

> 193: 22 131508 0 1893886 IO-APIC-level eth0 

все CPU задействованы в большей или меньшей степени

rei3er
()

> По мониторингу я так понимаю что очередь пакетов разбарается 1 процессором(softriq) что наверно не очень хорошо, но c другой стороны на этом процессоре еще %idle 17,82 получается, и возмножно затык не в этом. А если все же там то хочется понять как разнести разбор очереди по разным процессорам, если такое возможно. В общем складывается такое впечатление что можно что-то поднакрутить, без жеских патчей в ядре.

Неправильно. Обработчик irq при определённых обстоятельствах может мигрировать с cpu на cpu, но выполняться параллельно на нескольких - никогда.

Обработка прерываний - довольно дорогостоящая операция, поэтому во freebsd (по-моему) можно включить режим программного poll'инга, что снижает нагрузку на проц.

mv ★★★★★
()

> На нагрузочной машине показывает ~15085.8 fetches/sec > На nginx 2.6.18-53.1.19.el5_PAE ядро. 2x"Intel(R) Xeon(TM) CPU 3.06GHz", Intel e1000-NAPI > P.P.S.Еще заметил на 2.6.25 ядре обрабатывается в 2 раза меньше запросов.

Последние ванильные ядра вообще опасно ставить на сервера, куча регрессий. Вместо этого лучше обновись до 5.2 (5.1.z всё равно после выхода 5.2 закрыли), там для e1000 много обновлений из апстрима. И поставь 64-битную систему, оно работает, в целом, шустрее 32-битной за счёт дополнительных регистров, адресации относительно RIP, более быстрого call'а и много чего ещё. Плюс расширение PAE хоть и даёт адресовать больше памяти, но существенно замедляет работу с ней из-за переключения банков.

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

> И поставь 64-битную систему, оно работает, в целом, шустрее 32-битной Я бы рад поставить, но есть еще самописный софт который там не работает. > Плюс расширение PAE хоть и даёт адресовать больше памяти, но существенно замедляет работу с ней из-за переключения банков. Точно не знаю как происходит переключение банков но на первый взгляд памяти занато немного.

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

> это происходит автоматически Или как в моем случае не происходит? :-) Как уже выше говорил система без диска может работать быстрее - это скоорее всего говорит что в железе _нет_ узких мест, и автоматика получается работает неочень, в моем случае.

> все CPU задействованы в большей или меньшей степени Если смотреть чем нибуть наподобе watch -n 1 'cat /proc/interrupts' то видно что тикает только один процессор по сетке.

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

> Если смотреть чем нибуть наподобе watch -n 1 'cat /proc/interrupts' то > видно что тикает только один процессор.

снимок /proc/interrupts утверждает, что 3 ;)

rei3er
()
Ответ на: комментарий от calculator

осуществить равномерную диспетчеризацию прерываний на все CPU невозможно (т. к состояние IF для конкретного CPU недетерминировано)

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

Там еще тасклеты есть которые вроде как на нескольких процессорах одновременно работать могут. Хотя пишут что на нагрузках лучьше использовать _простые_ softirq.

>Значение TASKLET_STATE_SCHED указывает на то, что тасклет запланирован >на выполнение, а значение TASLET_STATE_RUN — что тасклет выполняется. >Для оптимизации значение TASLET_STATE RUN может использоваться только >на многопроцессорной машине, так как на однопроцессорной машине и без >этого точно известно, выполняется ли тасклет (действительно, ведь код, >который выполняется, либо принадлежит тасклету, либо нет).

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

> которые вроде как на нескольких процессорах одновременно работать 
> могут

экземпляр тасклета не может выполняться параллельно на более чем одном CPU

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

> Два различных тасклета могут выполняться параллельно на разных процессорах, но при этом два тасклета одного типа не могут выполняться одновременно.

Эхх, а как бы было хорошо... :-) Спасибо всем кто откликнулся!

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

Можно наверно немного прибавить производительности оставив taskset'ом загруженный процессор _только_ на обработку этой задачи. Но выигрыш там не очень большой похоже будет.

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

а чтой-то у тебя nginx от рута работает? И скока чайлдов ты поставил? Надо не менее чем по одному на проц и потом увеличивать пока не получится пик быстродействия.

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