Заметили что наш IPNAT в связке с IPFW шейпером(+ пару других утилиток) напрягает восновном 2 ядра из 8 при больших нагрузках. Нашли такое решение как параметр net.isr.maxthreads – собственно, количество потоков, разгребающих очередь пакетов. Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после перезагрузки значение всё равно 1.
ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.
> Что делаем не так, помогите.Все так, это фича. Если хотите параллелить нат - используйте нг_нат, создавайте отдельные номерные ноды под отдельные правила, и будет вам щясье. Из ипфв обращение к нетграфу даже логичней выглядит, чем к ипфв_нату. Плюс есть масса плюшек, связанных с таблеаргами.
>> Что делаем не так, помогите.
> Все так, это фича. Если хотите параллелить нат - используйте нг_нат, создавайте
> отдельные номерные ноды под отдельные правила, и будет вам щясье. Из
> ипфв обращение к нетграфу даже логичней выглядит, чем к ипфв_нату. Плюс
> есть масса плюшек, связанных с таблеаргами.А можно по сути вопроса. Почему фича не применяется?
> А можно по сути вопроса. Почему фича не применяется?Потому что ипнат - однопоточен архитектурно. Из-за одной общей таблицы трансляции. В случае сопряжения с нетграфом ипфв работает брокером пакетов, сбрасывая их на отдельные ноды нг_ната, каждая из которых имеет свою таблицу преобразования адресов. Нужно только аккуратно разруливать входящие пакеты, чтобы обратка попадала на ту же ноду, через которую шел исходящий траффик.
>> А можно по сути вопроса. Почему фича не применяется?
> Потому что ипнат - однопоточен архитектурно. Из-за одной общей таблицы трансляции. В
> случае сопряжения с нетграфом ипфв работает брокером пакетов, сбрасывая их на
> отдельные ноды нг_ната, каждая из которых имеет свою таблицу преобразования адресов.
> Нужно только аккуратно разруливать входящие пакеты, чтобы обратка попадала на ту
> же ноду, через которую шел исходящий траффик.т.е. получается, что тормоза всего сервера при > 100к активных сессий ("ipnat -s | grep inuse") как раз и есть результат этого ограничения однопоточности? 2 ядра постоянно загружены на 100%, и пропадают сразу после очистки таблиц (ipnat -CF).. а то тормоза как-то не совпадают по логике с наличием 2х 4-ядерных xeon-ов
> Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после
> перезагрузки значение всё равно 1.
> ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.А, да. Переменные ядра рулятся не из /бут/лоадер.конф, а из /етц/сисцтл.конф
>> Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после
>> перезагрузки значение всё равно 1.
>> ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.
> А, да. Переменные ядра рулятся не из /бут/лоадер.конф, а из /етц/сисцтл.коFА ничего что:
# sysctl net.isr.maxthreads=8
sysctl: oid 'net.isr.maxthreads' is read only
>>> Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после
>>> перезагрузки значение всё равно 1.
>>> ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.
>> А, да. Переменные ядра рулятся не из /бут/лоадер.конф, а из /етц/сисцтл.коF
> А ничего что:
> # sysctl net.isr.maxthreads=8
> sysctl: oid 'net.isr.maxthreads' is read onlyКстати из /etc/sysctl.conf, тоже ничего не поменяло.
>> Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после
>> перезагрузки значение всё равно 1.
>> ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.
> А, да. Переменные ядра рулятся не из /бут/лоадер.конф, а из /етц/сисцтл.конфОни рулятся и там и там, только бут/лоадер.конф как раз и нужен для того, чтобы установить переменные ядра до загрузки ядра. т.е. Используется для тех переменных, которые нельзя менять рантайм
> Что делаем не так, помогите.Linux - для умных, Cisco - для богатых, FreeBSD - для тупых жмотов. :)
>> Что делаем не так, помогите.
> Linux - для умных, Cisco - для богатых, FreeBSD - для тупых
> жмотов. :)толсто.
>> Что делаем не так, помогите.
> Linux - для умных, Cisco - для богатых, FreeBSD - для тупых
> жмотов. :)вы наверное сильно умный ))
>>> Что делаем не так, помогите.
>> Linux - для умных, Cisco - для богатых, FreeBSD - для тупых
>> жмотов. :)
> вы наверное сильно умный ))Да, спасибо.
А у вас ядро собрано с DEVICE POLLING?
> А у вас ядро собрано с DEVICE POLLING?Нет
> Заметили что наш IPNAT в связке с IPFW шейпером(+ пару других утилиток)
> напрягает восновном 2 ядра из 8 при больших нагрузках. Нашли такое
> решение как параметр net.isr.maxthreads – собственно, количество потоков, разгребающих
> очередь пакетов. Добавили в файл /boot/loader.conf --> net.isr.maxthreads=8. но после
> перезагрузки значение всё равно 1.
> ОС FreeBSD 8.1-RELEASE amd64. Что делаем не так, помогите.Я заметил, что не меняеются параметры
net.isr.direct=0 # interrupt handling via multiple CPU
net.isr.direct_force=0
их нужно установить в 1, что бы работала система обработки прерываний разными корами\процессорами. Я их установил в 1 в лоадер.конф, но после ребута - все по нолям.
А у вас как?---
net.isr.bindthreads=0 # do not bind threads to CPUs
net.isr.direct=1 # interrupt handling via multiple CPU
net.isr.direct_force=1 # "
net.isr.maxthreads=3 # Max number of threads for NIC IRQ balancing
# sysctl -a | grep net.isr
net.isr.numthreads: 3
net.isr.maxprot: 16
net.isr.defaultqlimit: 256
net.isr.maxqlimit: 10240
net.isr.bindthreads: 0
net.isr.maxthreads: 3
net.isr.direct: 0
net.isr.direct_force: 0
last pid: 46125; load averages: 1.26, 1.30, 1.33 up 0+12:43:57 22:16:07
222 processes: 6 running, 198 sleeping, 18 waiting
CPU 0: 3.7% user, 0.0% nice, 11.1% system, 9.9% interrupt, 75.3% idle
CPU 1: 0.0% user, 0.0% nice, 2.5% system, 37.0% interrupt, 60.5% idle
CPU 2: 2.5% user, 0.0% nice, 1.2% system, 34.6% interrupt, 61.7% idle
CPU 3: 1.2% user, 0.0% nice, 6.2% system, 27.2% interrupt, 65.4% idle
Mem: 258M Active, 1662M Inact, 201M Wired, 316K Cache, 112M Buf, 1777M Free
Swap: 4096M Total, 4096M FreePID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
11 root 155 ki31 0K 32K CPU3 3 525:10 76.61% {idle: cpu3}
11 root 155 ki31 0K 32K RUN 2 520:14 76.37% {idle: cpu2}
11 root 155 ki31 0K 32K CPU0 0 509:33 75.68% {idle: cpu0}
11 root 155 ki31 0K 32K RUN 1 518:15 71.14% {idle: cpu1}
12 root -72 - 0K 152K CPU1 1 269:13 35.25% {swi1: netisr 0}
12 root -72 - 0K 152K WAIT 3 174:30 19.97% {swi1: netisr 2}
12 root -92 - 0K 152K WAIT 0 108:13 12.55% {irq256: re0}
12 root -72 - 0K 152K WAIT 2 84:00 12.55% {swi1: netisr 3}
13 root -16 - 0K 32K sleep 3 48:04 4.10% {ng_queue0}
13 root -16 - 0K 32K sleep 0 48:04 4.05% {ng_queue2}
13 root -16 - 0K 32K sleep 3 48:06 4.00% {ng_queue3}
13 root -16 - 0K 32K sleep 0 48:02 4.00% {ng_queue1}
46124 cacti 26 0 11960K 3480K select 0 0:00 0.83% snmpget
46078 cacti 45 0 23716K 16432K piperd 1 0:00 0.73% php
46089 cacti 46 0 11116K 2836K piperd 2 0:00 0.73% perl5.10.1
46090 root 46 0 9728K 1952K select 3 0:00 0.73% sudo
46116 cacti 27 0 11960K 3592K select 0 0:00 0.63% snmpwalk
46123 cacti 52 0 11116K 2824K piperd 0 0:00 0.63% perl5.10.1
6989 root 21 0 13408K 5576K select 3 16:51 0.54% snmpd
46073 cacti 52 0 23716K 16440K piperd 2 0:00 0.54% php
46091 root 21 0 9672K 1512K select 0 0:00 0.44% pingКак видно, работают все ядра, но вот в этой ситуации:
net.isr.bindthreads=0
net.isr.direct=1
net.isr.direct_force=1
net.isr.maxthreads=3#top -SIHP
last pid: 14902; load averages: 1.92, 2.12, 1.96 up 0+17:47:31 19:59:04
226 processes: 12 running, 197 sleeping, 17 waiting
CPU 0: 0.6% user, 0.0% nice, 1.2% system, 88.3% interrupt, 9.8% idle
CPU 1: 1.8% user, 0.0% nice, 29.4% system, 0.0% interrupt, 68.7% idle
CPU 2: 3.7% user, 0.0% nice, 30.7% system, 0.0% interrupt, 65.6% idle
CPU 3: 3.1% user, 0.0% nice, 25.8% system, 0.0% interrupt, 71.2% idle
Mem: 264M Active, 1641M Inact, 272M Wired, 832K Cache, 112M Buf, 1721M Free
Swap: 4096M Total, 4096M FreePID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
12 root -92 - 0K 152K CPU0 0 354:30 96.78% {irq256: re0}
11 root 155 ki31 0K 32K RUN 1 929:16 77.83% {idle: cpu1}
11 root 155 ki31 0K 32K RUN 3 922:41 72.95% {idle: cpu3}
11 root 155 ki31 0K 32K RUN 2 904:02 71.63% {idle: cpu2}
13 root -16 - 0K 32K CPU3 1 71:11 18.65% {ng_queue1}
13 root -16 - 0K 32K RUN 1 71:10 18.36% {ng_queue3}
13 root -16 - 0K 32K RUN 3 71:18 17.63% {ng_queue0}
13 root -16 - 0K 32K RUN 1 71:11 17.14% {ng_queue2}
11 root 155 ki31 0K 32K RUN 0 682:25 10.55% {idle: cpu0}
55709 root 20 0 13408K 5840K select 2 15:50 1.71% snmpd
14902 cacti 33 0 11960K 3480K select 1 0:00 1.12% snmpget
14864 cacti 46 0 11116K 2836K piperd 3 0:00 1.12% perl5.10.1
14867 root 46 0 9728K 1956K select 3 0:00 1.12% sudoРаботает только одно ядро. т.е. выходит, что одно ядро привязывается к одной сетевухе
через время будет вторая сетевуха, попробую провести тесты.
В вашей ситуации вы можете попробовать установить
net.isr.direct_force=0тогда, опять же из постов на форумах, вроде как, будет передаваться обработка в другие ядра, если это первое загружено. Я это не тестировал.
в моём же случае я только оттюнил net.isr.maxthreads: 3. Как работает вы видите. Будет ли превышен лимит, который был достигнут при direct and force =1 посмотрим.
>[оверквотинг удален]
> Работает только одно ядро. т.е. выходит, что одно ядро привязывается к одной
> сетевухе
> через время будет вторая сетевуха, попробую провести тесты.
> В вашей ситуации вы можете попробовать установить
> net.isr.direct_force=0
> тогда, опять же из постов на форумах, вроде как, будет передаваться обработка
> в другие ядра, если это первое загружено. Я это не тестировал.
> в моём же случае я только оттюнил net.isr.maxthreads: 3. Как работает вы
> видите. Будет ли превышен лимит, который был достигнут при direct and
> force =1 посмотрим.Отпишитесь. ОК?
>[оверквотинг удален]
>> сетевухе
>> через время будет вторая сетевуха, попробую провести тесты.
>> В вашей ситуации вы можете попробовать установить
>> net.isr.direct_force=0
>> тогда, опять же из постов на форумах, вроде как, будет передаваться обработка
>> в другие ядра, если это первое загружено. Я это не тестировал.
>> в моём же случае я только оттюнил net.isr.maxthreads: 3. Как работает вы
>> видите. Будет ли превышен лимит, который был достигнут при direct and
>> force =1 посмотрим.
> Отпишитесь. ОК?А что же вы не отписываетесь???
>[оверквотинг удален]
>>> через время будет вторая сетевуха, попробую провести тесты.
>>> В вашей ситуации вы можете попробовать установить
>>> net.isr.direct_force=0
>>> тогда, опять же из постов на форумах, вроде как, будет передаваться обработка
>>> в другие ядра, если это первое загружено. Я это не тестировал.
>>> в моём же случае я только оттюнил net.isr.maxthreads: 3. Как работает вы
>>> видите. Будет ли превышен лимит, который был достигнут при direct and
>>> force =1 посмотрим.
>> Отпишитесь. ОК?
> А что же вы не отписываетесь???А у меня все по-старому))
net.isr.direct: 0
net.isr.direct_force: 0
так в 1 выставить и не удалось. я так понимаю в 9-кe по-умолчанию новый механизм включен и выключить его нельзя. С net.isr.maxthreads все ясно, с этим разобрался. Можно выставить =#CPU's
>>[оверквотинг удален]
> А у меня все по-старому))
> net.isr.direct: 0
> net.isr.direct_force: 0
> так в 1 выставить и не удалось. я так понимаю в 9-кe
> по-умолчанию новый механизм включен и выключить его нельзя. С net.isr.maxthreads все
> ясно, с этим разобрался. Можно выставить =#CPU'snet.isr.direct и net.isr.direct_force меняется параметром net.isr.dispatch.
Если net.isr.dispatch=direct то:
net.isr.direct: 1
net.isr.direct_force: 1
Если net.isr.dispatch=hybrid то:
net.isr.direct: 1
net.isr.direct_force: 0
И наконец если net.isr.dispatch=deferred то:
net.isr.direct: 0
net.isr.direct_force: 0А как решили проблему с net.isr.maxthreads? Никак не хочет меняться. в loader.conf:
net.isr.dispatch=deferred
net.isr.numthreads=4
net.isr.maxthreads=4
но в результате получаю 1.
>[оверквотинг удален]
> net.isr.direct: 1
> net.isr.direct_force: 0
> И наконец если net.isr.dispatch=deferred то:
> net.isr.direct: 0
> net.isr.direct_force: 0
> А как решили проблему с net.isr.maxthreads? Никак не хочет меняться. в loader.conf:
> net.isr.dispatch=deferred
> net.isr.numthreads=4
> net.isr.maxthreads=4
> но в результате получаю 1.Только что специально проверил. Стоит в /boot/loader.conf
net.isr.maxthreads=2
net.isr.dispatch=deferred
Только эти две записи. (касательно очереди)
После ребута все как положено.
> А как решили проблему с net.isr.maxthreads? Никак не хочет меняться. в loader.conf:
> net.isr.dispatch=deferred
> net.isr.numthreads=4
> net.isr.maxthreads=4
> но в результате получаю 1.Смотрю по дате 2012, но все-же для следующий поколений.
Если net.isr.numthreads=1 и не меняется черех loader.conf - уберите polling из ядра.
> # sysctl -a | grep net.isr
> net.isr.numthreads: 3
> net.isr.maxprot: 16
> net.isr.defaultqlimit: 256
> net.isr.maxqlimit: 10240
> net.isr.bindthreads: 0
> net.isr.maxthreads: 3
> net.isr.direct: 0
> net.isr.direct_force: 0last pid: 25228; load averages: 2.39, 2.33, 2.15 up 2+04:33:34 14:05:44
203 processes: 7 running, 179 sleeping, 17 waiting
CPU 0: 0.8% user, 0.0% nice, 14.2% system, 22.4% interrupt, 62.6% idle
CPU 1: 0.4% user, 0.0% nice, 6.3% system, 43.7% interrupt, 49.6% idle
CPU 2: 0.0% user, 0.0% nice, 9.1% system, 41.7% interrupt, 49.2% idle
CPU 3: 0.0% user, 0.0% nice, 5.1% system, 49.6% interrupt, 45.3% idle
Mem: 252M Active, 2374M Inact, 283M Wired, 244K Cache, 112M Buf, 990M Free
Swap: 4096M Total, 4096M FreePID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND
11 root 155 ki31 0K 32K RUN 0 38.6H 68.65% {idle: cpu0}
12 root -72 - 0K 152K CPU3 3 922:39 59.62% {swi1: netisr 0
12 root -72 - 0K 152K CPU1 1 607:43 53.76% {swi1: netisr 2
11 root 155 ki31 0K 32K CPU1 1 38.3H 53.61% {idle: cpu1}
11 root 155 ki31 0K 32K RUN 3 38.6H 52.25% {idle: cpu3}
11 root 155 ki31 0K 32K RUN 2 38.2H 50.39% {idle: cpu2}
12 root -72 - 0K 152K WAIT 2 324:22 25.78% {swi1: netisr 3
12 root -92 - 0K 152K WAIT 0 346:24 16.70% {irq256: re0}
13 root -16 - 0K 32K sleep 2 141:52 6.69% {ng_queue3}
13 root -16 - 0K 32K sleep 1 141:40 6.54% {ng_queue1}
13 root -16 - 0K 32K sleep 1 141:45 6.20% {ng_queue0}
13 root -16 - 0K 32K sleep 1 141:43 6.15% {ng_queue2}
32549 root 20 0 13408K 5808K select 0 43:26 0.73% snmpd
5523 root 21 0 91472K 75760K select 2 37:14 0.34% {mpd5}Думаю можно net.isr.maxthreads: установить и в 4, никаких проблем на данный момент не наблюдаю, одни плюсы =)