Три первых шага к оптимизации LAMP

Бытует мнение, что связка LAMP (Linux+Apache+Mysql+PHP) не требует особой настройки и работает «из коробки». Это далеко не так. После того, как я долго убеждал товарища установить кеширующий акселератор PHP xcache, я решил провести небольшой эксперимент и попробовать выключить xcache на своём виртуальном сервере, находящемся под небольшой нагрузкой (около хита в секунду). В реальной жизни нагрузка на процессор мала, а вот память загружена сильно, т.к. её немного (256МБайт).

Результаты эксперимента превзошли все ожидания. Думаю, вы без труда найдете на графиках загруженности процессора и памяти период, когда кеш был выключен.
skitched-20081202-184813

skitched-20081202-184918

Через полчаса экспериментов система вылезла в жестокий своп и я еле смог вернуть кеширование на место:

skitched-20081202-184955

Этот эксперимент, к сожалению, не был чистым, так как я настраивал Apache именно под имеющуюся конфигурацию, и выключение кеша привело к своппингу. Xcache (как и другие PHP-акселераторы) позволяет экономить сразу и процессорное время, и память, и обращения к диску, сохраняя промежуточный код скриптов PHP в оперативной памяти. Несмотря на то, что кеш занимал у меня целых 64МБайт, его отсутствие привело к разрастанию каждого из рабочих процессов настолько, что они вылезли за пределы физической памяти.

Вынесем три урока оптимизации — по одному на компонент AMP:

1. Всегда настраивайте Apache так, чтобы выполнение команды ab -n1000 -c100 yoursite/bigscript.php не приводило к свопу. Для этого прочитайте эту статью. «Коробочный» Apache плюс скрипты средней тяжести — верная дорога в пропасть при увеличении нагрузки. Особенно для ограниченных по памяти VDS.
2. Всегда устанавливайте акселератор PHP. На обычных проектах и CMS (Drupal/Joomla/WP) это принесет ускорение отдачи и снижение нагрузки на процессор в 2-4 раза, а также экономию оперативной памяти. Настраивайте количество кеша, достаточное для хранения активных скриптов (занятость кеша можно мониторить).

Третий урок — включайте Query Cache в MySQL. Он наглядно иллюстрируется следующим графиком:
skitched-20081202-185736
Для более подробных советов по MySQL обратитесь к скрипту tuning-primer.sh, запустив его на живой БД.

Остальные меры (кроме оптимизации самих приложений) дают эффект послабее, но могут сэкономить ещё много ресурсов. Если интересуетесь — рекомендую прочитать вот эти статьи.