Jump to content
Калькуляторы

FreeBSD 8 release + SMP

Имеется машина процессорок Intel® Core2 Quad CPU Q9550 @ 2.83GHz, карточка Intel PT DualPort выполняет функции BGP. Софт стоит Quagga, еще есть pf, но он натит всего 1 маленькую сетку на 10-15 компов (офис). Через машину валит трафик ~ 400 MBit симметрично / 150-170 kpps через обе сетевухи или ~ 80 kpps полезного трафа. netstat не показывает error`ов или еще чего либо плохого, но смущает нагрузка всего на два ядра. Ядро OS - GENERIC, не пересобирал. Вот вывод top -SP (не в моменты пиковой нагрузки):

last pid: 23560; load averages: 0.64, 0.60, 0.58 up 3+04:01:19 10:47:20

110 processes: 5 running, 81 sleeping, 24 waiting

CPU 0: 0.0% user, 0.0% nice, 30.0% system, 0.0% interrupt, 70.0% idle

CPU 1: 0.0% user, 0.0% nice, 0.4% system, 0.0% interrupt, 99.6% idle

CPU 2: 0.0% user, 0.0% nice, 0.0% system, 0.0% interrupt, 100% idle

CPU 3: 0.0% user, 0.0% nice, 34.5% system, 0.0% interrupt, 65.5% idle

Mem: 321M Active, 215M Inact, 300M Wired, 32K Cache, 112M Buf, 2116M Free

Swap: 10G Total, 10G Free

 

PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND

11 root 4 171 ki31 0K 32K CPU0 0 251.3H 341.50% idle

0 root 11 -68 0 0K 80K - 2 30.5H 36.82% kernel

467 root 1 44 - 0K 8K pftm 2 32:18 0.05% pfpurge

12 root 24 -44 - 0K 192K WAIT 0 20.3H 0.00% intr

1205 root 1 44 0 159M 157M select 2 30:18 0.00% bgpd

13 root 1 44 - 0K 8K - 0 10:16 0.00% yarrow

3848 root 1 44 0 87200K 83048K select 1 4:33 0.00% snmpd

16 root 1 44 - 0K 8K syncer 0 4:14 0.00% syncer

1239 root 1 44 0 4864K 2424K select 2 1:04 0.00% ntpd

1203 root 1 44 0 85036K 83244K select 3 0:54 0.00% zebra

4 root 1 -8 - 0K 8K - 0 0:12 0.00% g_down

3 root 1 -8 - 0K 8K - 0 0:12 0.00% g_up

2 root 1 -8 - 0K 8K - 0 0:12 0.00% g_event

 

# sysctl net.isr

net.isr.numthreads: 4

net.isr.defaultqlimit: 256

net.isr.maxqlimit: 10240

net.isr.bindthreads: 0

net.isr.maxthreads: 4

net.isr.direct: 1

net.isr.direct_force: 1

 

Сразу оговорюсь, что в системе есть еще 2 сетевухи em, причем одна встроенная и без своего interrupt`а? vmstat -i

interrupt total rate

irq14: ata0 126946 0

cpu0: timer 832215140 3039

irq256: em0 1738258113 6348

irq257: em1 1978255903 7225

irq259: em3 4134692 15

cpu1: timer 832215622 3039

cpu3: timer 833700449 3045

cpu2: timer 833700898 3045

Total 7052607763 25759

 

С net.isr.direct=0 игрался, начинаются interrupt`ы на CPU1 и CPU2, вместо system на CPU0 и CPU3 при net.isr.direct=1. Соответственно вопрос, не ужели нельзя никак забалансировать system на все CPU?

 

# cat /boot/loader.conf

net.isr.maxthreads=4

net.inet.ip.intr_queue_maxlen=1024

net.route.netisr_maxqlen=1024

hw.em.rxd=4096

hw.em.txd=4096

net.isr.direct=1

net.isr.direct_arp=1

net.inet.ip.fastforwarding=0

net.inet.flowtable.enable=0

kern.hz=3000

 

 

 

 

Share this post


Link to post
Share on other sites
нельзя

Вопрос с "подковыкой" :). Почему тогда net.isr.maxthreads дал эффект на аналогичной машине, только выполняющей роль бриджа, а не роутера? Неужели FreeBSD в этом плане хуже Linux, у которого irqbalance легко справится с этой задачей? :)

Share this post


Link to post
Share on other sites

Система в целом нагружена на 15%, чего опасаетесь?

Share this post


Link to post
Share on other sites
Вопрос с "подковыкой" :). Почему тогда net.isr.maxthreads дал эффект на аналогичной машине, только выполняющей роль бриджа, а не роутера? Неужели FreeBSD в этом плане хуже Linux, у которого irqbalance легко справится с этой задачей? :)

С такой прокладкой на линухе будет то же самое.

Share this post


Link to post
Share on other sites
Вопрос с "подковыкой" :). Почему тогда net.isr.maxthreads дал эффект на аналогичной машине, только выполняющей роль бриджа, а не роутера? Неужели FreeBSD в этом плане хуже Linux, у которого irqbalance легко справится с этой задачей? :)

С такой прокладкой на линухе будет то же самое.

Хорошо, перефразирую свой вопрос. Где допущена ошибка и как исправить?

Share this post


Link to post
Share on other sites
Хорошо, перефразирую свой вопрос. Где допущена ошибка и как исправить?

без top -SPH и sysctl -a трудно сказать, но подозреваю что нагрузку дает pf, он не параллелится в принципе. То, что Вы натите там только мелкую сетку, не означает,

что туда не попадает весь трафик, кроме того, возможно там включен default stateful behavior, scrub in all, не прописаны лимиты и таймауты, etc.

 

Share this post


Link to post
Share on other sites
Хорошо, перефразирую свой вопрос. Где допущена ошибка и как исправить?

без top -SPH и sysctl -a трудно сказать, но подозреваю что нагрузку дает pf, он не параллелится в принципе. То, что Вы натите там только мелкую сетку, не означает,

что туда не попадает весь трафик, кроме того, возможно там включен default stateful behavior, scrub in all, не прописаны лимиты и таймауты, etc.

# top -SPH

last pid: 24610; load averages: 1.05, 0.97, 0.92 up 3+10:27:35 17:13:36

110 processes: 6 running, 80 sleeping, 24 waiting

CPU 0: 0.0% user, 0.0% nice, 48.5% system, 0.0% interrupt, 51.5% idle

CPU 1: 0.0% user, 0.0% nice, 0.0% system, 0.4% interrupt, 99.6% idle

CPU 2: 0.0% user, 0.0% nice, 2.3% system, 0.0% interrupt, 97.7% idle

CPU 3: 0.0% user, 0.0% nice, 42.3% system, 0.0% interrupt, 57.7% idle

Mem: 321M Active, 215M Inact, 300M Wired, 32K Cache, 112M Buf, 2116M Free

Swap: 10G Total, 10G Free

 

PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND

11 root 171 ki31 0K 32K RUN 2 71.5H 100.00% {idle: cpu2}

11 root 171 ki31 0K 32K CPU1 1 71.7H 96.58% {idle: cpu1}

11 root 171 ki31 0K 32K CPU0 0 64.5H 55.91% {idle: cpu0}

11 root 171 ki31 0K 32K CPU3 3 64.5H 54.05% {idle: cpu3}

0 root -68 0 0K 80K CPU0 0 17.5H 44.43% {em1 taskq}

0 root -68 0 0K 80K - 3 17.7H 21.73% {em0 taskq}

467 root 44 - 0K 8K pftm 2 35:15 0.24% pfpurge

12 root -44 - 0K 192K WAIT 2 615:30 0.00% {swi1: netisr 3}

12 root -44 - 0K 192K WAIT 2 594:43 0.00% {swi1: netisr 2}

1205 root 44 0 159M 157M select 1 32:56 0.00% bgpd

13 root 44 - 0K 8K - 2 11:09 0.00% yarrow

3848 root 44 0 87200K 83304K select 2 5:05 0.00% snmpd

16 root 44 - 0K 8K syncer 2 4:44 0.00% syncer

 

sysctl -a великоват для публикации тут, могу выборочно кинуть нужное. Честно говоря, идея в принципе рациональная, что в pf попадает весь трафик и, видимо от него придется отказаться. Вопрос на засыпку, если я остановлю его на боевой машине (/etc/rc.d/pf stop) - не приведет ли это к зависанию и действительно ли будет выключен функционал pf ? (чтобы протестить нагрузку)

Share this post


Link to post
Share on other sites

Сначала попробуйте

> cat /boot/loader.conf | grep _int_
hw.em.tx_int_delay=128
hw.em.rx_int_delay=128
hw.em.tx_abs_int_delay=512
hw.em.rx_abs_int_delay=512

Цифры по вкусу под нагрузку.

 

net.inet.ip.fastforwarding=0
Не знал, что sysctl можно в loader.conf пихать.

 

Share this post


Link to post
Share on other sites
Вопрос на засыпку, если я остановлю его на боевой машине (/etc/rc.d/pf stop) - не приведет ли это к зависанию и действительно ли будет выключен функционал pf ? (чтобы протестить нагрузку)
Должно порвать все TCP коннекты, и ссш придётся переконекчивать.

Чтобы наверняка - соберите ядро без него и не загружайте модулем.

Share this post


Link to post
Share on other sites
Должно порвать все TCP коннекты, и ссш придётся переконекчивать.

С чего бы это?

Share this post


Link to post
Share on other sites

У меня всегда рвало, как минимум когда я PF перезапускал.

Share this post


Link to post
Share on other sites

Короче, сегодня произошел незапланированный рестарт, но зато я не грузанул pf. Нагрузка средняя и балансировка по прежнему отсутствует как класс :) Никак главное не пойму, почему tasq на em1 только большой, хотя em0 и em1 участвуют в прогоне трафа, а на em2 и em3 сейчас резерв (с небольшой подгрузкой ~ 10 Mbit) и обменник на em3 ~ на 40-50 Mbit в пике. Что я делаю не так? (хочу разбалансировать нагрузку по 4 ядрам)

 

# kldstat

Id Refs Address Size Name

1 1 0xc0400000 b6dfe0 kernel

 

# vmstat -i

interrupt total rate

irq14: ata0 46406 11

irq16: uhci0 1 0

cpu0: timer 12513486 3041

irq256: em0 31277230 7602

irq257: em1 32008290 7780

irq258: em2 10821474 2630

irq259: em3 6918408 1681

cpu1: timer 12513321 3041

cpu3: timer 12483561 3034

cpu2: timer 12483551 3034

Total 131065728 31858

 

# netstat -w 1

input (Total) output

packets errs bytes packets errs bytes colls

101958 0 69477501 101967 0 71940276 0

104938 0 71648209 104935 0 74010089 0

99603 0 67878764 99605 0 70201522 0

100486 0 69700114 100479 0 71838516 0

101432 0 68868766 101433 0 71125097 0

99741 0 66871816 99724 0 69186505 0

102380 0 68773855 102394 0 71016161 0

100447 0 67317957 100451 0 69527149 0

 

# top -SPH

last pid: 1646; load averages: 0.46, 0.60, 0.57 up 0+01:10:40 00:22:12

109 processes: 5 running, 80 sleeping, 24 waiting

CPU 0: 0.0% user, 0.0% nice, 19.6% system, 0.0% interrupt, 80.4% idle

CPU 1: 0.0% user, 0.0% nice, 2.7% system, 0.0% interrupt, 97.3% idle

CPU 2: 0.0% user, 0.0% nice, 2.7% system, 0.0% interrupt, 97.3% idle

CPU 3: 0.0% user, 0.0% nice, 23.1% system, 0.0% interrupt, 76.9% idle

Mem: 300M Active, 8120K Inact, 122M Wired, 112K Cache, 12M Buf, 2522M Free

Swap: 10G Total, 10G Free

 

PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND

11 root 171 ki31 0K 32K CPU2 2 66:40 100.00% {idle: cpu2}

11 root 171 ki31 0K 32K CPU1 1 66:19 94.78% {idle: cpu1}

11 root 171 ki31 0K 32K CPU0 0 54:22 82.57% {idle: cpu0}

11 root 171 ki31 0K 32K RUN 3 51:32 75.15% {idle: cpu3}

0 root -68 0 0K 80K - 0 15:03 22.56% {em1 taskq}

0 root -68 0 0K 80K - 3 17:49 2.34% {em0 taskq}

0 root -68 0 0K 80K - 1 1:35 0.83% {em2 taskq}

12 root -44 - 0K 192K WAIT 2 1:59 0.00% {swi1: netisr 3}

12 root -44 - 0K 192K WAIT 0 1:35 0.00% {swi1: netisr 2}

0 root -68 0 0K 80K - 2 0:53 0.00% {em3 taskq}

1210 root 44 0 143M 142M select 1 0:51 0.00% bgpd

12 root -44 - 0K 192K WAIT 0 0:14 0.00% {swi1: netisr 1}

1244 root 44 0 4864K 2384K select 3 0:10 0.00% ntpd

 

 

Share this post


Link to post
Share on other sites
em1 - out ; em0 - in
0 root -68 0 0K 80K - 0 15:03 22.56% {em1 taskq}

0 root -68 0 0K 80K - 3 17:49 2.34% {em0 taskq}

то оно без фаервола так рисует?

sysctl dev.em.1.debug=1

sysctl dev.em.1.stats=1

и читать /var/log/messages

Edited by andriko

Share this post


Link to post
Share on other sites
em1 - out ; em0 - in
0 root -68 0 0K 80K - 0 15:03 22.56% {em1 taskq}

0 root -68 0 0K 80K - 3 17:49 2.34% {em0 taskq}

то оно без фаервола так рисует?

sysctl dev.em.1.debug=1

sysctl dev.em.1.stats=1

и читать /var/log/messages

# sysctl dev.em.1.debug=1

em1: Adapter hardware address = 0xc6783424

em1: CTRL = 0xc0241 RCTL = 0x8002

em1: Packet buffer = Tx=16k Rx=32k

em1: Flow control watermarks high = 30720 low = 29220

em1: tx_int_delay = 66, tx_abs_int_delay = 66

em1: rx_int_delay = 0, rx_abs_int_delay = 66

em1: fifo workaround = 0, fifo_reset_count = 0

em1: hw tdh = 2234, hw tdt = 2234

em1: hw rdh = 2438, hw rdt = 2437

em1: Num Tx descriptors avail = 4096

em1: Tx Descriptors not avail1 = 0

em1: Tx Descriptors not avail2 = 0

em1: Std mbuf failed = 0

em1: Std mbuf cluster failed = 0

em1: Driver dropped packets = 0

em1: Driver tx dma failure in encap = 0

 

# sysctl dev.em.1.stats=1

em1: Excessive collisions = 0

em1: Sequence errors = 0

em1: Defer count = 0

em1: Missed Packets = 184

em1: Receive No Buffers = 86

em1: Receive Length Errors = 0

em1: Receive errors = 0

em1: Crc errors = 0

em1: Alignment errors = 0

em1: Collision/Carrier extension errors = 0

em1: RX overruns = 1

em1: watchdog timeouts = 0

em1: RX MSIX IRQ = 0 TX MSIX IRQ = 0 LINK MSIX IRQ = 0

em1: XON Rcvd = 0

em1: XON Xmtd = 0

em1: XOFF Rcvd = 0

em1: XOFF Xmtd = 0

em1: Good Packets Rcvd = 1774732194

em1: Good Packets Xmtd = 2229337079

em1: TSO Contexts Xmtd = 21

em1: TSO Contexts Failed = 0

 

Share this post


Link to post
Share on other sites

dev.em.1.*_*_delay не крутились, можно поиграться

 

а так, все нормально, разве что, разобраться, какой именно трафик, насилует em1.

хотя, при таком ппс+мегабит, у меня примерно такая ж нагрузка.

А что баллансировать собираетесь? Есть em1, у него одно irq, вот оно и обрабатываеться одним процессором, ну, можете для гарантии прибить его к одному процу cpuset-ом.

Можно поставить двайвера от яндекса и получить несколько irq на одну карточку. Картика помяняется, в остальном - на любителя.

Share this post


Link to post
Share on other sites
dev.em.1.*_*_delay не крутились, можно поиграться

 

а так, все нормально, разве что, разобраться, какой именно трафик, насилует em1.

хотя, при таком ппс+мегабит, у меня примерно такая ж нагрузка.

А что баллансировать собираетесь? Есть em1, у него одно irq, вот оно и обрабатываеться одним процессором, ну, можете для гарантии прибить его к одному процу cpuset-ом.

Можно поставить двайвера от яндекса и получить несколько irq на одну карточку. Картика помяняется, в остальном - на любителя.

На сколько я понимаю, в Linux irqbalance с легкостью бы разнес весь трафик по 4 ядрам. К тому же рядом есть полностью аналогичная машина, только ее задача из em0 и em1 сделать бридж, так там после net.isr.numthreads=4 нагрузка в действительности легла на все 4 ядра.

 

# top -SPH

last pid: 95661; load averages: 0.73, 0.66, 0.59 up 13+16:25:25 18:44:14

136 processes: 5 running, 108 sleeping, 23 waiting

CPU 0: 1.9% user, 0.0% nice, 3.4% system, 0.0% interrupt, 94.8% idle

CPU 1: 4.1% user, 0.0% nice, 18.4% system, 0.4% interrupt, 77.1% idle

CPU 2: 1.1% user, 0.0% nice, 33.1% system, 0.0% interrupt, 65.8% idle

CPU 3: 0.0% user, 0.0% nice, 18.0% system, 0.0% interrupt, 82.0% idle

Mem: 65M Active, 295M Inact, 202M Wired, 48K Cache, 112M Buf, 2693M Free

Swap: 4096M Total, 4096M Free

 

PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND

11 root 171 ki31 0K 32K RUN 0 285.2H 93.07% {idle: cpu0}

11 root 171 ki31 0K 32K CPU3 3 261.6H 80.86% {idle: cpu3}

11 root 171 ki31 0K 32K CPU2 2 247.0H 78.56% {idle: cpu2}

11 root 171 ki31 0K 32K RUN 1 280.9H 65.67% {idle: cpu1}

6127 root 44 -15 7908K 6736K select 0 50.5H 3.76% {ipcad}

0 root -68 0 0K 72K - 2 80.9H 0.00% {em0 taskq}

0 root -68 0 0K 72K - 3 64.0H 0.00% {em1 taskq}

0 root -68 0 0K 72K - 1 31.0H 0.00% {dummynet}

12 root -32 - 0K 184K WAIT 0 121:51 0.00% {swi4: clock}

12 root -28 - 0K 184K WAIT 0 41:46 0.00% {swi5: +}

818 root 44 0 29172K 26176K select 0 31:16 0.00% snmpd

6127 root 44 -15 7908K 6736K nanslp 1 25:15 0.00% {ipcad}

17 root 44 - 0K 8K syncer 2 21:38 0.00% syncer

 

При этом никакой дополнительной пересборки не было, разьве что убран pf и жестко вкомпилен ipfw.

Share this post


Link to post
Share on other sites

подозреваю драйвер линух пишет какойто доголнительный еггог, типа "Е657854: плиз сич фак анд гугле" :)

у Вас трафик и так разнесен, если внимательно смотреть, {em1 taskq} прыгает по разным ядрам, просто оно одно, вот оно и загружено.

Топ во фре рисует "плоскую" картинку, в отличии от cat /proc/interrupts в линихе

Share this post


Link to post
Share on other sites
подозреваю драйвер линух пишет какойто доголнительный еггог, типа "Е657854: плиз сич фак анд гугле" :)

у Вас трафик и так разнесен, если внимательно смотреть, {em1 taskq} прыгает по разным ядрам, просто оно одно, вот оно и загружено.

Топ во фре рисует "плоскую" картинку, в отличии от cat /proc/interrupts в линихе

Тогда почему загружены только CPU0 и CPU3 в отличии от предыдущей картинки, где равномерно заргужены все ядра? Может быть попробовать увеличить net.isr.maxthreads? (то есть сделать их кол-во большим, чем кол-во ядер)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this