Поднят сервер на CentOS 5.1 (ядро обновлял из репозиториев после установки - месяца 1.5 назад - древнее 2.6.18, но с кучей патчей/багфиксов, любит рэдхет это дело)
Наблюдаются следующие странности:
1) Подвисшие ppp туннели, интерфейсы - не подняты, ИП - не выданы, pppd - висят, но их PID среди /var/run/ppp*.pid нет (как и файлов для соответствующих интерфейсов, и radattr.pppX для данных интерфейсов). И, ессно, данные процессы жрут системные ресурсы, причем - очень нехило (после их килла в кол-ве около 170 штук загрузка ядер упала с 200% (дуалкор, показания по SNMP) до 80%, load average - с 200 до 3... Пока нагрузка была не такой большой - проблемы так активно не вылазили, сейчас при вечернем онлайне порядка 500 человек - стали вылазить через пару суток аптайма.
В логи при килле гадит следующее:
Dec 18 00:17:35 server3 pppd[17070]: ioctl(TIOCSETD, N_TTY): Interrupted system call (line 562)
Dec 18 00:17:35 server3 pppd[17070]: tcsetattr: Invalid argument (line 1001)
Dec 18 00:17:35 server3 pppd[17070]: Exit.
Версия poptop - 1.3.4, pppd - 2.4.4 (шел в дистре)
2) Странности с шейпером (исходящий шейпер - основан на маркировке пакетов iptables и последующем их заворачивании в классы tc) - при дисконнекте не все правила iptables уничтожаются, иногда бывает, что 1-2 правила остаются из 3. К слову, данный скрипт на федоре 9 (ядро 2.6.23) крашил систему при выполнении не в дебаг-режиме через терминал (когда его отлаживал, пускал вручную), при этом в дебаг-режиме баша - работал четко, ессно - ставить его на ifup/ifdown на работающей машине без резерва побоялся...
Посему - вопрос: кто с подобным сталкивался и как с этим бороться?
pptpd.conf:
option /etc/ppp/options.pptpd
logwtmp
delegate
connections 2000
name pptpd
require-mschap
require-chap
ms-dns 10.255.0.2
ms-dns 10.255.0.12
lock
nobsdcomp
novj
novjccomp
nologfd
lcp-echo-interval 2
lcp-echo-failure 12
default-asyncmap
plugin radius.so
plugin radattr.so
Мои скрипты шейпера:
# cat ip-up.local
#!/bin/sh
debug=0;
INPUT=eth0;
UBURST="burst 512k"
DBURST="burst 64k"
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
# IP=$5
# echo $IP >/var/run/shaper/$1
QDISC_ETH=`tc qdisc show dev $INPUT|grep -v sfq|awk '{print $2}'`
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
FILTERS=`/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
if [ "$QDISC_ETH" != "htb" ];
then
tc qdisc del dev $INPUT root >/dev/null
tc qdisc add dev $INPUT root handle 1: htb default 2 r2q 100
tc class add dev $INPUT parent 1: classid 1:1 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 2
tc class add dev $INPUT parent 1: classid 1:2 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 1
fi
if [ w${debug} = w1 ] ; then
echo "Debug mode" >>/tmp/pptpd
echo $DOWNSPEED >>/tmp/pptpd
echo $UPSPEED >>/tmp/pptpd
echo $FILTERS >>/tmp/pptpd
fi;
/sbin/tc qdisc del dev $1 root > /dev/null
/sbin/tc qdisc del dev $1 ingress &>/dev/null
##### speed server->client
if [ "$UPSPEED" != "0" ] ;
then
/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 100
/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit $UBURST quantum 1514
/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit $UBURST prio 1 quantum 1514
/sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit $UBURST prio 2 quantum 1514
/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1514
/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1514
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10
# /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
fi
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
tc class add dev $INPUT parent 1:1 classid 1:1$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST quantum 1514
tc class add dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST prio 10 quantum 1514
tc class add dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST prio 1 quantum 1514
tc qdisc add dev $INPUT parent 1:2$PPPNUM handle 2$PPPNUM: sfq perturb 10 quantum 1514
tc qdisc add dev $INPUT parent 1:3$PPPNUM handle 3$PPPNUM: sfq perturb 10 quantum 1514
iptables -t mangle -A FORWARD -i $1 -j MARK --set-mark 0x3$PPPNUM
iptables -t mangle -A FORWARD -i $1 -p icmp -j MARK --set-mark 0x2$PPPNUM
iptables -t mangle -A FORWARD -i $1 -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters not supported";
fi;
fi
# cat ip-down.local
#!/bin/sh
debug=0;
INPUT=eth0;
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
# IP=$5
QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
FILTERS=`/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
if [ w${debug} = w1 ] ; then
echo "Debug mode" >>/tmp/pptpd
echo $DOWNSPEED >>/tmp/pptpd
echo $UPSPEED >>/tmp/pptpd
echo $FILTERS >>/tmp/pptpd
fi;
##### speed server->client
if [ "$UPSPEED" != "0" ] ;
then
/sbin/tc qdisc del dev $1 root > /dev/null
fi
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
tc filter del dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
tc filter del dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
tc class del dev $INPUT classid 1:3$PPPNUM
tc class del dev $INPUT classid 1:2$PPPNUM
tc class del dev $INPUT classid 1:1$PPPNUM
iptables -t mangle -D FORWARD -i $1 -j MARK --set-mark 0x3$PPPNUM
iptables -t mangle -D FORWARD -i $1 -p icmp -j MARK --set-mark 0x2$PPPNUM
iptables -t mangle -D FORWARD -i $1 -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters not supported";
fi;
fi