Почему число процессов веб-сервера на VPS не всегда коррелирует с посещаемостью

Очень часто на VPS можно наблюдать картину, когда число процессов веб-сервера спорадически возрастает, а уровень посещаемости сайта остается прежний. Такой пример можно наблюдать на этих графиках:

Как видно по графикам, рост процессов достаточно прогнозируемый, и проявляет себя через равные промежутки времени.

Для того, чтоб определить причину, сначала рассмотрим что представляет собой виртуализация на данный момент:

Каждому виртуальному серверу выделяются временные интервалы, когда процессор физического сервера занимается выполнением задач виртуального. Чем больше временной интервал — тем быстрее работает виртуальный сервер… за счет остальных.

Однако существует задача, в которой время процессорной работы никак не связано с нагрузкой на физический сервер. И это — работа с дисковой подсистемой.

И действительно, если взять и выполнить на одинаковых виртуальных серверах разные задачи, одна из которых жестоко эксплуатирует дисковую подсистему, то мы заметим что производительность падает и на втором сервере, который не работает с дисковой подсистемой.

Это связано с тем, что задержка на работу с диском непредсказуема, и процессор ждет окончания записи, тем самым «растягивая» выделенный интервал. Соответственно, работу с диском (бекап, конверсия видео, загрузка большого дампа в mysql) почувствуют все соседи.

Теперь перейдем к росту процессов веб-сервера.

Как известно, на каждый запрос к сайту, веб-сервер apache в стандартном режиме prefork, обрабатывает его отдельным процессом. Соответственно — чем больше запросов, тем больше процессов.

Однако в случае падения производительности, вызванной вышеописанной проблемой с дисковой подсистемой, процессы не успевают обрабатывать запросы, и соответственно apache порождает больше процессов. Затем нагрузка на диск падает и все возвращается на свои места.

Нагрузка на диск может идти как от соседей, так и от задач хостера — например бекапа.

 

Решение тут только одно — смена хостера, на такого, который следит за нагрузкой на диск у своих серверов и размещает разумное число виртуалок на физических серверах.

Например, на восьмиядерном сервере с 8G RAM я советую размещать не более восьми виртуальных серверов.