Дано : 4-ядерный выделенный сервер, 2Гб ОЗУ, 32-битная Ubuntu 8.04 с ~30 виртуальных хостов с небольшой нагрузкой в среднем. Крутится Apache + MySQL + PHP 5.2.4.
Проблема :
один из виртуальных хостов работает медленно — с откликом ~7секунд. На нем как раз и самая высокая посещаемость. Существует еще два хоста с точно такой же CMS (Joomla 1.0), но под другие языки, где посещаемость ниже и отклик гораздо быстрее. Также это совершенно точно не проблема с прогрузкой элементов страницы в браузере.
Вопрос : Почему тормоза только на одном виртуальном хосте, а на других при этом всё хорошо?
Размер используемой ОЗУ небольшой ~600Mb.
После перезагрузки сайт более-менее оживает.
Вот uptime за последний час после неё: 0.10, 0.22, 0.34
В среднем на проблемном виртуальном хосте около ~1000 уников в день, на остальных двух ~100-200.
netstat -an -t | awk '$4 ~ /\:80$|\:443$/ {s=s+1} END {print s}'
выдает от 60 до 170
Сразу говорю — я не администрирую сервер и понимаю, что по хорошему надо бы ставить nginx на фронт-энд и кэш.
Но прежде чем заморочиться с этим (всё-таки продакш-сервер) хочется быть уверенным, что проблема не в производительности PHP или MySQL. Учитывая то, что опыта аудита производительности у меня нет, был бы весьма благодарен за подсказки.
UPDATE:
Проблема устранена — нашел вызов левого скрипта, который уже давно утратил актуальность. Он и блокировал выполнение PHP.
По факту разбирательств также выяснилось, что загрузка ЦП чуть выше нормы, в БД долгие запросы не висят. Количество запросов в единицу времени не выглядит устрашающе. Но nginx и eAccelerator всё равно ставить будем.
Кэширование проверял — никаких изменений, долгих запросов (более 2 сек) нет.
Похоже, что либо так долго выполняется сам код, либо где-то блокировка.
Копаю дальше.
Проблема в используемой CMS Joomla 1.0.
И вы сами ответили на свой вопрос.
Один из виртуальных хостов работает медленно — с откликом ~7секунд. На нем как раз и самая высокая посещаемость.
Сразу после перезагрузки у вас число одновременных запросов на этот ваш вритуал хост небольшое, поэтому и сайт оживает, когда приходит больше посетителей, всё возвращается.
Ставьте nginx и гуглите на тему того, как можно тюнить Joomla, наверняка можно какое-нибудь кэширование включить. Ну и посмотрите хотя бы какие запросы выполняются, есть ли все индексы нужные, скорее всего проблема в запросах MySQL.
Открываем top и смотрим, кто чего много ест, вскрываем самого прожорливого. Если никто, то скорее всего дело в какой либо блокировке, возможно даже в файловой(система ждёт блокировку на запись в файл кеша).
2 Гб ОЗУ не слишком много для такого хостинга. В пиковой нагрузке на сервере не заканчивается память случайно? Не через своп начинает работать? Если да, то дешевле будет памяти доставить гигов до 16.
Потому что вряд ли сама по себе Джумла тормозит на таком железе. Может, например, ограничено число коннектов к БД, может какие блокировки, или еще что-нибудь.