Всем привет.
У меня есть сервер с биллингом: ABillS + MySQL + Perl 5.8.8 + MPD4.3(200 туннелей PPTP).
Железо: 2000 Celeron, 512 RAM, 40GB IDE HDD.
ОС: FreeBSD unlimit.xxx.ru 6.1-RELEASE-p20 FreeBSD 6.1-RELEASE-p20 #0: Fri Nov 16 20:08:56 MSK 2007 eddy@unlimit.xxx.ru:/usr/src/sys/i386/compile/MYKERNEL i386В последнее время испытываю проблемы с нагрузкой на сервер. При 60-80 активных пользователях, сервер начинает дико тормозить и никто уже не может подключиться. Выдается ошибка 718 - что сервер не успел вовремя ответить. В процессах при этом наблюдается от пяти до 20-ти процессов perl5.8.8, которые в сумме загружают процессор на 100%. Процессы эти вызываются радиусом - скрипт racct.pl (аккаунтинг). То есть, чем больше абонентов в онлайне, тем больше Perl грузит процессор.
Сам разработчик рекомендует оптимизировать СУБД MySQL. Но я в этом чайник, но не совсем уверен что причина именно в оптимизации MySQL, так как уже пытался настраивать различные переменные - но это не дало эффекта.Вот выводы некоторых команд статистики и мониторинга:
systat:
/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10
Load Average |
/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100
root idle XXXXXXXXXXXXXXXXXX
<idle> XXXXXXXXXXXXXXXX
www perl5.8.8 XXXXXXXXXXXXXX
root swi1: net X
root irq17: rl0 Xtop:
last pid: 3330; load averages: 0.10, 0.17, 0.27 up 0+00:46:25 10:47:42
48 processes: 2 running, 46 sleeping
CPU states: 37.6% user, 0.0% nice, 4.1% system, 6.8% interrupt, 51.5% idle
Mem: 49M Active, 13M Inact, 42M Wired, 36M Buf, 381M Free
Swap: 743M Total, 743M Free
PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND
3330 www 1 104 0 7888K 7464K RUN 0:01 39.00% perl5.8.8
1372 root 4 20 0 9624K 7656K kserel 0:19 0.00% mpd4
606 mysql 6 20 0 58204K 27912K kserel 0:09 0.00% mysqld
785 eddy 1 96 0 6080K 3132K select 0:01 0.00% sshd
634 root 1 8 0 6344K 4792K nanslp 0:01 0.00% httpd
607 root 1 96 0 3116K 2864K select 0:01 0.00% bsnmpd
2432 root 1 96 0 4120K 3236K select 0:01 0.00% radiusd
2477 root 1 96 0 1300K 968K select 0:00 0.00% syslogd
786 eddy 1 20 0 2780K 2528K pause 0:00 0.00% zsh
809 root 1 20 0 6356K 4072K pause 0:00 0.00% csh
674 www 1 4 0 6400K 4864K accept 0:00 0.00% httpd
920 www 1 4 0 6400K 4868K accept 0:00 0.00% httpd
673 www 1 4 0 6408K 4872K accept 0:00 0.00% httpd
672 www 1 4 0 6400K 4868K accept 0:00 0.00% httpd
675 www 1 4 0 6400K 4864K accept 0:00 0.00% httpd
676 www 1 4 0 6400K 4864K kqread 0:00 0.00% httpd
950 www 1 4 0 6392K 4864K accept 0:00 0.00% httpd
678 root 1 96 0 3420K 2932K select 0:00 0.00% sendmail
776 root 1 4 0 6104K 3108K sbwait 0:00 0.00% sshd
2429 root 1 8 0 1228K 684K nanslp 0:00 0.00% svscan
3325 root 1 96 0 2368K 1636K RUN 0:00 0.00% top
2986 www 1 4 0 6392K 4856K accept 0:00 0.00% httpd
694 root 1 8 0 1312K 1044K nanslp 0:00 0.00% cron
801 eddy 1 8 0 1604K 1304K wait 0:00 0.00% su
562 mysql 1 8 0 1652K 1276K wait 0:00 0.00% sh
658 root 1 96 0 3356K 2632K select 0:00 0.00% sshd
532 root 1 96 0 1212K 780K select 0:00 0.00% usbd
736 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
742 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
735 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
737 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
739 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
740 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
687 smmsp 1 20 0 3300K 2724K pause 0:00 0.00% sendmail
738 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
741 root 1 5 0 1268K 904K ttyin 0:00 0.00% getty
2431 root 1 96 0 1180K 668K select 0:00 0.00% supervise
Операционная система и СУБД были установлены с параметрами по дефолту. Посоветуйте как оптимизировать систему и решить проблемы с производительностью.
у меня
time perl -e 'use DBI;print 'real 0m0.095s
user 0m0.036s
sys 0m0.004s
у тебя сколько занимает? -- думаю много больше
а у меня:
unlimit# time perl -e 'use DBI;print'
0.168u 0.019s 0:00.26 65.3% 13+1444k 0+0io 0pf+0w
unlimit# time perl -e 'use DBI;print'
0.148u 0.029s 0:00.26 61.5% 15+1366k 0+0io 0pf+0wПравда что это значит не совсем понял. 65.3% - это загрузка проца?
надо тюнить запуск перла тебе (я по bsd далеко не спец но) с запуском перла на bsd было всегда плохо
вот например показательный пример
самая "тупая" машина какая есть под рукой
cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 5
model : 8
model name : AMD-K6(tm) 3D processor
stepping : 12
cpu MHz : 266.461
cache size : 64 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr mce cx8 pge mmx syscall 3dnow k6_mtrr
bogomips : 533.66
ну и показатели
time perl -e 'use DBI;print asd'real 0m0.721s
user 0m0.636s
sys 0m0.084s
time perl -e 'use DBI;print asd'real 0m0.702s
user 0m0.644s
sys 0m0.060s
попробуй крикнуть в форуме "БСД'эшники" типа "какой -то красноглазый мне..."
глядишь помогут -- а так -- даже не знаю
посмотри в abills + radius сколько процессов запускается по умолчанию (где-то там такое должно быть)
2eddy_mut
>Правда что это значит не совсем понял. 65.3% - это загрузка проца?Команда time загрузку процессора не показывает и ничего полезного в данном случае не покажет, это Вам фигню посоветовали.
По сабжу оптимизируйте систему.
Я не знаю что это за софт - abills, но имхо, фраза
>разработчик рекомендует оптимизировать СУБД MySQLзвучит примерно как ответ провайдера на жалобу по поводу качества интернета - оптимизируйте сетевую карту.
2pavel_simple
>с запуском перла на bsd было всегда плохоСсылку покажите, или Вы это сами придумали?
>вот например показательный пример
>...
>ну и показателиЧего показатели?
Прочитайте man time и не несите ерунды.
Софт ABillS - по сути набор скриптов Perl - для авторизации и аккаунтинга + веб интерфейс и база.А что бы Вы посоветовали посмотреть, чтобы понять почему Perl так загружает процессор?
>Софт ABillS - по сути набор скриптов Perl - для авторизации
>и аккаунтинга + веб интерфейс и база.Я понимаю для чего он, имелось ввиду что сам с ним не работал.
>А что бы Вы посоветовали посмотреть, чтобы понять почему Perl так загружает
>процессор?Вариантов миллионы. http://www.google.com/search?q=benchmarking+perl
Сначала точно определите узкое место, это может быть не только perl, но и а mysql или httpd.
Если думаете на скрипт racct.pl, то запускайте его и смотрите.
>top:
>last pid: 3330; load averages: 0.10, 0.17, 0.27Представьте вывод при перегрузке, то что вы привели сплошной простой сервера.
>Mem: 49M Active, 13M Inact, 42M Wired, 36M Buf, 381M Free
Вероятно памяти не хватает, добавьте побольше памяти и увеличте буферы в MySQL по примерам которые в пакете с MySQL идут.
>>top:
>>last pid: 3330; load averages: 0.10, 0.17, 0.27
>
>Представьте вывод при перегрузке, то что вы привели сплошной простой сервера.
>Не могу сказать точно какой load averages во время проблем по вечерам, но могу сказать точно что idle 0%, и наверху списка видно несколько процессов perl5.8.8 по процентам в сумме набирающие 100%. Нагрузка не постоянная, а скорее скачкообразная.
>>Mem: 49M Active, 13M Inact, 42M Wired, 36M Buf, 381M Free
>
>Вероятно памяти не хватает, добавьте побольше памяти и увеличте буферы в MySQL
>по примерам которые в пакете с MySQL идут.Пробовал подсунуть my-huge.cnf из дистрибутива MySQL или самого ABillS. Но вечером ситуация снова повторяется. Судя по тому что пишут 381M Free - памяти хватает?
>Не могу сказать точно какой load averages во время проблем по вечерам,
>но могу сказать точно что idle 0%, и наверху списка видно
>несколько процессов perl5.8.8 по процентам в сумме набирающие 100%. Нагрузка не
>постоянная, а скорее скачкообразная.
>Начать стоит с мониторинга - установить с нуля net-snmpd + cacti дело всего на полчаса с чтением док и разглядыванием, а что же это такое. После чего будете знать и загрузку своих каналов, и корреляцию количества пользователей/активности скачивания/количества свободной памяти/нагрузки на процессор/load average
Ну а дальше уже можно будет копать, а где затык - в памяти или процессоре, а потом тюнить по порядку perl, mysql и т.п.
>>>Mem: 49M Active, 13M Inact, 42M Wired, 36M Buf, 381M Free
>>
>>Вероятно памяти не хватает, добавьте побольше памяти и увеличте буферы в MySQL
>>по примерам которые в пакете с MySQL идут.
>
>Пробовал подсунуть my-huge.cnf из дистрибутива MySQL или самого ABillS. Но вечером ситуация
>снова повторяется. Судя по тому что пишут 381M Free - памяти
>хватает?Сам mysql не забыли при этом перезапустить? после этого загрузка памяти должна была вырасти.
Автор абилса практически всегда так отвечает (чтобы как-то по другому надо денег дать).
Поэтому спасение утопающих дело рук самих утопающих.У меня перл грузит систему когда обсчитывает траффик
Если у вас он грузит систему на 100% даже в момент авторизации пользователя и началось это недавно то проблема в большом количестве записей в базе.В какой таблице нескажу, неописано в какой конфигурации работает абилс.
>Автор абилса практически всегда так отвечает (чтобы как-то по другому надо денег
>дать).
>Поэтому спасение утопающих дело рук самих утопающих.В конце концов я начинаю склоняться к мысли, что денег надо все же дать. Тем более что с начальством уже обсудил - дали добро.
>
>У меня перл грузит систему когда обсчитывает траффик
>Если у вас он грузит систему на 100% даже в момент авторизации
>пользователя и началось это недавно то проблема в большом количестве записей
>в базе.
>
>В какой таблице нескажу, неописано в какой конфигурации работает абилс.Изучая логи, я заметил, что моя проблема возникает по вечерам в часы пиковой нагрузки, когда в онлайне уже сидит около 80-ти человек и когда пытаются авторизоваться еще по меньшей мере десять. В итоге получаем: постоянно запускающийся аккаунтинг-скрипт (для 80-ти человек) и плюс десять запусков авторизационного скрипта (еще десять ломится). В итоге получаем захлебнувшийся процессор.
>Начать стоит с мониторинга - установить с нуля net-snmpd + cacti дело
>всего на полчаса с чтением док и разглядыванием, а что же
>это такое. После чего будете знать и загрузку своих каналов, и
>корреляцию количества пользователей/активности скачивания/количества свободной памяти/нагрузки на процессор/load average
>Ну а дальше уже можно будет копать, а где затык - в
>памяти или процессоре, а потом тюнить по порядку perl, mysql и
>т.п.Я рассмотрю это как вариант.
>Сам mysql не забыли при этом перезапустить? после этого загрузка памяти должна
>была вырасти.Да, СУБД я перезагрузил, и размер занимаемой памяти вырос.
lsof | grep <id>
Ибо меня терзают смутные ощущения, что вас "имеют".
>lsof | grep <id>
>Ибо меня терзают смутные ощущения, что вас "имеют".unlimit# lsof | grep <id>
Ambiguous input redirect.
>>lsof | grep <id>
>>Ибо меня терзают смутные ощущения, что вас "имеют".
>
>unlimit# lsof | grep <id>
>Ambiguous input redirect.Вместо <id> должен быть идентификатор процесса, а вместо lsof - fstat, так как lsof это из линукса.
Но это ничего не даст, так как уже ясно, что проблема в самом софте.
Уже понятно? Лапти +10 к телепатии купили?
>Лапти +10 к телепатии купили?Да Вы знаете, было дело, давно правда, уж и не помню когда последний раз одевал.
Я перестал ими пользоваться с тех пор, как научился внимательно читать то что пишут и пользоваться поиском.>Уже понятно?
Вроде всё очевидно. Вам нет? Может я Вам лапти вышлю, раз уж мне ни к чему?
Возможно тогда Вы догадаетесь что id www имеет очень отдалённое отношение к проблеме автора, а также о том что утилита lsof на FreeBSD6.1 нафик не нужна.
>>lsof | grep <id>
>>Ибо меня терзают смутные ощущения, что вас "имеют".
>
>unlimit# lsof | grep <id>
>Ambiguous input redirect.Если lsof нет в системе, то /usr/ports/sysutils/lsof. <id> - это идентификатор процесса. В вашем случае
3330 www 1 104 0 7888K 7464K RUN 0:01 39.00% perl5.8.8
это было бы:lsof | grep 3330
Как только увидите такой же процесс, работающий от пользователя www, сделайте это, а результат сюда запостите.
>lsof | grep <id>
>Ибо меня терзают смутные ощущения, что вас "имеют".lsof -p <id> наверно так :)
а показатель в top напротив процесса - процент подругому вычисляется. Смотри на общую стату (load averages: .... , idle)
если хошь смотреть конкретно загрузку CPU то %top -C
а так если у тебя 200 tun то включай полинг man polling
на счет аккаунтинга смотри /usr/local/etc/raddb/acct_users строчки Acct-Status-Type .... Exec-Program
по идее там должно быть что то типа поднятия/опускания интерфейса для юзера, это происходить должно один раз при подключении и один при откл. юзвера (т.е. скрипт висеть не должен). Смотри лог радиуса, кто с какой частотой коннектится.
>если хошь смотреть конкретно загрузку CPU то %top -C
>а так если у тебя 200 tun то включай полинг man polling
>
>на счет аккаунтинга смотри /usr/local/etc/raddb/acct_users строчки Acct-Status-Type .... Exec-Program
>по идее там должно быть что то типа поднятия/опускания интерфейса для юзера,
>это происходить должно один раз при подключении и один при откл.
>юзвера (т.е. скрипт висеть не должен). Смотри лог радиуса, кто с
>какой частотой коннектится.Аффтор ты бы хоть мануал Abills почитал....
Вообще проблема в том, что при приходе alive пакета от радиуса (по дефолту раз в минуту)racct.pl (могу ошибаться в названии) стартует, что для операционки несколько не приятно, особенно если таких процессов >50, в единицу времени. rlm_perl спасет....