Перейти до

Высокая нагрузка ksoftirqd до 100%


Рекомендованные сообщения

Debian 8.0 (Jessie) x64

Stargazer 2.408

сетевые: Broadcom NetXtreme BCM5722 Gigabit Ethernet

интернет канал 200 Мбит, пользователей онлайн - до 500

подключение - через InetAccess

 

с недавнего времени в случайные моменты показывает почти 100% загрузку процесса ksoftirqd, при этом падает скорость и наблюдаются потери пакетов

почитал в инете, разнес прерывания сетевых карт по ядрам и уменьшил настройки таймаутов:

net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_generic_timeout = 60
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_tcp_timeout_close = 20
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_established = 40
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 20
net.netfilter.nf_conntrack_udp_timeout = 10
net.netfilter.nf_conntrack_udp_timeout_stream = 50

проблема стала реже, но все-равно бывает

нашел, что если в момент проблемы перезапустить биллинг (файрвол и шейпер) -  все ок (дня на 3-4)

позже отключал последовательно, шейпер, iptables, биллинг

после отключения файрвола - все сразу же ставало нормально

 

в iptables больше 3000 правил типа

iptables -t mangle -A FORWARD -d $ip -j MARK --set-mark $mark

и соответственно (привожу пример только для загрузки клиентов, отдача - аналогично)

/sbin/tc class add dev $int_if parent 1:2 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst $TC_BURST cburst $TC_CBURST quantum $TC_QUANTUM
/sbin/tc filter add dev $int_if parent 1: protocol ip prio 1 handle $mark fw classid 1:$mark

вопрос у меня к спецам: получится у меня снизить нагрузку, если поменяю приведенные выше команды на:

/sbin/tc class add dev $int_if parent 1:2 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst $TC_BURST cburst $TC_CBURST quantum $TC_QUANTUM
/sbin/tc filter add dev $int_if parent 1:0 prio 1 protocol ip u32 match ip dst $ip classid 1:$mark

т.е. уйду от маркировки пакетов, а буду рулить фильтрами ?

 

или может есть другие варианты ?

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

STG тут вообще не при чем, схема у вас дурацкая.

Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc.

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

STG тут вообще не при чем, схема у вас дурацкая.

Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc.

о СТГ понятно

за ответ - спасибо

вопрос о хеш-фильтрах: с помощью них можно определить один класс (например с лимитом 1 мбит) и чтобы несколько клиентов получали каждый свой 1 мбит через этот класс ? или для каждого клиента надо определять свой класс ?

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

в iptables(3к правил это адъ)

 

ой, да ладно, что я не так делаю:

root@bras1:~# cat /etc/debian_version
7.2
root@bras1:~# iptables -nvL -t mangle | wc -l
4374
root@bras1:~#

на Q9300, %Cpu(s): 3,0 us, 1,2 sy, 0,0 ni, 85,7 id, 4,1 wa, 0,0 hi, 6,1 si, 0,0 st

Events: 7K cycles
  5,87%  libc-2.13.so         [.] 0x892eb
  3,94%  bgpd                 [.] 0x615d7
  3,29%  [ip_tables]          [k] ipt_do_table
  1,58%  [processor]          [k] acpi_idle_do_entry
  1,43%  [kernel]             [k] do_raw_spin_lock
  1,43%  [e1000e]             [k] e1000_irq_enable
......

Может не умеете iptables готовить? ;)

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

 

в iptables(3к правил это адъ)

Может не умеете iptables готовить? ;)

 

Возможно не умею. А возможно трафик у вас смешной, при 1к pps и сотня тысяч правил работать будет сносно.
Ссылка на сообщение
Поделиться на других сайтах

То, что мы не "умеем готовить" iptables - это 100%
К тому же мы много чего еще "не умеем готовить"!
Но очень хотим научиться!
 
У меня вот такая же проблема появилась при таком траффике и количестве онлайн пользователей.
Я перешел на ipset + хеши tc htb.
ipset выкурил сам, а вот хеши не осилил.
Спасибо KaYot за наводку, - поставил скрипт, который сделал это за меня. Вот он.
Сейчас у меня онлайн около 1,5к пользователей и около 600-700 Мб траффика.
 
UPD.Да, кстати :
 

root@stg:# cat /etc/debian_version 
squeeze/sid

root@stg:# iptables -nvL -t mangle | wc -l
14
root@stg:# uname -a
Linux stg 3.1.8-spider #2 SMP Thu Jan 12 08:07:48 EET 2012 x86_64 GNU/Linux


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

ipset - это само собой :)
что касаемо мнгла, весь фокус в том что при прохождении трафика перечитывается вся таблица, пока не дойдет до нужного правила.
хак - попробуйте разбить таблицы на группы, например на подсети, привести к виду:
 

 
# iptables -nvL -t mangle
.........................

Chain FORWARD (policy ACCEPT xxxx packets, yyyy bytes)
 pkts bytes target     prot opt in     out     source               destination
xxx yyy shaper_marks  all  --  *      *       0.0.0.0/0            0.0.0.0/0
..................

Chain net-10.xxx.yyy.0 (2 references)
pkts bytes target prot opt in out source destination
qqq www MARK all -- * * 10.xxx.yyy.135 0.0.0.0/0 MARK set 0x58f
qqq www MARK all -- * * 0.0.0.0/0 10.xxx.yyy.135 MARK set 0x58e

.....
Chain net-10.xxx.zzz.0 (2 references)
pkts bytes target prot opt in out source destination
qqq www MARK all -- * * 10.xxx.zzz.26 0.0.0.0/0 MARK set 0x3a3
qqq www MARK all -- * * 0.0.0.0/0 10.xxx.zzz.26 MARK set 0x3a2

....

Chain shaper_marks (1 references)
pkts bytes target prot opt in out source destination
qqq www net-10.xxx.yyy.0 all -- * * 10.xxx.yyy.0/24 0.0.0.0/0
qqq www net-10.xxx.yyy.0 all -- * * 0.0.0.0/0 10.xxx.yyy.0/24
qqq www net-10.xxx.zzz.0 all -- * * 10.xxx.zzz.0/24 0.0.0.0/0
qqq www net-10.xxx.zzz.0 all -- * * 0.0.0.0/0 10.xxx.zzz.0/24
....

т.е. получается что пакетик от адресата 10.xxx.zzz.26 проходя через таблицу мангла не бежит по всей таблице, а структурировано падет в цепочку shaper_marks, далее проходит всего 3 правила и попадает в цепочку net-10.xxx.zzz.0.

тем самым вы получаете оптимизацию порядка 50%.

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

интересно просто, что быстрей работает: маркировка или фильтры (без хешей и других хитростей) ?

и есть ли возможность прямого доступа к данным таблиц iptables, tc filter, tc class типа /proc/XXXX ? хотя-бы только для чтения

Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

сделал:

/sbin/tc qdisc del dev $INT_IF root handle 1: htb
/sbin/tc qdisc add dev $INT_IF root handle 1: htb r2q $TC_R2Q default 0
/sbin/tc class add dev $INT_IF parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit burst 400kb cburst 400kb quantum 60000

# Local lan
mark=$MARK_LAN
speedkb=10
speedceil=50
tc class add dev $INT_IF parent 1: classid 1:$mark htb rate "$speedkb"mbit ceil "$speedceil"mbit  quantum 1600
tc filter add dev $INT_IF parent 1:0 pref 5  protocol ip u32 match ip dst $INT_NET match ip src $INT_NET classid 1:$mark

# Internet
mark=2
speedkb=$EXT_SPEED
speedceil=$EXT_SPEED
/sbin/tc class add dev $INT_IF parent 1:1 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst 300kb cburst 300kb quantum 50000

# для всех фильтр по 2 последним байтам адреса 10.1.xx.yy - в class (xx)(yy+1), где xx,yy - 16-ричные
# 10.1.1.1 - 102, 10.1.48.12 - 300d
tc filter add dev $INT_IF parent 1:0 protocol ip pref 10 handle 10 flow map key dst and 0xffff

при подключении клиента:

/sbin/tc class replace dev $int_if parent 1:2 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst $TC_BURST cburst $TC_CBURST quantum $TC_QUANTUM

Для входящего (для клиента) трафика - все ок

а для исходящего - не работает. через фильтр не попадает в нужный класс

там одно отличие:

# для всех фильтр по 2 последним байтам адреса 10.1.xx.yy - в class (xx)(yy+1), где xx,yy - 16-ричные
# 10.1.1.1 - 102, 10.1.48.12 - 300d
tc filter add dev $EXT_IF parent 1:0 protocol ip pref 10 handle 10 flow map key src and 0xffff

может проблема в том, что я использую трансляцию адресов ?

Відредаговано dummy
Ссылка на сообщение
Поделиться на других сайтах
может проблема в том, что я использую трансляцию адресов ?

 

 

Да. для этих целей и делают маркировку пакетов

 

/sbin/iptables -t mangle -A FORWARD -s $ip -j MARK --set-mark $mark

/sbin/tc filter add dev $extif parent 1: protocol ip prio 5 handle $mark fw classid 1:$classid 

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

Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется.

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

Да. для этих целей и делают маркировку пакетов

 

/sbin/iptables -t mangle -A FORWARD -s $ip -j MARK --set-mark $mark

/sbin/tc filter add dev $extif parent 1: protocol ip prio 5 handle $mark fw classid 1:$classid 

от этого же и пытаюсь уйти )

 

 

Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется.

можно по-подробнее ?

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

Для IP 192.168.6.20 у меня вот такие правила шейпинга (Download) и полисинга (Upload) такие правила :

TC rules for 192.168.6.20

Policing filter [eth0]:
filter protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid ffff:   match IP src 192.168.6.20/32 police 0xb4442 rate 56320Kibit burst 1760Kb mtu 2Kb action drop overhead 0b 
Input filter [eth0]:
filter parent 1: protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid 1:116 
  match IP dst 192.168.6.20/32

Shaping filter [eth0]:
filter parent 1: protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid 1:116 
  match IP dst 192.168.6.20/32

Shaping class [eth0]:
class htb 1:116 root leaf 116: prio 0 quantum 1500 rate 56320Kibit ceil 56320Kibit burst 1585b/8 mpu 0b overhead 0b cburst 1585b/8 mpu 0b overhead 0b level 0 
 Sent 61786963 bytes 61233 pkt (dropped 2, overlimits 0 requeues 0) 
 rate 13768bit 3pps backlog 0b 0p requeues 0 
 lended: 61232 borrowed: 0 giants: 0

Shaping qdisc [eth0]:
qdisc sfq 116: parent 1:116 limit 127p quantum 1514b flows 127/1024 perturb 20sec 
 Sent 61785515 bytes 61233 pkt (dropped 3, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
Ссылка на сообщение
Поделиться на других сайтах
Опубліковано: (відредаговано)

 

Для IP 192.168.6.20 у меня вот такие правила шейпинга (Download) и полисинга (Upload) такие правила :

TC rules for 192.168.6.20

Policing filter [eth0]:
filter protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid ffff:   match IP src 192.168.6.20/32 police 0xb4442 rate 56320Kibit burst 1760Kb mtu 2Kb action drop overhead 0b 
Input filter [eth0]:
filter parent 1: protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid 1:116 
  match IP dst 192.168.6.20/32

Shaping filter [eth0]:
filter parent 1: protocol ip pref 10 u32 fh 101:14:800 order 2048 key ht 101 bkt 14 flowid 1:116 
  match IP dst 192.168.6.20/32

Shaping class [eth0]:
class htb 1:116 root leaf 116: prio 0 quantum 1500 rate 56320Kibit ceil 56320Kibit burst 1585b/8 mpu 0b overhead 0b cburst 1585b/8 mpu 0b overhead 0b level 0 
 Sent 61786963 bytes 61233 pkt (dropped 2, overlimits 0 requeues 0) 
 rate 13768bit 3pps backlog 0b 0p requeues 0 
 lended: 61232 borrowed: 0 giants: 0

Shaping qdisc [eth0]:
qdisc sfq 116: parent 1:116 limit 127p quantum 1514b flows 127/1024 perturb 20sec 
 Sent 61785515 bytes 61233 pkt (dropped 3, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

Спасибо

если не сложно, можно увидеть конкретные команды по настройке шейпинга (исходящего) для 1 клиента ?

и фильтрацию (filter) и сами классы

я так понимаю, в этом примере хеши не используются ?

 

попытался сделать по этой http://unixforum.org/index.php?showtopic=123039 статье -  не получилось

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

Создание правил для tc (htb) делается при помощи специальной утилиты sc, написанной на perl.

Как чего сделать можно почитать тут

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

Отвечу в поддержку Спайдера - SC действительно пока выход для наших Линуксов (как говорит nightfly :)  ).

 

 

Кстати всем прювет, давно меня здесь небыло.  :ph34r:

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

Разобрался, спасибо всем
Мои настройки шейпинга с использоанием хешей для нагруженных сетей (от 300 мбит)
может кому пригодятся )

Общие константы, параметры (/etc/stargazer/IFACES)

#внешний интерфейс (интернет)
EXT_IF=eth0
EXT_IP=xx.xx.xx.xx
EXT_ROUTE=xx.xx.xx.xx
EXT_SPEED=xxxxxx
EXT_NET=xx.xx.xx.xx/xx
# интерфейс для шейпера
EXT_IF_TC=ifb0

# внутренний (лок.сеть)
INT_NET=10.0.0.0/8
INT_IF=eth1

MARK_LAN=56
TC_BURST=50k
TC_CBURST=50k
TC_R2Q=10

Инициализация шейпера:

#!/bin/bash
. "/etc/stargazer/IFACES"
####################
# downloads
####################
/sbin/tc qdisc del dev $INT_IF root handle 1: htb
/sbin/tc qdisc add dev $INT_IF root handle 1: htb r2q $TC_R2Q default 0
/sbin/tc class add dev $INT_IF parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit burst 400kb cburst 400kb quantum 60000

# Local lan
mark=$MARK_LAN
speedkb=10
speedceil=50
tc class add dev $INT_IF parent 1: classid 1:$mark htb rate "$speedkb"mbit ceil "$speedceil"mbit  quantum 1600
tc filter add dev $INT_IF parent 1:0 pref 5  protocol ip u32 match ip dst $INT_NET match ip src $INT_NET classid 1:$mark

# Internet
mark=2
speedkb=$EXT_SPEED
speedceil=$EXT_SPEED
/sbin/tc class add dev $INT_IF parent 1:1 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst 300kb cburst 300kb quantum 50000

# для всех фильтр по 2 последним байтам адреса 10.1.xx.yy - в class (xx)(yy+1), где xx,yy - 16-ричные
# 10.1.1.1 - 102, 10.1.48.12 - 300d
tc filter add dev $INT_IF parent 1:0 protocol ip pref 10 handle 10 flow map key dst and 0xffff
#tc filter add dev $iface parent 1:0 protocol ip handle 1 pref 32 flow map key dst addend -10.1.0.0 divisor 65536
####################
# /downloads
####################

####################
# upload
####################
/sbin/tc qdisc del dev $EXT_IF root handle 1: htb
/sbin/tc qdisc del dev $INT_IF ingress
/sbin/tc filter del dev $INT_IF parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $EXT_IF_TC
/sbin/tc qdisc del dev $EXT_IF_TC root handle 1: htb r2q $TC_R2Q default 0

#1. Подключаем модуль ядра для ifb
modprobe ifb
#2. Поднимаем интерфейс ifb0
/sbin/ip link set dev $EXT_IF_TC up
#3. Создаем корневую дисциплину для входящего трафика на интерфейсе eth1
/sbin/tc qdisc add dev $INT_IF ingress
#4. Теперь непосредственно заворачиваем трафик в ifb0
/sbin/tc filter add dev $INT_IF parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $EXT_IF_TC
#5. А далее по аналогии с исходящим трафиком с интерфейса eth1

/sbin/tc qdisc add dev $EXT_IF_TC root handle 1: htb r2q $TC_R2Q default 0
/sbin/tc class add dev $EXT_IF_TC parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit burst 400k cburst 400k quantum 60000

# Internet
mark=2
speedkb=$EXT_SPEED
speedceil=$EXT_SPEED
/sbin/tc class add dev $EXT_IF_TC parent 1:1 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst 300k cburst 300k quantum 50000
#/sbin/tc class add dev $int_iface parent 1:1 classid 1:$mark htb rate "$speedkb"mbit

# для всех фильтр по 2 последним байтам адреса
/sbin/tc filter add dev $EXT_IF_TC parent 1:0 protocol ip pref 10 handle 1 flow map key src and 0xffff

####################
# /upload
####################

# в OnConnect

. "/etc/stargazer/IFACES"
/sbin/tc class replace dev $INT_IF parent 1:2 classid 1:$mark htb rate "$speedkb"kbit ceil "$speedceil"kbit burst $TC_BURST cburst $TC_CBURST quantum $TC_QUANTUM
/sbin/tc class replace dev $EXT_IF_TC parent 1:2 classid 1:$markup htb rate "$speedup"kbit ceil "$speedupceil"kbit burst $TC_BURST cburst $TC_CBURST quantum $TC_QUANTUM

# в OnDisconnect

. "/etc/stargazer/IFACES"
/sbin/tc class del dev $INT_IF parent 1:2 classid 1:$mark htb rate "$rate"kbit   burst $TC_BURST cburst $TC_CBURST
/sbin/tc class del dev $EXT_IF_TC parent 1:2 classid 1:$markup htb rate "$rateup"kbit  burst $TC_BURST cburst $TC_CBURST

Ньюансы:

- использую НАТ

- при этих настройках адреса всех клиентов должны быть в диапазоне ххх.ххх.0.0/16 (у меня 10.1.0.0/16)

- на внутреннем интерфейсе висят 20 вланов (10.1.xxx.0/24), но шейпинг делаю для основного: eth1

 

Критикуйте ! :)

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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...