dadv: (Default)
[personal profile] dadv

Выяснилось, что при использовании многоядерных маршрутизаторов под FreeBSD 8 и новее и при использовании loader tunnable net.isr.bindthreads=0 потоки NETISR в некоторых случаях таки могут оказаться привязанными к определенным ядрам CPU из-за ошибки в ядре.

Проверить привязку можно командой:

procstat -at | awk '/swi1: netisr/ {print $5, $6; system("cpuset -g -t " $2);}'

Она должна вывести что-то вроде этого:

netisr 0
tid 100012 mask: 0, 1, 2, 3
netisr 3
tid 100111 mask: 0, 1, 2, 3
netisr 2
tid 100112 mask: 0, 1, 2, 3
netisr 1
tid 100113 mask: 0, 1, 2, 3

То есть, в каждой маске должны быть перечислены все процессорные ядра. В некоторых случаях они там будут не все и тогда будут проблемы с неравномерной загрузкой ядер работой. Исправить проблему с NETISR без перезагрузки можно командой:

procstat -at | awk '/swi1: netisr/ {print $2}' | xargs -n 1 cpuset -l all -t

Тут есть патч к ядру, исправляющий работу net.isr.bindthreads=0. В CURRENT также было внесено исправление для общей проблемы, оно тоже ложится на FreeBSD 8.

Date: 2014-11-18 07:03 (UTC)
From: [identity profile] dadv.livejournal.com
Правильно понял. Уходить нет необходимости.

Date: 2014-11-18 07:19 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
net.isr.bindthreads: 1 или 0 ?

в данный момент выставил в 0
создал 5 инстансов
ситуация не поменялась
# top -SH -n 100 | grep isr
12 root -72 - 0K 448K CPU4 4 60:48 92.97% intr{swi1: netisr 0}
12 root -72 - 0K 448K WAIT 6 0:00 0.00% intr{swi1: netisr 5}
12 root -72 - 0K 448K WAIT 5 0:00 0.00% intr{swi1: netisr 2}
12 root -72 - 0K 448K WAIT 2 0:00 0.00% intr{swi1: netisr 1}
12 root -72 - 0K 448K WAIT 7 0:00 0.00% intr{swi1: netisr 7}
12 root -72 - 0K 448K WAIT 7 0:00 0.00% intr{swi1: netisr 4}
12 root -72 - 0K 448K WAIT 1 0:00 0.00% intr{swi1: netisr 6}

:-(

Date: 2014-11-18 07:24 (UTC)
From: [identity profile] dadv.livejournal.com
Я ставлю net.isr.bindthreads=1, но это для стабильности.

Создать инстансы мало, нужно и входящий, и исходящий трафик аккуратно разруливать по ним, и приблизительно ровно.

Date: 2014-11-18 07:32 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
ровно конечно не трафик не делится, но точно, что делится....
таки остальные swi1: netisr остаются WAIT и не помогают....

Date: 2014-11-18 07:43 (UTC)
From: [identity profile] dadv.livejournal.com
А точно входящий трафик не направляется подряд во все инстансы? Нужно очень аккуратно расписать правила так, чтобы "ненужный" трафик даже не заходил в инстансы, а только тот, который конкретно этому инстансу нужен.

И что будет, если tee временно отключить? Оно тоже может тормозить.

Date: 2014-11-18 09:56 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
в фаерволе
/sbin/ipfw add 2601 nat 8674 ip from any to IP1
/sbin/ipfw add 2602 nat 8675 ip from any to IP2
/sbin/ipfw add 2603 nat 8676 ip from any to IP3
/sbin/ipfw add 2604 nat 8677 ip from any to IP4
/sbin/ipfw add 2605 nat 8678 ip from any to IP5

IP_N - не афиширую :-)

/sbin/ipfw add 2623 nat 8674 ip from 192.168.243.0/24 to any
/sbin/ipfw add 2624 nat 8675 ip from 192.168.242.0/24 to any
/sbin/ipfw add 2625 nat 8676 ip from 192.168.241.0/24 to any
/sbin/ipfw add 2626 nat 8677 ip from 192.168.240.0/24 to any
/sbin/ipfw add 2627 nat 8678 ip from 192.168.239.0/24 to any

# sysctl -a | grep one_pa
net.inet.ip.fw.one_pass: 0

ngtee временно отключал с помощью skipto - перескакивал через правила ngtee - не помогло
Edited Date: 2014-11-18 09:57 (UTC)

Date: 2014-11-18 10:03 (UTC)
From: [identity profile] dadv.livejournal.com
В каждом правиле ipfw nat должно быть слово in или out

Date: 2014-11-18 10:20 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
добавил
/sbin/ipfw add 2601 nat 8674 ip from any to IP1 in
/sbin/ipfw add 2602 nat 8675 ip from any to IP2 in
/sbin/ipfw add 2603 nat 8676 ip from any to IP3 in
/sbin/ipfw add 2604 nat 8677 ip from any to IP4 in
/sbin/ipfw add 2605 nat 8678 ip from any to IP5 in

/sbin/ipfw add 2623 nat 8674 ip from 192.168.243.0/24 to any out
/sbin/ipfw add 2624 nat 8675 ip from 192.168.242.0/24 to any out
/sbin/ipfw add 2625 nat 8676 ip from 192.168.241.0/24 to any out
/sbin/ipfw add 2626 nat 8677 ip from 192.168.240.0/24 to any out
/sbin/ipfw add 2627 nat 8678 ip from 192.168.239.0/24 to any out

ничего не поменялось
нагрузка примерно та же
PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
12 root -72 - 0K 448K CPU5 5 127:26 94.09% intr{swi1: netisr 0}
0 root -92 0 0K 176K CPU3 3 115:08 84.77% kernel{igb1 taskq}
0 root -92 0 0K 176K CPU2 2 78:25 65.48% kernel{igb0 taskq}
0 root -92 0 0K 176K CPU6 6 41:49 1.37% kernel{dummynet}
12 root -60 - 0K 448K WAIT 0 2:52 0.39% intr{swi4: clock}


# sysctl -a | grep net.isr
net.isr.numthreads: 8
net.isr.maxprot: 16
net.isr.defaultqlimit: 4096
net.isr.maxqlimit: 10240
net.isr.bindthreads: 1
net.isr.maxthreads: 8
net.isr.direct: 1
net.isr.direct_force: 0
net.isr.dispatch: hybrid

поставил net.isr.dispatch: hybrid - иначе
intr{swi1: netisr 0} под 100% и тормоза

Date: 2014-11-18 11:20 (UTC)
From: [identity profile] dadv.livejournal.com
vmstat -i | grep igb в студию

Date: 2014-11-18 11:23 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
# vmstat -i | grep igb
irq256: igb0 118320192 8610
irq257: igb1 70242007 5111

Date: 2014-11-19 05:47 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
Для полноты картины:
Сервер IBM x3630 M4, 2xIntel Xeon E5 - итого 16ядер.
ESXi 5.5. В виртуальную машину переданы в управление 2 порта из 4-х портовой сетевой карты Intel Corporation 82576 Gigabit Network Connection - так она определяется в esxi.
В виртуальной машине два проца по 4 ядра. 6Гиг ОЗУ.

Может в esxi проблема? надо переходить на физический сервер?
Я уже мозг себе вынес.... Нагрузка не более 120 мегабит на всю локальную сеть, не более 80 мегабит из них на инет - смешные цифры по сравнению с теми, что фигурируют в частности в ваших статьях...
Edited Date: 2014-11-19 05:49 (UTC)

Date: 2014-11-19 07:08 (UTC)
From: [identity profile] dadv.livejournal.com
Вообще-то такие вещи надо сообщать заранее, потому как это крайне существенно. Очевидно, виртуалка не поддерживает MSI-X, что критично для распараллеливания нагрузки по ядрам при помощи igb.

Date: 2014-11-27 04:14 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
При прокидывании сетевой карты напрямую в виртуальную машину распараллеливание по ядрам так и не заработала. Зато при использовании виртуальной сетевой карты (Е1000, em) все параллелится, но загрузка netisr 1 значительно выше остальных примерно вот так:
100.00% intr{swi1: netisr 1}
21.88% intr{swi1: netisr 6}
20.26% intr{swi1: netisr 4}
19.38% intr{swi1: netisr 2}
11.38% kernel{em1 taskq}
10.16% intr{swi1: netisr 7}
8.98% intr{swi1: netisr 5}
6.40% intr{swi1: netisr 0}
это при net.inet.ip.fastforwarding=0
если же net.inet.ip.fastforwarding=1, то
вырастает нагрузка на
kernel{em0 taskq}
kernel{em1 taskq}
почти до 100% - появляются потери

как можно выяснить чем занят netisr 1?
потому как игры с инстансами картину не меняют - распределил как мог...
или это нормально, когда один из netisr работает на 100%?
Edited Date: 2014-11-27 04:16 (UTC)

Date: 2014-11-27 06:59 (UTC)
From: [identity profile] dadv.livejournal.com
При нормальном использовании железа в режиме MSI-X вообще не будет нагрузки netisr. А будет примерно вот что:

   12 root       -68    -     0K   592K WAIT    1 129.8H 11.57% intr{irq267: igb1:que}
   12 root       -68    -     0K   592K WAIT    3 108.0H  8.89% intr{irq259: em1:rx 0}
   12 root       -68    -     0K   592K WAIT    0 135.6H  8.69% intr{irq262: igb0:que}
   12 root       -68    -     0K   592K WAIT    2 110.4H  7.08% intr{irq256: em0:rx 0}


То есть, трафик принимается несколькими прерываниями и обрабатывается полностью в контексте прерываний, а не в ISR. А прерывания уже легко привязать к разным ядрам.

А тут нет распределения нагрузки через прерывания, отсюда неравномерность.

Date: 2014-11-27 11:52 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
Спасибо, что помогли разобраться. Перешел на физический сервер - все работает отлично, но жаль вот только незатраченные ресурсы простаивают.

Date: 2015-01-12 06:04 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
Поставил как виртуальный сервер на Xen от citrix 6.2.
Вроде все работает, однако высокая нагрузка осталась....

last pid: 10807; load averages: 6.98, 6.15, 5.89 up 0+22:00:07 12:01:52
168 processes: 12 running, 112 sleeping, 1 zombie, 43 waiting
CPU 0: 0.0% user, 0.0% nice, 0.8% system, 51.4% interrupt, 47.8% idle
CPU 1: 0.4% user, 0.0% nice, 5.9% system, 57.3% interrupt, 36.5% idle
CPU 2: 0.0% user, 0.0% nice, 4.7% system, 58.8% interrupt, 36.5% idle
CPU 3: 0.0% user, 0.0% nice, 6.3% system, 49.8% interrupt, 43.9% idle
CPU 4: 0.0% user, 0.0% nice, 6.7% system, 50.2% interrupt, 43.1% idle
CPU 5: 0.4% user, 0.0% nice, 3.9% system, 56.1% interrupt, 39.6% idle
CPU 6: 0.0% user, 0.0% nice, 6.3% system, 45.9% interrupt, 47.8% idle
CPU 7: 0.0% user, 0.0% nice, 5.9% system, 49.4% interrupt, 44.7% idle
Mem: 63M Active, 277M Inact, 644M Wired, 614M Buf, 4950M Free
Swap: 1024M Total, 1024M Free


PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
12 root -72 - 0K 720K WAIT 5 239:51 32.57% intr{swi1: netisr 0}
12 root -92 - 0K 720K WAIT 2 112:02 26.66% intr{irq267: igb1:que}
12 root -92 - 0K 720K RUN 1 66:30 23.97% intr{irq266: igb1:que}
12 root -92 - 0K 720K WAIT 5 72:35 23.58% intr{irq270: igb1:que}
12 root -92 - 0K 720K CPU7 7 69:29 18.65% intr{irq272: igb1:que}
12 root -92 - 0K 720K CPU4 4 84:33 17.29% intr{irq269: igb1:que}
12 root -92 - 0K 720K CPU3 3 54:00 16.26% intr{irq259: igb0:que}
12 root -72 - 0K 720K WAIT 5 76:42 16.16% intr{swi1: netisr 4}
12 root -92 - 0K 720K WAIT 0 85:08 15.48% intr{irq256: igb0:que}
12 root -92 - 0K 720K CPU4 4 69:38 15.19% intr{irq260: igb0:que}
12 root -92 - 0K 720K WAIT 0 92:05 14.36% intr{irq265: igb1:que}
12 root -72 - 0K 720K CPU0 0 60:35 14.36% intr{swi1: netisr 5}
12 root -92 - 0K 720K WAIT 2 85:02 13.67% intr{irq258: igb0:que}
12 root -72 - 0K 720K WAIT 3 62:51 13.48% intr{swi1: netisr 1}
12 root -92 - 0K 720K WAIT 6 88:31 12.89% intr{irq271: igb1:que}
12 root -92 - 0K 720K WAIT 3 131:43 12.70% intr{irq268: igb1:que}
12 root -92 - 0K 720K CPU1 1 51:17 12.26% intr{irq257: igb0:que}
12 root -72 - 0K 720K WAIT 4 69:07 11.08% intr{swi1: netisr 2}
12 root -72 - 0K 720K WAIT 3 64:55 10.89% intr{swi1: netisr 3}
12 root -92 - 0K 720K WAIT 7 69:32 10.16% intr{irq263: igb0:que}
12 root -72 - 0K 720K WAIT 1 72:51 8.98% intr{swi1: netisr 6}
12 root -92 - 0K 720K WAIT 6 62:06 8.40% intr{irq262: igb0:que}
12 root -92 - 0K 720K WAIT 5 51:56 7.76% intr{irq261: igb0:que}
0 root -92 0 0K 400K CPU4 4 248:17 7.08% kernel{dummynet}
12 root -72 - 0K 720K WAIT 3 61:59 6.98% intr{swi1: netisr 7}

потерь пока не наблюдаю.....
стоит копать куда-нибудь или это нормальная нагрузка?

Date: 2015-01-12 07:41 (UTC)
From: [identity profile] dadv.livejournal.com
Насчет виртуализации и нагрузки - это не ко мне вопросы.

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios