Мой статус 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.