
Мой статус 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 ГБ и не используется файл подкачки.
Сайт на машине — это 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
Мы отчаянно пытаемся решить эту проблему, но, похоже, не можем с ней справиться.
решение1
Может быть, 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 в ситуациях, когда реальная энтропия недоступна.
решение2
Я не вникал во внутренние механизмы, но по моему опыту и из того, что мне сказали... если 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, для справки.