Титла: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: abadon в Nov 19, 2009, 16:26 Здравейте.
Имам виртуална машина, която използвам за да си хоствам сайтчето. OS-а ми е Ubuntu Hardy, Kernel 2.6.24-25-virtual, VMware tools е последна версия, хост машината е с VMware ESX 4 с процесори Intel (R) Xeon (R) CPU E5405@2.00GHz. За моята виртуална машина са заделени 256MB RAM, ограничен съм да използвам до 450 Mhz процесор на един Xeon и имам 100Mbit-flat канал към интернет. Сървъра работи стабилно но производителността е ужасно ниска: Цитат root@host:~# ab -c 10 -n 100 http://mysite.com/ ($2) Моите конфигурации са следните: /etc/apache2/apache2.conf Цитат ServerRoot "/etc/apache2" /etc/apache2/sites-enabled/000-default Цитат NameVirtualHost * В /etc/php5/cgi/php.ini съм променил от дифолт конфигурацията това, защото искам за качвам видео файлове с размер до 200МВ. Цитат post_max_size = 256M Инсталирал съмeAccelerator ($2) съгласно инструкциите тук ($2) Моята конфигурация в /etc/php5/conf.d/eaccelerator.ini е следната: Цитат extension="eaccelerator.so" В /etc/mysql/my.cnf съм променил това: Цитат max_allowed_packet = 128M Файловата ми система е reiserfs монтирана със опциите relatime,noatime,notail Когато тествам с ab и наблюдавам с top Забалезвям следното: Цитат top - 14:57:04 up 8 days, 14 min, 2 users, load average: 2.52, 0.56, 0.33 mtop показва това: Цитат load average: 1.06, 1.07, 0.59 mysqld 5.0.51a-3ubuntu5.4 up 0 day(s), 4:53 hrs Някакви предложения ?Къде може да е проблема? Предварително благодаря! P.S> Когато тествам с html файл по този начин ab -c 10 -n 100 http://mysite.com/phpMyAdmin/Documentation.html обработвам 2485.46 заявки за секунда и мрежата ми се запълва стигам 2МВ/sec (толкова ми е връзката към нета на машината от която пускам ab) Пробвах да тествам и със следния php файл. Цитат <?php или пък само go в него без нищо друго и резултата ми беше 99 връзки за секунда. Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: wfw в Nov 19, 2009, 17:56 Не чета достатъчно внимателно...
пробвал ли си PHP като модул? дали работи пак толкова бавно? Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: abadon в Nov 19, 2009, 18:00 Да имам swap дял. Както се вижда от top-а не го пипа:
Цитат Swap: 401400k total, 0k used, 401400k free, 76836k cached С дефоулт конфигурацията на апачето за IfModule mpm_worker_module го пипаше и трупаше около 60 МВ но сега както съм го конфигурирал, по начина показан по-горе не го пипа. Да пробвам съм mod_php с него почнах в началото и се мъчих, оптимизирах и т.н. но с него стигах до 2 заявки за секунда и като напишех ab -c 10 -n 100 http://mysite.com/ и CPU-то ми биеше на мах и край да обслужвам заявки повече и не се разтоварваше въобще. А сега поне с worker-а се разтоварва след като приключи теста. Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: VladSun в Nov 19, 2009, 20:34 Пробвай да инсталираш APC
Код
също така и mod_php е по-добре. Дай и mysql конфиг файла. Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: abadon в Nov 20, 2009, 10:49 Това php-apc го нямам в хранилищата на Убунту-то 8.04 TLS с което съм. Сложили са го в 8.10 затова трябваше да го инсталирам по този начин. ($2) Като изпълних apt-get update видях че тази сутрин е излезнал update на пакетите apache2-mpm-worker, apache2-utils и apache2.2-common и реших след като ги ъпдейтна да тествам отново. Пуснах ab -c 20 -n 1000 http://mysite.com/ при което гледам резултата: 40.11 Requests per second, в top-а нито apache се появи нито нищо CPU-то въобще не се натоварваше. :o Повтарям теста като гледам с watch -n 1 ps -ylC apache2 --sort:rss И какво да видя 7 apache2 процеса ми заемат по около 3 МВ RAM всеки, без въобще нищо да се променя. :o
Промених в /etc/apache2/apache2.conf нещата по този начин: Цитат <IfModule mpm_worker_module> Пускам отново ab -c 200 -n 1000 http://mysite.com/ резултата е 156.70 Requests per second а CPU-то не се натоварва на повече от 1.5% Правя следващ опит ab -c 200 -n 10000 http://mysite.com/ езултата е 153.40 Requests per second а CPU-то не се натоварва на повече от 2.0% Най-вероятно Apache-то ще може да обработи доста повече заявки, но за съжаление връзката на компютъра от който пускам ab-то е само 10Mbps и си запълвам канала. Не знам как е в другите дистрибуции но при Ubuntu не мога да имам mod_php и apache2-mpm-worker. Зависимостите са така направени че mod_php ми слага форкващия апач. А иначе това ми е конфигурацията на Mysql-а Цитат # Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: bonbon в Nov 20, 2009, 11:02 В конфига на apache имаш MaxClients 200
При 256MB RAM, не е ли множко. :) До колкото знам MaxClients = RAM / 8 Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: abadon в Nov 20, 2009, 11:34 Преди като използвах apache2-mpm-prefork за MaxClients го определях по следния начин. Пускам ps -ylC apache2 --sort:rss и гледам в колоната RSS колко RAM средно ми заема 1 процес. Щом съм пуснал php-но числото беше в рамките на 10-12МВ. След това си разделям наличната RAM на средното което съм видял и получавам колко да ми е MaxClients. Ако го превишиш почва да заслуапва. Ако си го на целил никога не ти пипа swap-а а просто винаги ти заема всичката налична RAM. Все пак имай предвид, че ако не си си конфигурирал и други процеси адекватно може те да са причина за използване на swap при максимален товар на Apache-то. Сега след като минах на apache2-mpm-worker за обслужването на 200 клиента имам 7 апач процеса които ми заемат около 3 МВ всеки. Имам налична даже над 130МВ.
Ако ти се чете ето ти малко полезни линкове от които се ръководех: https://calomel.org/apache_server.html http://www.cyberciti.biz/tips/howto-performance-benchmarks-a-web-server.html http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: VladSun в Nov 20, 2009, 12:17 А какво става с алгоритъма ти за изчисление на паметта, когато базата данни почне да се пълни и съответно започва да взима повече памет за извършване на сортирания например?
Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: abadon в Nov 20, 2009, 13:09 Винаги си оставям малко запас. Ето преди като ползвах фокрващия апач бях сложил максимум 20 клиента като знаех че един ми заема между 10 и 12МВ RAM. Пък сървъра трябва да се наблюдава все пак като видя че почва да ползва слуап ще го мисля. Примерно бих си направив един конфиг на mysql-а така:
Цитат [mysqld] Като по този начин ще знам кое колко памет ще ми заема. Как ти се струва като решение? Нали затова е форум да си помагаме, ако имаш някакви по-добри идеи и решиш да ги споделиш ще се радвам да науча нещо ново. Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: bnight в Nov 20, 2009, 15:35 Ето една статия по темата която съм писал аз:
http://blog.skyhost.bg/vps-%D1%85%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3/optimize-vps/ Дано ти бъде от полза. Поздрави. Титла: Re: Apache 2 + php + mysql, Много, много ниска пройзводителност Публикувано от: gat3way в Nov 20, 2009, 17:10 Преди като използвах apache2-mpm-prefork за MaxClients го определях по следния начин. Пускам ps -ylC apache2 --sort:rss и гледам в колоната RSS колко RAM средно ми заема 1 процес. Щом съм пуснал php-но числото беше в рамките на 10-12МВ. След това си разделям наличната RAM на средното което съм видял и получавам колко да ми е MaxClients. Ако го превишиш почва да заслуапва. Ако си го на целил никога не ти пипа swap-а а просто винаги ти заема всичката налична RAM. Все пак имай предвид, че ако не си си конфигурирал и други процеси адекватно може те да са причина за използване на swap при максимален товар на Apache-то. Сега след като минах на apache2-mpm-worker за обслужването на 200 клиента имам 7 апач процеса които ми заемат около 3 МВ всеки. Имам налична даже над 130МВ. Сметката с VmRSS не е много надеждна, особено що се отнася до динамични сайтове. Причината е че..мммм...извадката не е много представителна. Може просто да си уцелил момент, в който apache процесите са изяли по-малко памет. Утре примерно някой може да промени PHP кода, това по някакъв начин да промени memory usage pattern-a и да излезе че ти е трябвала всъщност 2 пъти повече памет, отколкото сметките базирани на моментното състояние. Един малко по-добър вариант е да вземеш high watermark-a на apache процесите: Код: for a in `pidof apache2`; do grep VmHWM /proc/$a/status; done|sort|uniq Въпросната стойност е нещо от сорта на "откакто съществува този процес, коя е най-високата стойност на изядената от него RAM". Това пак не е надеждно, но е по-добре от някаква моментна стойност и съответно е малко по-близка до най-лошия възможен вариант. Друго, което забелязах: бих те посъветвал да не ползваш KeepAlive когато имаш нисък лимит за MaxClients, защото така става по-възможно да останеш без свободни worker-и, които да ти обслужват клиентите. Или ако ще ползваш, намали KeepAliveTimeout-а (то 2 секунди си е нисък де, но все пак да си кажа). Логиката е следната: представи си че имаш нисък Maxclients лимит (20 да речем). Имаш относително висок, да речем 20-секунден KeepAliveTimeout. За улеснение да речем че едновременно ти се връзват 20 клиента и правят някаква малка заявка. В продължение на 20 секунди, няма да може да се закачи нов клиент, защото всичките 20 worker-a са ти заети да чакат следващата заявка от клиентската конекция. Да, от keepalive понякога се намазва, обаче има и един друг момент че браузърите и прокситата имат навика да кешират разни обекти и след това да не бълват по 50 GET заявки, за да ти визуализират една страница. Така че не е много сигурно дали ще спечелиш толкова много, това си зависи от usage pattern-а. |