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: 2012-02-24 12:59 (UTC)
From: [identity profile] logger.livejournal.com
Спасибо. Только поправьте net.ist.bindthreads=0 -> net.isr.bindthreads=0

Date: 2012-02-24 16:52 (UTC)
From: [identity profile] dadv.livejournal.com
Поправил, спасибо.

Date: 2012-02-25 00:29 (UTC)
From: [identity profile] click0.livejournal.com


# procstat -at | awk '/swi1: netisr/ {print $5, $6; system("cpuset -g -t " $2);}'
netisr 0
tid 100009 mask: 0, 1, 2, 3, 4, 5
# procstat -at | awk '/swi1: netisr/ {print $2}' | xargs -n 1 cpuset -l all -t
# procstat -at | awk '/swi1: netisr/ {print $5, $6; system("cpuset -g -t " $2);}'
netisr 0
tid 100009 mask: 0, 1, 2, 3, 4, 5

Date: 2012-02-25 00:30 (UTC)
From: [identity profile] click0.livejournal.com
ЧЯДНТ

Date: 2012-02-25 00:30 (UTC)

Date: 2012-02-25 06:03 (UTC)
From: [identity profile] dadv.livejournal.com
В loader.conf добавь net.isr.maxthreads=6

Date: 2014-11-18 05:32 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
куда копать если работает только так:
# top -SH -n 500 | grep isr
12 root -72 - 0K 448K CPU6 6 46.7H 83.50% intr{swi1: netisr 0}
12 root -72 - 0K 448K WAIT 5 0:07 0.00% intr{swi1: netisr 5}
12 root -72 - 0K 448K WAIT 4 0:07 0.00% intr{swi1: netisr 2}
12 root -72 - 0K 448K WAIT 6 0:04 0.00% intr{swi1: netisr 7}
12 root -72 - 0K 448K WAIT 7 0:03 0.00% intr{swi1: netisr 1}
12 root -72 - 0K 448K WAIT 4 0:02 0.00% intr{swi1: netisr 6}
12 root -72 - 0K 448K WAIT 1 0:02 0.00% intr{swi1: netisr 4}
12 root -72 - 0K 448K WAIT 5 0:00 0.00% intr{swi1: netisr 3}

?

netisr 0 - иногда и до 100% доходит - начинаются проблемы

# uname -a
FreeBSD local.net 9.3-PRERELEASE FreeBSD 9.3-PRERELEASE #0 r266441M: Fri May 30 10:43:42 OMST 2014 vovik@local.net:/usr/src/sys/amd64/compile/MyGENERIC amd64

# 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 # 0 - тоже пробовал - ситуация одинаковая
net.isr.maxthreads: 8
net.isr.direct: 0
net.isr.direct_force: 0
net.isr.dispatch: deferred

# procstat -at | awk '/swi1: netisr/ {print $5, $6; system("cpuset -g -t " $2);}'
netisr 0
tid 100012 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 1
tid 100068 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 2
tid 100069 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 3
tid 100070 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 4
tid 100071 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 5
tid 100072 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 6
tid 100073 mask: 0, 1, 2, 3, 4, 5, 6, 7
netisr 7
tid 100074 mask: 0, 1, 2, 3, 4, 5, 6, 7

# cat /boot/loader.conf | grep igb
hw.igb.rxd=4096
hw.igb.txd=4096
hw.igb.max_interrupt_rate=32000
hw.igb.rx_abs_int_delay=600
hw.igb.tx_abs_int_delay=600
hw.igb.rx_int_delay=600
hw.igb.tx_int_delay=600
hw.igb.rx_process_limit=-1

Две сетевые карты igb - инет и локалка (куча vlan-ов и ng (mpd5)).
что еще показать для полноты?
Edited Date: 2014-11-18 05:42 (UTC)

Date: 2014-11-18 06:41 (UTC)
From: [identity profile] dadv.livejournal.com
NAT есть? На чём сделан?

Date: 2014-11-18 06:49 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
ipfw nat config.....
ipfw add nat....
если вдруг важно
использую ngtee для подсчета трафика
Edited Date: 2014-11-18 06:51 (UTC)

Date: 2014-11-18 06:54 (UTC)
From: [identity profile] dadv.livejournal.com
Единый инстанс ipfw nat сам по себе не параллелится по ядрам - чтобы параллелилось, надо создать несколько инстансов (по одному на ядро) и направлять трафик разных клиентов в разные инстансы.

Date: 2014-11-18 07:01 (UTC)
From: [identity profile] vladimir baranov (from livejournal.com)
эм....
сделать
/sbin/ipfw nat config 8661 ip IP1
/sbin/ipfw nat config 8662 ip IP2
...
/sbin/ipfw nat config 866N ip IP_N

и пользователей по ним разнести, я правильно понял?

или это надо уходить от ipfw nat вообще?
Edited Date: 2014-11-18 07:02 (UTC)

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