Перейти к содержимому
Калькуляторы

Загрузка только одного ядра CPU tc тормозит сервер

Проблема не в сетевых. Делайте ветвление фильтров tc.

1. У тебя 4000 правил, для классификации каждого пакета нужно среднестатистически сделать 2000 сопоставлений u32.

2. Ветвление хешами работает примерно так, к примеру ключем берем последний байт IP адреса, например он оказался равным 5, далее ищется таблица фильтров с номером 5 и там производятся сопоставления уже по u32 (каждый адерс там естественно последним байтом имеет 5-ку). В таблице 5 при сети на 1024 адреса будет 4 фильра u32, при 2048 8 фильтров и.т.д... Вот и считаем, на сети в 1024 адреса, для классификации 1 пакета требуется 5 сопоставлений... против 2000 на текущий момент.

 

Вобщем нужно вдумчиво прочитать материал LARTC посвященный этой теме.

Изменено пользователем SokolovS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#!/bin/sh

 

###############################################################################

# variables configuration

###############################################################################

 

TC=/sbin/tc

FI=be

# Free Ip range that not used in network

# configuration f.e: (x.x.255.x) - ff

# be (x.x.190.x)

 

###############################################################################

# some general initialization

###############################################################################

 

$TC qdisc del dev eth0 root 2>/dev/null

$TC qdisc del dev eth1 root 2>/dev/null

 

# qdisc root

$TC qdisc add dev eth0 root handle 1: htb default ${FI}fe r2q 1

$TC qdisc add dev eth1 root handle 1: htb default ${FI}fe r2q 1

 

###############################################################################

# eth0 (downstream)

###############################################################################

 

DEV=eth0

 

# making hash table for fast clients filtering, max table size is 256 entries

# fw filter does`nt support hashing, so we can use hashing of filters

# only on incoming traffic because for outgoung we uze fw filter

$TC filter add dev $DEV parent 1: prio 100 handle 2: protocol ip u32 divisor 256

 

# htb root class

$TC class add dev $DEV parent 1: classid 1:${FI}01 htb rate 1000Mbit

 

# default class ( all unclassified traffic goes here )

$TC class add dev $DEV parent 1:${FI}01 classid 1:${FI}fe htb rate 100Mbit prio 5

$TC qdisc add dev $DEV parent 1:${FI}fe handle 0x${FI}fe sfq perturb 10

 

# NetWork Local Traffic

$TC class add dev $DEV parent 1:${FI}01 classid 1:${FI}10 htb rate 400Mbit prio 10

$TC qdisc add dev $DEV parent 1:${FI}10 handle 0x${FI}10 sfq perturb 10

$TC filter add dev $DEV parent 1:0 protocol ip prio 100 u32 match ip src 80.80.80.0/20 classid 1:${FI}10

 

# p2p

$TC class add dev $DEV parent 1:${FI}01 classid 1:${FI}13 htb rate 10Mbit

$TC qdisc add dev $DEV parent 1:${FI}13 handle 0x${FI}13 sfq perturb 10

$TC filter add dev $DEV parent 1:0 protocol ip prio 50 handle 0xffffff fw classid 1:${FI}13

 

# filtering traffic to hashing tables by dst address

$TC filter add dev $DEV protocol ip parent 1: prio 100 u32 ht 800:: \

match ip dst 0/0 \

hashkey mask 0x000000ff at 16 \

link 2:

 

# Clients

 

# d952 - last 2 bytes from IP (*.*.217.82)

# {FI}10 10 or any another number

# ht 2:52: - hash table - 2: value of link value - 52: last byte of IP (*.*.*.82)

 

#<download>

 

# client:

$TC class add dev $DEV parent 1:${FI}01 classid 1:f520 htb rate 2048Kbit

$TC qdisc add dev $DEV parent 1:f520 handle 0xf520 pfifo limit 60

$TC filter add dev $DEV parent 1:0 protocol ip prio 100 u32 ht 2:20: match ip dst 80.80.80.32 classid 1:f520

.....

Может поможет мой кусок рабочего конфига.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема не в сетевых. Делайте ветвление фильтров tc.

1. У тебя 4000 правил, для классификации каждого пакета нужно среднестатистически сделать 2000 сопоставлений u32.

2. Ветвление хешами работает примерно так, к примеру ключем берем последний байт IP адреса, например он оказался равным 5, далее ищется таблица фильтров с номером 5 и там производятся сопоставления уже по u32 (каждый адерс там естественно последним байтом имеет 5-ку). В таблице 5 при сети на 1024 адреса будет 4 фильра u32, при 2048 8 фильтров и.т.д... Вот и считаем, на сети в 1024 адреса, для классификации 1 пакета требуется 5 сопоставлений... против 2000 на текущий момент.

 

Вобщем нужно вдумчиво прочитать материал LARTC посвященный этой теме.

Спасибо за помощь, стал понимать хоть как это работает!!!

 

2MEX2 Спасибо за конфиг, думаю теперь разберусь!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Появисаль новая проблема:

 

После добавления фильтра не могу его удалить, только убивать корневой класс и заново восстанавливать весь шейпер..

 

/sbin/tc filter del dev eth0 protocol ip parent 1: prio 23565

/sbin/tc filter del dev eth0 protocol ip parent ffff: prio 23564

 

удаляю фильтры, удаляется только :

filter parent 1: protocol ip pref 23565 u32

filter parent 1: protocol ip pref 23565 u32 fh 801: ht divisor 1

 

но в таблице остается фильтр, который потом плодится, при создани фильтра заново:

filter parent 1: protocol ip pref 5 u32 fh 2:15:803 order 2051 key ht 2 bkt 15 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a010015/ffffffff at 16

 

-------------------------------------------------------------------------------------------------------------

 

tc filter show dev eth0

filter parent 1: protocol ip pref 5 u32

filter parent 1: protocol ip pref 5 u32 fh 2: ht divisor 256

filter parent 1: protocol ip pref 5 u32 fh 2:15:800 order 2048 key ht 2 bkt 15 flowid 1:65ed

match 00000000/00000000 at 12

match 0a000015/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:15:801 order 2049 key ht 2 bkt 15 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a010015/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:15:802 order 2050 key ht 2 bkt 15 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a010015/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:15:803 order 2051 key ht 2 bkt 15 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a010015/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:15:804 order 2052 key ht 2 bkt 15 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a010015/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:16:800 order 2048 key ht 2 bkt 16 flowid 1:5c0d

match 00000000/00000000 at 12

match 0a000016/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 2:2d:800 order 2048 key ht 2 bkt 2d flowid 1:6791

match 00000000/00000000 at 12

match 0a02062d/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 800: ht divisor 1

filter parent 1: protocol ip pref 5 u32 fh 800::800 order 2048 key ht 800 bkt 0 link 2:

match 00000000/00000000 at 16

hash mask 000000ff at 16

filter parent 1: protocol ip pref 26093 u32

filter parent 1: protocol ip pref 26093 u32 fh 801: ht divisor 1

filter parent 1: protocol ip pref 26513 u32

filter parent 1: protocol ip pref 26513 u32 fh 807: ht divisor 1

 

--------------------------------------------------------------------------------------------------------

 

Повторное удаление фильтра выдает ошибку вида

 

/sbin/tc filter del dev eth0 protocol ip parent 1: prio 23565

RTNETLINK answers: Invalid argument

We have an error talking to the kernel

 

 

 

Вот так создаю фильтры:

 

/sbin/tc filter del dev eth0 protocol ip parent 1: prio 23565

/sbin/tc filter del dev eth0 protocol ip parent ffff: prio 23564

/sbin/tc class del dev eth0 parent 1: classid 1:5c0d

/sbin/tc qdisc del dev eth0 parent 1:5c0d handle 5c0d sfq perturb 10

 

/sbin/tc class add dev eth0 parent 1: classid 1:5c0d htb rate 4096Kibit

/sbin/tc qdisc add dev eth0 parent 1:5c0d handle 5c0d sfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1: prio 23565 u32 ht 2:15 match ip src 0.0.0.0/0 match ip dst 10.1.0.21 flowid 1:5c0d

/sbin/tc filter add dev eth0 protocol ip parent ffff: prio 23564 u32 match ip src 10.1.0.21 match ip dst 0.0.0.0/0 police rate 4096Kibit burst 12k drop flowid 1:

 

Так поднимаю корневой класс

INTERFACE='eth0';

 

TC="/sbin/tc"

TCQA="${TC} qdisc add dev ${INTERFACE}"

TCQD="${TC} qdisc del dev ${INTERFACE}"

 

$TCQD root &>/dev/null

$TCQD ingress &>/dev/null

 

$TCQA root handle 1: htb

$TCQA handle ffff: ingress

 

 

$TC filter add dev ${INTERFACE} parent 1:0 prio 5 protocol ip u32

$TC filter add dev ${INTERFACE} parent 1:0 prio 5 handle 2: protocol ip u32 divisor 256

$TC filter add dev ${INTERFACE} protocol ip parent 1:0 prio 5 u32 ht 800:: match ip dst 0/0 hashkey mask 0x000000ff at 16 link 2:

Изменено пользователем V@No

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нагрузка снизилась после введения хеширования, но если раньше были нагружены одинаково оба процессора, на которых висят оба интерфейса, то сейчас же ситуация перешла в то что загружен лишь один процессор, а второй на 50% от первого

 

top - 18:55:21 up 8 days, 15:04, 4 users, load average: 0.63, 0.61, 0.57

Tasks: 162 total, 1 running, 160 sleeping, 0 stopped, 1 zombie

Cpu0 : 6.1%us, 0.7%sy, 0.0%ni, 93.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Cpu1 : 3.0%us, 0.3%sy, 0.0%ni, 22.2%id, 0.0%wa, 0.3%hi, 74.1%si, 0.0%st

Cpu2 : 1.4%us, 0.3%sy, 0.0%ni, 68.4%id, 0.0%wa, 1.4%hi, 28.5%si, 0.0%st

Cpu3 : 16.3%us, 1.7%sy, 0.0%ni, 81.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 2066676k total, 1814284k used, 252392k free, 344644k buffers

Swap: 1951888k total, 0k used, 1951888k free, 945596k cached

 

 

Пологаю это ingress шейпер продолжает напрягать систему... как можно хешировать ингресс фильтры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ИМХО, лучше по старинке на 2 интерфейса раскидать. Но тогда естественно про NAT на этом сервере забыть.

А вобще по идее ingress так же должен раскидыватсья. Буквально на днях узнал про этот ingress, еще руки не дошли потестить.

Изменено пользователем SokolovS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ИМХО, лучше по старинке на 2 интерфейса раскидать. Но тогда естественно про NAT на этом сервере забыть.

А вобще по идее ingress так же должен раскидыватсья. Буквально на днях узнал про этот ingress, еще руки не дошли потестить.

в том и дело что нужно нат оставить на этой машине...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в том и дело что нужно нат оставить на этой машине...

завернуть ingress внутреннего интерфейса в ifb, не?

 

filter add dev eth0 parent ffff: protocol ip pref 3 u32 match u32 0 0 action mirred egress redirect dev ifb0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в том и дело что нужно нат оставить на этой машине...

завернуть ingress внутреннего интерфейса в ifb, не?

 

filter add dev eth0 parent ffff: protocol ip pref 3 u32 match u32 0 0 action mirred egress redirect dev ifb0

Насколько стабильно работает ifb ? После запуска ifb появилась проблема с кернел паник... ядро 2.6.18

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

c 2.6.18 работает очень не стабильно, пофиксили кажется в 2.6.20, а вообще лучше использовать ядро посвежее

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2.6.24 - ifb тоже крашился. 2.6.30 - работает прекрасно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.