LINUX.ORG.RU
ФорумAdmin

Подскажите пожалуйста куда рыть, не могу оптимизировать шейпер tc...

 , ,


0

1

Уважаемые знатоки помогите решить проблему стоит cent 6.3, есть два роутера на первом в пик 95000 соеденений на втором 125000... На первом роутере пинг 0-1мс в пик потерь нет, на втором пинг 1-10мс 6% потерь, с 50 пакетов, скорость плохо режиться как только я тормажу шейпер, пинг спадает потерь нет... Изначально скрипт был без хэш таблиц переписав на хэш таблицы я надеялся проблема уйдёт, но нет.. Я написал вот такой скрипт:

stop > /dev/null 2>&1
#Добавление корневых дисциплин
#in
${TC} qdisc add dev eth1 root handle 1: htb
#out
${TC} qdisc add dev eth0 root handle 1: htb
#Добавление корневых классов
#in
${TC} class add dev eth1 parent 1: classid 1:1 htb rate 1024mbit
#out
${TC} class add dev eth0 parent 1: classid 1:1 htb rate 1024mbit
#Добавление хэш-таблиц на каждую подсеть
${CAT} ${NETS} | ${SED} -r 's/192\.168\.([0-9]{1,2}).{1,}/\1/' | while read 'seg'
do
${TC} filter add dev eth1 parent 1: prio 1 handle ${seg}: protocol ip u32 divisor 256
${TC} filter add dev eth1 parent 1: protocol ip u32 ht 800:: match ip dst 192.168.${seg}.0/24 hashkey mask 0x000000ff at 16 link ${seg}:
done
${CAT} ${DATA} ${DATAEX} | while read 'ip' 'speed'
do
local THREEOC=`${ECHO} ${ip} | $SED -r 's/192\.168\.([0-9]{1,2}).{1,}/\1/'`
local THREEOCHEX=`${PRINTF} '%x\n' ${THREEOC}`
local FOUROC=`${ECHO} ${ip} | ${SED} -r 's/192\.168\.[0-9]{1,2}.([0-9]{1,3})/\1/'`
local FOUROCHEX=`${PRINTF} '%x\n' ${FOUROC}`
local ID=`${PRINTF} '%x\n' ${THREEOC}${FOUROC}`
#in
#Добавление классов для каждого ip
${TC} class add dev eth1 parent 1:1 classid 1:${ID} htb rate ${speed}kbit ceil ${speed}kbit prio 2 quantum 15365
${TC} qdisc add dev eth1 parent 1:${ID} handle ${ID}: sfq perturb 10
${TC} filter add dev eth1 protocol ip prio 2 u32 ht ${THREEOC}:${FOUROCHEX}: match ip dst ${ip}/32 flowid 1:${ID}
#out
#Добавление классов для каждого ip
${TC} class add dev eth0 parent 1: classid 1:${ID} htb rate $[speed/2]kbit ceil $[speed/2]kbit prio 2 quantum 15365
${TC} qdisc add dev eth0 parent 1:${ID} handle ${ID}: sfq perturb 10
${TC} filter add dev eth0 parent 1: protocol ip prio 2 u32 ht 800:: match ip src ${ip}/32 flowid 1:${ID}
#Дублируем списки для дальнейшей проверки
${CAT} ${DATA} > ${DATA}.chk
${CAT} ${DATAEX} > ${DATAEX}.chk
#Сообщение в лог
${ECHO} "${DATE} $0  Шейпер запущен..." >> ${LOG}
done

А сколько всего ip-адресов шейпится то? И проблема с ping-ом возникает не зависимо от загруженности канала.

P.S. А почему ″rate 1024mbit″, а не 1000mbit?

mky ★★★★★ ()

Приведите скрипт целиком, а лучше правила которые он генерирует. Покажите ethtool -S для проблемного роутера.

ventilator ★★★ ()
Ответ на: комментарий от mky

И правда должна быть 1000mbit, исправил... На первом роутере для сравнения ~1200 на втором ~1500, загруженость не зависима потому, что первый роутер чувствует себя отлично да и магистраль не до потолка загруженна...

THEDECAL ()
Ответ на: комментарий от ventilator

ethtool -s eth0 eth1

[root@router-2 bin]# ethtool -S eth0
NIC statistics:
     rx_packets: 12500288405
     tx_packets: 9814973500
     rx_bytes: 14129686777576
     tx_bytes: 3983541188738
     rx_broadcast: 11037884
     tx_broadcast: 1825216
     rx_multicast: 3609
     tx_multicast: 3559
     rx_errors: 0
     tx_errors: 0
     tx_dropped: 0
     multicast: 3609
     collisions: 0
     rx_length_errors: 0
     rx_over_errors: 0
     rx_crc_errors: 0
     rx_frame_errors: 0
     rx_no_buffer_count: 220398453
     rx_missed_errors: 68131707
     tx_aborted_errors: 0
     tx_carrier_errors: 0
     tx_fifo_errors: 0
     tx_heartbeat_errors: 0
     tx_window_errors: 0
     tx_abort_late_coll: 0
     tx_deferred_ok: 0
     tx_single_coll_ok: 0
     tx_multi_coll_ok: 0
     tx_timeout_count: 0
     tx_restart_queue: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_align_errors: 0
     tx_tcp_seg_good: 92995
     tx_tcp_seg_failed: 0
     rx_flow_control_xon: 0
     rx_flow_control_xoff: 0
     tx_flow_control_xon: 0
     tx_flow_control_xoff: 0
     rx_long_byte_count: 14129686777576
     rx_csum_offload_good: 12250300958
     rx_csum_offload_errors: 0
     rx_header_split: 0
     alloc_rx_buff_failed: 0
     tx_smbus: 46954
     rx_smbus: 11059810
     dropped_smbus: 28
     rx_dma_failed: 0
     tx_dma_failed: 0
[root@router-2 bin]# ethtool -S eth1
NIC statistics:
     rx_packets: 10027264269
     tx_packets: 12564442877
     rx_bytes: 4178482853385
     tx_bytes: 14195679973165
     rx_broadcast: 11299005
     tx_broadcast: 22585240
     rx_multicast: 17288
     tx_multicast: 201
     rx_errors: 1918
     tx_errors: 0
     tx_dropped: 0
     multicast: 17288
     collisions: 0
     rx_length_errors: 1913
     rx_over_errors: 0
     rx_crc_errors: 4
     rx_frame_errors: 0
     rx_no_buffer_count: 22486566
     rx_missed_errors: 633890
     tx_aborted_errors: 0
     tx_carrier_errors: 0
     tx_fifo_errors: 0
     tx_heartbeat_errors: 0
     tx_window_errors: 0
     tx_abort_late_coll: 0
     tx_deferred_ok: 0
     tx_single_coll_ok: 0
     tx_multi_coll_ok: 0
     tx_timeout_count: 0
     tx_restart_queue: 45
     rx_long_length_errors: 1911
     rx_short_length_errors: 2
     rx_align_errors: 0
     tx_tcp_seg_good: 666
     tx_tcp_seg_failed: 0
     rx_flow_control_xon: 0
     rx_flow_control_xoff: 0
     tx_flow_control_xon: 0
     tx_flow_control_xoff: 0
     rx_long_byte_count: 4178482853385
     rx_csum_offload_good: 9951377898
     rx_csum_offload_errors: 49616
     rx_header_split: 0
     alloc_rx_buff_failed: 0
     tx_smbus: 0
     rx_smbus: 0
     dropped_smbus: 0
     rx_dma_failed: 0
     tx_dma_failed: 0
THEDECAL ()
Ответ на: комментарий от ventilator

Весь скрипт

#!/bin/bash -x
CONFDIR='/usr/local/accnt/conf/'
NETS="${CONFDIR}cli_nets.lst"
DATA="${CONFDIR}unlimit.dat"
DATAEX="${CONFDIR}unlimit_exceptions.dat"
LOG="/var/log/messages"
TC=`which 'tc'`
ECHO=`which 'echo'`
SED=`which 'sed'`
DATE=`which 'date'`
DATE=`${DATE} '+%b %d %T'`
CAT=`which 'cat'`
PRINTF=`which 'printf'`
stop() #Функция остановки шейпера
{
	${TC} qdisc del dev eth1 root > /dev/null 2>&1
	${TC} qdisc del dev eth0 root > /dev/null 2>&1		
	#
	#Сообщение в лог
	${ECHO} "${DATE} $0  Шейпер остановлен..." >> ${LOG}
}
start() #Функция старта шейпера
{
	stop > /dev/null 2>&1
	#
	#Добавление корневых дисциплин
	#in
	${TC} qdisc add dev eth1 root handle 1: htb
	#out
	${TC} qdisc add dev eth0 root handle 1: htb
	#
	#Добавление корневых классов
	#in
	${TC} class add dev eth1 parent 1: classid 1:1 htb rate 1000mbit
	#out
	${TC} class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
	#
	#Добавление хэш-таблиц на каждую подсеть
	${CAT} ${NETS} | ${SED} -r 's/192\.168\.([0-9]{1,2}).{1,}/\1/' | while read 'seg'
	do
		${TC} filter add dev eth1 parent 1: prio 1 handle ${seg}: protocol ip u32 divisor 256
		${TC} filter add dev eth1 parent 1: protocol ip u32 ht 800:: match ip dst 192.168.${seg}.0/24 hashkey mask 0x000000ff at 16 link ${seg}:
	done
	${CAT} ${DATA} ${DATAEX} | while read 'ip' 'speed'
	do
		local THREEOC=`${ECHO} ${ip} | $SED -r 's/192\.168\.([0-9]{1,2}).{1,}/\1/'`
		local THREEOCHEX=`${PRINTF} '%x\n' ${THREEOC}`
		local FOUROC=`${ECHO} ${ip} | ${SED} -r 's/192\.168\.[0-9]{1,2}.([0-9]{1,3})/\1/'`
		local FOUROCHEX=`${PRINTF} '%x\n' ${FOUROC}`
		local ID=`${PRINTF} '%x\n' ${THREEOC}${FOUROC}`
		#
		#in
		#Добавление классов для каждого ip
		${TC} class add dev eth1 parent 1:1 classid 1:${ID} htb rate ${speed}kbit ceil ${speed}kbit prio 2 quantum 15365
		${TC} qdisc add dev eth1 parent 1:${ID} handle ${ID}: sfq perturb 10
		${TC} filter add dev eth1 protocol ip prio 2 u32 ht ${THREEOC}:${FOUROCHEX}: match ip dst ${ip}/32 flowid 1:${ID}
		#out
		#Добавление классов для каждого ip
		${TC} class add dev eth0 parent 1: classid 1:${ID} htb rate $[speed/2]kbit ceil $[speed/2]kbit prio 2 quantum 15365
		${TC} qdisc add dev eth0 parent 1:${ID} handle ${ID}: sfq perturb 10
		${TC} filter add dev eth0 parent 1: protocol ip prio 2 u32 ht 800:: match ip src ${ip}/32 flowid 1:${ID}
		#
		#Дублируем списки для дальнейшей проверки
		${CAT} ${DATA} > ${DATA}.chk
		${CAT} ${DATAEX} > ${DATAEX}.chk
		#
		#Сообщение в лог
		${ECHO} "${DATE} $0  Шейпер запущен..." >> ${LOG}
	done
}
check() #Функция проверки новых ip либо новых скоростей
{
	local GREP=`which 'grep'`
	local DIFF=`which 'diff'`
	${DIFF} ${DATA} ${DATA}.chk | ${GREP} '<' | ${SED} -r 's/<//' > ${DATA}.tmp
	${DIFF} ${DATAEX} ${DATAEX}.chk | ${GREP} '<' | ${SED} -r 's/<//' > ${DATAEX}.tmp
	local CHKFILE=`${CAT} ${DATA}.tmp ${DATAEX}.tmp`
	if [ "${CHKFILE}" ]
	then
		${CAT} ${DATA}.tmp ${DATAEX}.tmp | while read 'ip' 'speed'
		do
			local THREEOC=`${ECHO} ${ip} | ${SED} -r 's/192\.168\.([0-9]{1,2}).{1,}/\1/'`
			local THREEOCHEX=`${PRINTF} '%x\n' ${THREEOC}`
			local FOUROC=`${ECHO} ${ip} | ${SED} -r 's/192\.168\.[0-9]{1,2}.([0-9]{1,3})/\1/'`
			local FOUROCHEX=`${PRINTF} '%x\n' ${FOUROC}`
			local ID=`${PRINTF} '%x\n' ${THREEOC}${FOUROC}`
			#
			#Добавляем новые правила
			#in
			${TC} class replace dev eth1 parent 1:1 classid 1:${ID} htb rate ${speed}kbit ceil ${speed}kbit prio 2 quantum 15365
			${TC} qdisc replace dev eth1 parent 1:${ID} handle ${ID}: sfq perturb 10
			${TC} filter replace dev eth1 protocol ip prio 2 u32 ht ${THREEOC}:${FOUROCHEX}: match ip dst ${ip}/32 flowid 1:${ID}
			#out
			${TC} class replace dev eth0 parent 1: classid 1:${ID} htb rate $[speed/2]kbit ceil $[speed/2]kbit prio 2 quantum 15365
			${TC} qdisc replace dev eth0 parent 1:${ID} handle ${ID}: sfq perturb 10
			${TC} filter replace dev eth0 parent 1: protocol ip prio 2 u32 ht 800:: match ip src ${ip}/32 flowid 1:${ID}
			#
		done
		#Сообщение в лог
		${ECHO} "${DATE} $0  Шейпер изменился..." >> ${LOG}
		#
		#Дублируем списки для дальнейшей проверки
		${CAT} ${DATA} > ${DATA}.chk
		${CAT} ${DATAEX} > ${DATAEX}.chk
		#
	else
		#
		#Сообщение в лог
		${ECHO} "${DATE} $0 Шейпер не изменился..." >> ${LOG}
	fi
	#Удаляем временные файлы
	#`which 'rm'` -f ${DATA}.tmp ${DATAEX}.tmp
}
show() #Функция отображения конфигураций шейпера
{
	${TC} -d -s qdisc show dev eth1 | $SED "s/^/eth1 /"
	${ECHO} "eth1 - Classes"
	${TC} -d -s class show dev eth1 | $SED "s/^/eth1 /"
	${ECHO} "eth1 - Filters"
	${TC} -d -s filter show dev eth1 | $SED "s/^/eth1 /"
	${ECHO} eth0
	${TC} -d -s qdisc show dev eth0 | $SED "s/^/eth0 /"
	${ECHO} "eth1 - Classes"
	${TC} -d -s class show dev eth0 | $SED "s/^/eth0 /"
	${ECHO} "eth1 - Filters"
	${TC} -d -s filter show dev eth0 | $SED "s/^/eth0 /"
	${ECHO} eth1
}
case "$1" in
	stop)
		'stop'
	;;
	start)
		'start'
	;;
	show)
		'show'
	;;
	check)
		'check'
	;;
	*)
		${ECHO} "Используеться: {start | stop | show | check}"
		exit 1
	;;
esac
THEDECAL ()
Ответ на: комментарий от THEDECAL

Первое что приходит в голову: Вы делаете для каждой /24 сети свою таблицу, но трафик в эти таблицы заворачиваете линейными правилами:

${TC} filter add dev eth1 parent 1: protocol ip u32 ht 800:: match ip dst 192.168.${seg}.0/24 hashkey mask 0x000000ff at 16 link ${seg}:

Таким образом с ростом кол-ва сетей падает произвотельность. Сколько сетей у вас сейчас? Я делаю три уровня хештаблиц для(у меня нет сетей с одинаковыми тремя октетами).

ventilator ★★★ ()
Ответ на: комментарий от THEDECAL

Сделать еще один уровень хештаблиц. Для теста можно убрать 9 правил и посмотреть как изменится ситуация. Вообще 10 правил влиять сильно не должны, сколько трафика у вас?

ventilator ★★★ ()
Ответ на: комментарий от ventilator

Вообще я распределил irq прерывания по ядрам процессора и мимо буфера пакеты теперь не ходят, но всё же уменьшить кол-во записей в шейпере путём создания хэш-подтаблиц стоит на будущее увеличение сети... Но пока не приходит на ум как классифицировать эти хэш-подтаблицы... Единственная мысль это сначала хэш таблицы по тарифам (скоростям), затем по подсетям...

THEDECAL ()
Ответ на: комментарий от THEDECAL

Просто сделате по октетам IP адреса. Уровень по первому октету, второй - по второму, третий - по третьму.

ventilator ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.