Назад | Перейти на главную страницу

Apache2 медленно обслуживает статические, пока здоровый

Мой статус Apache выглядит так:

201 requests/sec - 98.8 kB/second - 504 B/request
85 requests currently being processed, 345 idle workers
_____CCW_C_____C__C__C_R____C_WC_________C__C____CW__C__CCC_____
__C____W______C___C___CW__C_C______C__W_C__C_____CCC____C______R
CC_C_______C___C____C______________C______C__C________________C_
___________________C______________________C_______C___C_____C___
CC____C__C___R_____C_C_CC__________C___C___________R____C_C_C___
______C______W_W__W___C____________________C__WCC__R__R_C_______
R__RC________________________C___R____W__C____..................
....................................................

Нагрузка на сервер составляет в среднем 2 на 4-ядерной машине.

Использование ввода-вывода составляет 10-15% и не имеет много скачков, превышающих 70%.

На машине почти 4 ГБ свободного места и 0 подкачки.

Сайт на машине является сайтом PHP. Весь PHP-код оптимизирован и работает быстро, когда к нему обращаются, но иногда запросы застревают. Застрял смысл; нет ответа минимум 10 сек. Мы отладили код PHP, но он достаточно оптимальный и быстрый. Мы потратили на это много времени, пока не решили протестировать запрос:

<html><body>test</body></html>

страницу test.html.

Этот статический ресурс также «застревает» так же, как «застревают» страницы php.

Как это возможно, учитывая работоспособность системы и тот факт, что это статический файл?

Я протестировал сеть, но, когда PHP показывает «медлительность» при мониторинге сайта, тестовые файлы html также загружаются (намного дольше), чем 10 секунд, используя;

time lynx -dump http://127.0.0.1/test.html

Мы как бы отчаянно пытаемся решить эту проблему, но, похоже, не можем решить ее.

Может быть, у Apache заканчиваются дескрипторы файлов? Сколько файловых дескрипторов вы позволили ему иметь? Значение 1024 по умолчанию может вскоре стать узким местом. В Linux вы увеличиваете пределы /etc/security/limits.conf файл.

Во время остановок наблюдается большая активность диска? Если у вас включен журнал доступа Apache и другие журналы, которые очень подробно включены, возможно, это файловая система, фиксирующая последние изменения? Это никоим образом не должно повлиять на Apache, но вы никогда не узнаете.

И на всякий случай взгляните на /proc/sys/kernel/random/entropy_avail во время партера. Вы можете увидеть это, например, watch -n1 'cat /proc/sys/kernel/random/entropy_avail'. Если это говорит 0, ваше ядро ​​исчерпало энтропию и блокирует Apache до тех пор, пока не будет доступно больше энтропии.

Если это так, вы можете установить rng-tools и запустить rngd демон, который выгружает полуслучайные числа из / dev / urandom в / dev / random в ситуациях, когда реальная энтропия недоступна.

Я не копался во внутренностях, но, исходя из моего опыта и того, что мне сказали ... если PHP работает на Apache с использованием встроенного модуля (libphp5.so), то Apache загружает PHP (и, возможно, любые общие модули) в память при каждом запросе, даже если код PHP не выполняется.

Рассмотрите возможность использования nginx как обратный прокси перед Apache. nginx невероятно быстро обслуживает статические ресурсы, и при правильной настройке действительно может снизить нагрузку на загруженный веб-сервер. Для получения бонусных баллов настройте PHP для работы через FastCGI в nginx. Взгляни на Эта статья чтобы узнать, почему. Это действительно отличный способ. Я установил новый веб-сервер с Ubuntu 10.04, nginx, spawn-fcgi и php-cgi только на прошлой неделе, и это почти не заняло времени. Для справки, PHP 5.3 входит в комплект Ubuntu 10.04.