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

FreeBSD 8.1 - ng_queueX на одном ядре

Добрый день, может кто подскажет?

 

Дано: FreeBSD 8.1-RELEASE (именно релиз), CPU Intel Core i5 CPU 760 @ 2.80GHz, сетвые Intel ET, обновленный драйвер igb (взят из пака от wawa.)

Индивидульаные настройки такие:

 

# cat /etc/sysctl.conf
net.inet.flowtable.enable=0
net.inet.ip.dummynet.expire=1
net.inet.ip.dummynet.hash_size=512
net.inet.ip.dummynet.io_fast=1
net.inet.ip.fw.dyn_max=65535
net.inet.ip.fw.one_pass=1

# cat /boot/loader.conf
kern.hz=2000
kern.maxusers=512
kern.ipc.nmbclusters=131072
net.graph.maxalloc=2048
hw.igb.rxd=1024
hw.igb.txd=1024
hw.igb.num_queues=4
hw.igb.lro=0
hw.igb.enable_msix=1
hw.igb.rx_process_limit=2048
hw.igb.fc_setting=0

# sysctl -a |grep dummynet
net.inet.ip.dummynet.io_pkt_drop: 84795758
net.inet.ip.dummynet.io_pkt_fast: 1410048755
net.inet.ip.dummynet.io_pkt: 3323982346
net.inet.ip.dummynet.queue_count: 0
net.inet.ip.dummynet.fsk_count: 18
net.inet.ip.dummynet.si_count: 305
net.inet.ip.dummynet.schk_count: 36
net.inet.ip.dummynet.tick_lost: 0
net.inet.ip.dummynet.tick_diff: 32002371
net.inet.ip.dummynet.tick_adjustment: 20236524
net.inet.ip.dummynet.tick_delta_sum: 284
net.inet.ip.dummynet.tick_delta: 500
net.inet.ip.dummynet.red_max_pkt_size: 1500
net.inet.ip.dummynet.red_avg_pkt_size: 512
net.inet.ip.dummynet.red_lookup_depth: 256
net.inet.ip.dummynet.expire_cycle: 0
net.inet.ip.dummynet.expire: 1
net.inet.ip.dummynet.debug: 0
net.inet.ip.dummynet.io_fast: 1
net.inet.ip.dummynet.pipe_byte_limit: 1048576
net.inet.ip.dummynet.pipe_slot_limit: 100
net.inet.ip.dummynet.hash_size: 512

 

На машине только терминация pptp-туннелей на mpd5.5 и шейп dummynet/tablearg. Трафик детский - около 50k:

            input        (Total)           output
   packets  errs idrops      bytes    packets  errs      bytes colls
       46K     0     0        28M        53K     0        38M     0
       45K     0     0        27M        50K     0        37M     0
       46K     0     0        28M        52K     0        38M     0

Cессий также мало:

# ifconfig  |grep ng |wc -l
     222

При этом всем загрузка ядер:

# top -PSHI                                                                                                                           
last pid: 85116;  load averages:  0.12,  0.12,  0.08                                                                                                             up 34+03:53:20  14:32:44
124 processes: 5 running, 92 sleeping, 27 waiting
CPU 0:  0.0% user,  0.0% nice,  2.2% system,  3.3% interrupt, 94.4% idle
CPU 1:  0.0% user,  0.0% nice, 60.0% system,  2.8% interrupt, 37.2% idle
CPU 2:  0.0% user,  0.0% nice,  1.7% system,  3.3% interrupt, 95.0% idle
CPU 3:  0.0% user,  0.0% nice,  2.8% system,  2.2% interrupt, 95.0% idle
Mem: 104M Active, 70M Inact, 202M Wired, 100K Cache, 210M Buf, 1567M Free
Swap:

  PID USERNAME PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   11 root     171 ki31     0K    64K CPU3    3 817.5H 100.00% {idle: cpu3}
   11 root     171 ki31     0K    64K CPU2    2 817.0H 100.00% {idle: cpu2}
   11 root     171 ki31     0K    64K RUN     0 813.4H 96.97% {idle: cpu0}
   11 root     171 ki31     0K    64K CPU1    1 812.8H 43.26% {idle: cpu1}
    0 root     -68    0     0K   224K -       2 187:29 31.45% {dummynet}
  965 root      48    -     0K    64K sleep   0  64:45  8.11% {ng_queue0}
  965 root      48    -     0K    64K sleep   1  65:23  7.28% {ng_queue2}
  965 root      48    -     0K    64K sleep   1  65:33  7.23% {ng_queue3}
  965 root      48    -     0K    64K sleep   0  64:25  6.49% {ng_queue1}
   12 root     -68    -     0K   432K WAIT    1  29:36  1.66% {irq257: igb0:que}
   12 root     -68    -     0K   432K WAIT    3  29:26  1.03% {irq259: igb0:que}
   12 root     -68    -     0K   432K WAIT    0  42:31  0.98% {irq256: igb0:que}
    0 root     -68    0     0K   224K -       3  34:27  0.98% {igb0 que}
   12 root     -68    -     0K   432K WAIT    2  27:01  0.83% {irq258: igb0:que}
   12 root     -68    -     0K   432K WAIT    2  17:11  0.83% {irq263: igb1:que}
   12 root     -68    -     0K   432K WAIT    0  19:00  0.68% {irq261: igb1:que}
   12 root     -68    -     0K   432K WAIT    3  29:35  0.63% {irq264: igb1:que}
   12 root     -68    -     0K   432K WAIT    1  25:22  0.29% {irq262: igb1:que}
61863 root      44    0 40180K 12280K select  1   1:38  0.05% {mpd5}

 

Сразу бросается в галаза, что все нити ng_queue висят на одном ядре:

CPU 1: 0.0% user, 0.0% nice, 60.0% system, 2.8% interrupt, 37.2% idle

0 root -68 0 0K 224K - 2 187:29 31.45% {dummynet}

965 root 48 - 0K 64K sleep 0 64:45 8.11% {ng_queue0}

965 root 48 - 0K 64K sleep 1 65:23 7.28% {ng_queue2}

965 root 48 - 0K 64K sleep 1 65:33 7.23% {ng_queue3}

965 root 48 - 0K 64K sleep 0 64:25 6.49% {ng_queue1}

 

Почему так? dummynеt отедает 31.45% от ядра, это нормально?

При этом ipfw/pipe такого вида:

 

IF_EXT="igb0"

${IPFW} pipe 21 config bw 250kbit/s queue 10 mask dst-ip 0xffffffff
${IPFW} pipe 22 config bw 250kbit/s queue 10 mask src-ip 0xffffffff
....
${IPFW} pipe 81 config bw 8Mbit/s mask dst-ip 0xffffffff
${IPFW} pipe 82 config bw 8Mbit/s mask src-ip 0xffffffff

${IPFW} add pipe tablearg ip from any to 'table(11)' in recv ${IF_EXT}
${IPFW} add pipe tablearg ip from 'table(12)' to any out xmit ${IF_EXT}
${IPFW} add allow ip from any to ${LOCAL_PPP} out xmit ng*
${IPFW} add allow ip from ${LOCAL_PPP} to any in recv ng*

# ipfw table 11 list  |wc -l
     219
# ipfw table 12 list  |wc -l
     219

# ipfw pipe show |grep active
sched 65607 type FIFO flags 0x1 512 buckets 69 active
sched 65608 type FIFO flags 0x1 512 buckets 73 active
sched 65617 type FIFO flags 0x1 512 buckets 5 active
sched 65557 type FIFO flags 0x1 512 buckets 1 active
sched 65618 type FIFO flags 0x1 512 buckets 5 active
sched 65558 type FIFO flags 0x1 512 buckets 1 active
sched 65628 type FIFO flags 0x1 512 buckets 6 active
sched 65627 type FIFO flags 0x1 512 buckets 7 active
sched 65567 type FIFO flags 0x1 512 buckets 0 active
sched 65638 type FIFO flags 0x1 512 buckets 5 active
sched 65568 type FIFO flags 0x1 512 buckets 0 active
sched 65637 type FIFO flags 0x1 512 buckets 5 active
sched 65578 type FIFO flags 0x1 512 buckets 32 active
sched 65577 type FIFO flags 0x1 512 buckets 32 active
sched 65587 type FIFO flags 0x1 512 buckets 0 active
sched 65588 type FIFO flags 0x1 512 buckets 0 active
sched 65598 type FIFO flags 0x1 512 buckets 34 active
sched 65597 type FIFO flags 0x1 512 buckets 34 active

Share this post


Link to post
Share on other sites

У нас вот так:

last pid: 63697; load averages: 1.58, 1.59, 1.54 up 110+12:48:48 22:10:02

127 processes: 14 running, 84 sleeping, 29 waiting

CPU 0: 0.4% user, 0.0% nice, 18.0% system, 34.1% interrupt, 47.6% idle

CPU 1: 0.8% user, 0.0% nice, 19.5% system, 24.1% interrupt, 55.6% idle

CPU 2: 0.0% user, 0.0% nice, 21.8% system, 21.4% interrupt, 56.8% idle

CPU 3: 0.8% user, 0.0% nice, 9.4% system, 19.5% interrupt, 70.3% idle

CPU 4: 0.8% user, 0.0% nice, 18.9% system, 0.8% interrupt, 79.6% idle

CPU 5: 0.4% user, 0.0% nice, 17.7% system, 0.0% interrupt, 81.9% idle

CPU 6: 1.9% user, 0.0% nice, 15.8% system, 0.8% interrupt, 81.5% idle

CPU 7: 0.4% user, 0.0% nice, 11.3% system, 0.4% interrupt, 88.0% idle

Mem: 349M Active, 1163M Inact, 580M Wired, 344K Cache, 822M Buf, 5755M Free

Swap: 8000M Total, 8000M Free

 

PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND

11 root 171 ki31 0K 16K CPU7 7 2530.9 90.19% idle: cpu7

14 root 171 ki31 0K 16K CPU4 4 2514.5 84.28% idle: cpu4

12 root 171 ki31 0K 16K RUN 6 2529.2 82.86% idle: cpu6

13 root 171 ki31 0K 16K RUN 5 2524.7 81.59% idle: cpu5

15 root 171 ki31 0K 16K RUN 3 2410.5 68.46% idle: cpu3

17 root 171 ki31 0K 16K CPU1 1 2276.3 58.40% idle: cpu1

16 root 171 ki31 0K 16K RUN 2 2276.0 53.27% idle: cpu2

18 root 171 ki31 0K 16K CPU0 0 2108.1 46.58% idle: cpu0

72 root -68 - 0K 16K CPU2 0 147.0H 22.75% em0 taskq

50 root -68 - 0K 16K WAIT 2 122.2H 16.36% irq262: igb0

48 root -68 - 0K 16K WAIT 1 123.5H 16.06% irq261: igb0

46 root -68 - 0K 16K CPU0 0 129.3H 15.97% irq260: igb0

89181 root 54 0 17164K 6524K select 7 144.2H 14.45% natd

52 root -68 - 0K 16K WAIT 3 119.9H 13.87% irq263: igb0

3 root -68 - 0K 16K CPU4 4 93.5H 11.87% ng_queue1

7 root -68 - 0K 16K sleep 2 93.3H 11.47% ng_queue5

4 root -68 - 0K 16K sleep 4 93.5H 11.38% ng_queue2

5 root -68 - 0K 16K sleep 1 93.4H 11.38% ng_queue3

2 root -68 - 0K 16K sleep 7 93.4H 11.38% ng_queue0

6 root -68 - 0K 16K sleep 5 93.2H 11.38% ng_queue4

8 root -68 - 0K 16K sleep 6 93.5H 11.28% ng_queue6

9 root -68 - 0K 16K sleep 1 93.2H 10.79% ng_queue7

#

# ifconfig |grep ng |wc -l

961

# uname -s -r -m

FreeBSD 7.3-RELEASE-p1 amd64

#

трафик 400мегов, выжрет наверное ещё 500. Тюнинга по нулям. Шейпим RADIUS-атрибутами.

Share this post


Link to post
Share on other sites
трафик 400мегов, выжрет наверное ещё 500. Тюнинга по нулям. Шейпим RADIUS-атрибутами.
ну это я так понимаю ng_car?

 

в любом случае, не объяснеят по чему все ng_queueX висят на одном ядре

Share this post


Link to post
Share on other sites

Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

Share this post


Link to post
Share on other sites
Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

Интересно, а как можно прибить dummynet к одному ядру, если у него PID 0?

Share this post


Link to post
Share on other sites
Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

тем не менее в топе

CPU 0: 0.0% user, 0.0% nice, 2.2% system, 3.3% interrupt, 94.4% idle

CPU 1: 0.0% user, 0.0% nice, 60.0% system, 2.8% interrupt, 37.2% idle

CPU 2: 0.0% user, 0.0% nice, 1.7% system, 3.3% interrupt, 95.0% idle

CPU 3: 0.0% user, 0.0% nice, 2.8% system, 2.2% interrupt, 95.0% idle

 

0 root -68 0 0K 224K - 2 187:29 31.45% {dummynet}

965 root 48 - 0K 64K sleep 0 64:45 8.11% {ng_queue0}

965 root 48 - 0K 64K sleep 1 65:23 7.28% {ng_queue2}

965 root 48 - 0K 64K sleep 1 65:33 7.23% {ng_queue3}

965 root 48 - 0K 64K sleep 0 64:25 6.49% {ng_queue1}

 

8.11 + 6.49 как то больше чем (2.2% system, 3.3% interrupt)

 

dummynet, как я понимаю бегает одним процессом, но это не объясняет почему он ест 32% от ядра

Edited by DemYaN

Share this post


Link to post
Share on other sites

То что все ng_queueX sleep на 0 и 1 ядрах ещё не значит что и работают они на тех же ядрах.

 

А % загрузки вещь относительная и зависит от способа измерения:

в качестве примера:

http://www.insidepro.com/kk/397/397r.shtml

Full disclose: Честная кража процессорного времени

 

 

Share this post


Link to post
Share on other sites
Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

Интересно, а как можно прибить dummynet к одному ядру, если у него PID 0?

 

на 7 он не 0, а на восьмерке...

 

# ps -p 0 -axcH -o lwp,command | egrep '\/dummynet' | while read lwp cmd; do echo /usr/bin/cpuset -l 3 -t $lwp; done
/usr/bin/cpuset -l 3 -t 100080

 

echo можно убрать.... ;)

 

 

 

Share this post


Link to post
Share on other sites
Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

Интересно, а как можно прибить dummynet к одному ядру, если у него PID 0?

8-stable# procstat -at | grep dummynet
    0 100026 kernel           dummynet           1   16 sleep   -         
8-stable# cpuset -t 100026 -l 0

 

Share this post


Link to post
Share on other sites
Прибейте к разным. cpuset Вам в руки.

 

(да и в Вашем топе они на 1 ядрах висят. на 0 и на 1)

Интересно, а как можно прибить dummynet к одному ядру, если у него PID 0?

8-stable# procstat -at | grep dummynet
    0 100026 kernel           dummynet           1   16 sleep   -         
8-stable# cpuset -t 100026 -l 0

st_re, make.kernel спасибо!

Share this post


Link to post
Share on other sites

ок, с ng_queue понятно - прибить на разные ядра

 

А как быть с dummynet, не многовато ли 32% на таком трафике с таким кол-вом сессий? Ведь dummynet крутится как один процесс и по ядрам его не раскидаешь - значит нужно как-то снижать потребление процессорного времени.

 

Share this post


Link to post
Share on other sites

Один процесс не означает что в нём один поток.

К ядрам прибиваются потоки и они же являются теми объектами, которым манипулирует планировщик потоков.

Процесс лишь "контейнер" для потоков, памяти, описателей.

 

Прибивание даже 1 потока может повысить быстродействие, за счёт того что не нужно будет таскать между ядрами, синхронизируя кеши всех уровней.

Share this post


Link to post
Share on other sites
Один процесс не означает что в нём один поток.

К ядрам прибиваются потоки и они же являются теми объектами, которым манипулирует планировщик потоков.

Процесс лишь "контейнер" для потоков, памяти, описателей.

 

Прибивание даже 1 потока может повысить быстродействие, за счёт того что не нужно будет таскать между ядрами, синхронизируя кеши всех уровней.

ок, это все понятно

 

Вопрос в другом, попробую перефразировать - является ли нормальным такое потребление процессорного времени dummynet'ом при трафике в 50kpps, 250 pptp-туннелях, шейпе dummynet/tablearg (dummynet не прибит к конкретному ядру) и процессоре класса Сore i5 760?

 

net.inet.ip.dummynet.io_fast=1

 

Ситуацию не меняет?

Параметр уcтановлен:

....
net.inet.ip.dummynet.io_fast: 1
....

Share this post


Link to post
Share on other sites

DemYaN

dummynet не прибит к конкретному ядру
Отсюда и нужно начинать, очень помогает.

Share this post


Link to post
Share on other sites
net.inet.ip.dummynet.io_fast=1

 

Ситуацию не меняет?

Параметр уcтановлен:

....
net.inet.ip.dummynet.io_fast: 1
....

Извините, не заметил

 

у Вас 50% все равно уходит в пайпы. Скорости, я так понимаю больше к 250к чем к 8 мегабитам (у Вас там такие примеры) ? И многие забиват свои каналы? Попробуйте поиграться ред-гред настройками, типа там для queue 10 , gred 0.002/5/9/0.1

 

 

тут, кстати, http://forum.nag.ru/forum/index.php?showtopic=58098, в 15 посте утверждается, что бывает обратный эффект. незнаю. just try it ;)

 

 

Share this post


Link to post
Share on other sites
DemYaN
dummynet не прибит к конкретному ядру
Отсюда и нужно начинать, очень помогает.

Не думал, что будет все так просто.... забираю назад весь свой скептицизм :)

Прибив dummynet к одному ядру, он опустился в top'e просто ниже приличного:

 

# top -PSH 
last pid: 52050;  load averages:  0.26,  0.21,  0.17                                                                                    up 36+10:46:46  21:26:10
126 processes: 6 running, 93 sleeping, 27 waiting
CPU 0:  0.0% user,  0.0% nice,  6.5% system,  3.2% interrupt, 90.3% idle
CPU 1:  0.0% user,  0.0% nice,  8.9% system,  3.3% interrupt, 87.8% idle
CPU 2:  0.0% user,  0.0% nice,  3.3% system,  1.6% interrupt, 95.1% idle
CPU 3:  0.0% user,  0.0% nice,  5.7% system,  4.1% interrupt, 90.2% idle
Mem: 116M Active, 76M Inact, 205M Wired, 210M Buf, 1546M Free
Swap:

  PID USERNAME PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
   11 root     171 ki31     0K    64K CPU0    0 863.7H 99.46% {idle: cpu0}
   11 root     171 ki31     0K    64K CPU2    2 868.3H 95.41% {idle: cpu2}
   11 root     171 ki31     0K    64K CPU3    3 869.3H 92.43% {idle: cpu3}
   11 root     171 ki31     0K    64K RUN     1 863.4H 88.92% {idle: cpu1}
  965 root      46    -     0K    64K RUN     1 155:16  4.49% {ng_queue1}
  965 root      46    -     0K    64K sleep   3 156:18  3.03% {ng_queue2}
  965 root      46    -     0K    64K sleep   2 156:32  2.93% {ng_queue3}
  965 root      46    -     0K    64K sleep   0 155:56  2.93% {ng_queue0}
   12 root     -68    -     0K   432K WAIT    1  69:00  2.25% {irq257: igb0:que}
   12 root     -68    -     0K   432K WAIT    3  68:50  1.86% {irq259: igb0:que}
   12 root     -68    -     0K   432K WAIT    3  71:41  1.46% {irq264: igb1:que}
   12 root     -68    -     0K   432K WAIT    0  95:59  1.42% {irq256: igb0:que}
    0 root     -68    0     0K   224K -       2  82:59  1.12% {igb0 que}
   12 root     -68    -     0K   432K WAIT    2  65:19  0.93% {irq258: igb0:que}
   12 root     -68    -     0K   432K WAIT    2  45:38  0.93% {irq263: igb1:que}
   12 root     -68    -     0K   432K WAIT    1  53:34  0.68% {irq262: igb1:que}
   12 root     -68    -     0K   432K WAIT    0  48:26  0.68% {irq261: igb1:que}
   12 root     -32    -     0K   432K WAIT    0 386:29  0.05% {swi4: clock}
    0 root     -68    0     0K   224K -       3 336:01  0.00% {dummynet}

 

Всем спасибо !

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