dummy 8 Posted 2013-11-27 20:27:30 Share Posted 2013-11-27 20:27:30 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 т.е. уйду от маркировки пакетов, а буду рулить фильтрами ? или может есть другие варианты ? Link to post Share on other sites
KaYot 3,679 Posted 2013-11-27 20:35:45 Share Posted 2013-11-27 20:35:45 STG тут вообще не при чем, схема у вас дурацкая. Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc. Link to post Share on other sites
dummy 8 Posted 2013-11-27 22:08:46 Author Share Posted 2013-11-27 22:08:46 STG тут вообще не при чем, схема у вас дурацкая. Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc. о СТГ понятно за ответ - спасибо вопрос о хеш-фильтрах: с помощью них можно определить один класс (например с лимитом 1 мбит) и чтобы несколько клиентов получали каждый свой 1 мбит через этот класс ? или для каждого клиента надо определять свой класс ? Link to post Share on other sites
BUM 240 Posted 2013-11-27 23:08:17 Share Posted 2013-11-27 23:08:17 perf top - что говорит, кто грузит проц? Link to post Share on other sites
BUM 240 Posted 2013-11-27 23:22:10 Share Posted 2013-11-27 23:22:10 в 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 готовить? Link to post Share on other sites
KaYot 3,679 Posted 2013-11-28 09:19:26 Share Posted 2013-11-28 09:19:26 в iptables(3к правил это адъ)Может не умеете iptables готовить? Возможно не умею. А возможно трафик у вас смешной, при 1к pps и сотня тысяч правил работать будет сносно. Link to post Share on other sites
DarkSpider 36 Posted 2013-11-28 09:20:22 Share Posted 2013-11-28 09:20:22 (edited) То, что мы не "умеем готовить" 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 Edited 2013-11-28 09:24:33 by DarkSpider Link to post Share on other sites
madf 279 Posted 2013-11-28 12:25:56 Share Posted 2013-11-28 12:25:56 Плюсанул за ipset. Link to post Share on other sites
dummy 8 Posted 2013-11-28 12:42:20 Author Share Posted 2013-11-28 12:42:20 спасибо большое всем, буду разбираться Link to post Share on other sites
BUM 240 Posted 2013-11-28 13:03:23 Share Posted 2013-11-28 13:03:23 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%. Link to post Share on other sites
dummy 8 Posted 2013-11-28 13:53:09 Author Share Posted 2013-11-28 13:53:09 интересно просто, что быстрей работает: маркировка или фильтры (без хешей и других хитростей) ? и есть ли возможность прямого доступа к данным таблиц iptables, tc filter, tc class типа /proc/XXXX ? хотя-бы только для чтения Link to post Share on other sites
dummy 8 Posted 2013-12-02 04:42:10 Author Share Posted 2013-12-02 04:42:10 (edited) сделал: /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 может проблема в том, что я использую трансляцию адресов ? Edited 2013-12-02 06:15:04 by dummy Link to post Share on other sites
Пэтро 18 Posted 2013-12-02 07:38:44 Share Posted 2013-12-02 07:38:44 может проблема в том, что я использую трансляцию адресов ? Да. для этих целей и делают маркировку пакетов /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 Link to post Share on other sites
KaYot 3,679 Posted 2013-12-02 08:25:26 Share Posted 2013-12-02 08:25:26 Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется. Link to post Share on other sites
dummy 8 Posted 2013-12-02 10:03:17 Author Share Posted 2013-12-02 10:03:17 Да. для этих целей и делают маркировку пакетов /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 от этого же и пытаюсь уйти ) Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется. можно по-подробнее ? Link to post Share on other sites
DarkSpider 36 Posted 2013-12-02 14:36:54 Share Posted 2013-12-02 14:36:54 Для 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 Link to post Share on other sites
dummy 8 Posted 2013-12-05 14:38:16 Author Share Posted 2013-12-05 14:38:16 (edited) Для 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 статье - не получилось Edited 2013-12-05 14:45:14 by dummy Link to post Share on other sites
DarkSpider 36 Posted 2013-12-06 06:15:06 Share Posted 2013-12-06 06:15:06 Создание правил для tc (htb) делается при помощи специальной утилиты sc, написанной на perl. Как чего сделать можно почитать тут Link to post Share on other sites
Небесный 26 Posted 2013-12-07 16:03:14 Share Posted 2013-12-07 16:03:14 Отвечу в поддержку Спайдера - SC действительно пока выход для наших Линуксов (как говорит nightfly ). Кстати всем прювет, давно меня здесь небыло. Link to post Share on other sites
dummy 8 Posted 2013-12-09 08:45:06 Author Share Posted 2013-12-09 08:45:06 Разобрался, спасибо всемМои настройки шейпинга с использоанием хешей для нагруженных сетей (от 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 Критикуйте ! Link to post Share on other sites
dummy 8 Posted 2013-12-12 21:31:00 Author Share Posted 2013-12-12 21:31:00 Добавлю только, что mark/markup в OnConnect/OnDisconnect рассчитываются так: mark=$(echo $IP | awk ' BEGIN { FS="."} {printf "%x%02x\n",$3,$4+1}') markup=$mark Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now