dummy 8 Опубликовано: 2013-11-27 20:27:30 Share Опубликовано: 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 т.е. уйду от маркировки пакетов, а буду рулить фильтрами ? или может есть другие варианты ? Ссылка на сообщение Поделиться на других сайтах
KaYot 3 707 Опубліковано: 2013-11-27 20:35:45 Share Опубліковано: 2013-11-27 20:35:45 STG тут вообще не при чем, схема у вас дурацкая. Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc. Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-11-27 22:08:46 Автор Share Опубліковано: 2013-11-27 22:08:46 STG тут вообще не при чем, схема у вас дурацкая. Уберите полностью всю маркировку в iptables(3к правил это адъ), она вообще не нужна. Переделайте правила tc, math не по mark а классически по src/dst IP. Ну и добавьте хеш-фильтры в tc. о СТГ понятно за ответ - спасибо вопрос о хеш-фильтрах: с помощью них можно определить один класс (например с лимитом 1 мбит) и чтобы несколько клиентов получали каждый свой 1 мбит через этот класс ? или для каждого клиента надо определять свой класс ? Ссылка на сообщение Поделиться на других сайтах
BUM 240 Опубліковано: 2013-11-27 23:08:17 Share Опубліковано: 2013-11-27 23:08:17 perf top - что говорит, кто грузит проц? Ссылка на сообщение Поделиться на других сайтах
BUM 240 Опубліковано: 2013-11-27 23:22:10 Share Опубліковано: 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 готовить? Ссылка на сообщение Поделиться на других сайтах
KaYot 3 707 Опубліковано: 2013-11-28 09:19:26 Share Опубліковано: 2013-11-28 09:19:26 в iptables(3к правил это адъ)Может не умеете iptables готовить? Возможно не умею. А возможно трафик у вас смешной, при 1к pps и сотня тысяч правил работать будет сносно. Ссылка на сообщение Поделиться на других сайтах
DarkSpider 36 Опубліковано: 2013-11-28 09:20:22 Share Опубліковано: 2013-11-28 09:20:22 (відредаговано) То, что мы не "умеем готовить" 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 Відредаговано 2013-11-28 09:24:33 DarkSpider Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2013-11-28 12:25:56 Share Опубліковано: 2013-11-28 12:25:56 Плюсанул за ipset. Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-11-28 12:42:20 Автор Share Опубліковано: 2013-11-28 12:42:20 спасибо большое всем, буду разбираться Ссылка на сообщение Поделиться на других сайтах
BUM 240 Опубліковано: 2013-11-28 13:03:23 Share Опубліковано: 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%. Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-11-28 13:53:09 Автор Share Опубліковано: 2013-11-28 13:53:09 интересно просто, что быстрей работает: маркировка или фильтры (без хешей и других хитростей) ? и есть ли возможность прямого доступа к данным таблиц iptables, tc filter, tc class типа /proc/XXXX ? хотя-бы только для чтения Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-12-02 04:42:10 Автор Share Опубліковано: 2013-12-02 04:42:10 (відредаговано) сделал: /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 может проблема в том, что я использую трансляцию адресов ? Відредаговано 2013-12-02 06:15:04 dummy Ссылка на сообщение Поделиться на других сайтах
Пэтро 18 Опубліковано: 2013-12-02 07:38:44 Share Опубліковано: 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 Ссылка на сообщение Поделиться на других сайтах
KaYot 3 707 Опубліковано: 2013-12-02 08:25:26 Share Опубліковано: 2013-12-02 08:25:26 Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется. Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-12-02 10:03:17 Автор Share Опубліковано: 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 от этого же и пытаюсь уйти ) Вовсе не обязательно, можно просто полисить на том же внутреннем интерфейсе. Для исходящего трафика на комфорте серфинга это совсем не скажется. можно по-подробнее ? Ссылка на сообщение Поделиться на других сайтах
DarkSpider 36 Опубліковано: 2013-12-02 14:36:54 Share Опубліковано: 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 Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-12-05 14:38:16 Автор Share Опубліковано: 2013-12-05 14:38:16 (відредаговано) Для 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 статье - не получилось Відредаговано 2013-12-05 14:45:14 dummy Ссылка на сообщение Поделиться на других сайтах
DarkSpider 36 Опубліковано: 2013-12-06 06:15:06 Share Опубліковано: 2013-12-06 06:15:06 Создание правил для tc (htb) делается при помощи специальной утилиты sc, написанной на perl. Как чего сделать можно почитать тут Ссылка на сообщение Поделиться на других сайтах
Небесный 26 Опубліковано: 2013-12-07 16:03:14 Share Опубліковано: 2013-12-07 16:03:14 Отвечу в поддержку Спайдера - SC действительно пока выход для наших Линуксов (как говорит nightfly ). Кстати всем прювет, давно меня здесь небыло. Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-12-09 08:45:06 Автор Share Опубліковано: 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 Критикуйте ! Ссылка на сообщение Поделиться на других сайтах
dummy 8 Опубліковано: 2013-12-12 21:31:00 Автор Share Опубліковано: 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 Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас