Оптимізація VPS сервера
Після покупки VPS сервера виникає безліч проблем. Потрібно вибрати веб-сервер, ФТП-сервер, поштовий сервер. Потрібно продумати принципи роботи веб-сервера з окремими модулями.
Проблеми починають проявляти себе у роботі. То пам'яті занадто багато витрачається, то процесор працює постійно на максимумі, то починає позначатися низька швидкість роботи жорсткого диска, то ще щось.
Ось тут і настає момент необхідності оптимізації. Коли встановлені програми починають налаштовувати, тестувати, знову налаштовувати.
Нагадаю лише, що я використовую VPS від linode.com, мінімальний тариф із 512 мегабайтами оперативної пам'яті та 4-х ядерним процесором. Встановлена операційна система Ubuntu 10.04. Як веб-сервер використовується Nginx + php5-fpm + XCache.

Я вже проводив стрес-тест продуктивності, результати описував у статті Тест продуктивності VPS сервера. І на той момент сервер показав результат о 14.15 запиту/сек. Для того щоб витримати відвідуваність мого сайту цього результату цілком достатньо, але стала відчуватися інша проблема. У навантаженні надмірно витрачалася оперативна пам'ять.
500 запитів цілком вистачало для того, щоб процеси PHP заповнювали всю оперативну пам'ять, витісняючи попутно всі буфери і кеші, а потім і весь своп. Продовження подібного стресового навантаження могли просто впустити сервер. І це мене дуже стало турбувати.
Я просто не розумів, чому php5-fpm починає так сильно витрачати оперативну пам'ять. Як взагалі за подібних умов живуть інші проекти?
Намагався змінювати кількість процесів і nginx і php5-fpm, зменшуючи до мінімуму, проте це давало лише зайві хвилини роботи, але не позбавляло самої проблеми. Два процеси php5-fpmтак само заповнювали весь простір виділеної пам'яті, як і всі вісім. Довелося тимчасово залишити мінімальну кількість процесів, щоб довше витримувати навантаження і шукати рішення.
Ще трохи врятувало положення зміну налаштувань php5-fpm. У файлі /etc/php5/fpm/php5-fpm.conf змінив такі значення:
Стало трохи легше. Тепер через певний час процеси php5-fpm стали перезапускатись, вивільняючи зайняту пам'ять. Але витікання тривали.

Сьогодні вирішив спробувати у роботі модульmemcached. Перед цим довелося думати і вирішувати, чи варто це робити, тому що на додатковий модуль потрібно виділити певну кількість оперативної пам'яті, а її катастрофічно не вистачало. Вирішив все ж таки ризикнути і подивитися, що вийде. Все одно на сайті навантаження не велике. Встановлюємо та запускаємо:
Тепер необхідно прописати використання memcached в php5-fpm, для цього змінюємо файл /etc/php5/fpm/php.ini і в самий початок після директиви [PHP] прописуємо:
Тепер перезапускаємо php:
І дивимося, чи з'явився блок memcache у виведенні функції phpinfo(), якщо з'явилося, то все нормально. Єдино, перед самим запуском memcached я ще змінив його налаштування, збільшивши пам'ять, що використовується з 16 мегабайт до 64.
Наступний стрес-тест кинув мене в подив! Продуктивність не змінилася, але витоку пам'яті просто зникли. Припинилася ця дика витрата оперативної пам'яті.
Для того, щоб подивитися, скільки пам'яті використовується в даний момент сам memcached, використовував команду:
Результат - трохи більше 6 мегабайт оперативної пам'яті. Тобто 64 мегабайти, що я виділив, з лишком вистачає на все.
Провів ряд тестів, щоб відстежити, якеЧисло процесів nginx і php5-fpm є оптимальним для використання на VPS від Linode на мінімальному тарифі. Для цього, як і минулого разу, використовував утиліту ab з постачання веб-сервера apache. Запускав так:
Збільшив кількість запитів до 1000 і збільшив кількість одночасних запитів до сервера до 50. Мене цікавив витрата оперативної пам'яті та природно, продуктивність веб-сервера, тобто скільки запитів він зможе обробляти за секунду.
Для цього я змінював кількість процесів nginx, потім кількість процесів php5-fpm і спостерігав за показаннями утиліти htop.
Перший тест проводився з тим же числом процесів, що використовувався до встановлення memcached.
2 nginx і 2 php5-fpm:
Максимальна витрата пам'яті у своїй 123Mb. Вільної пам'яті ще багато, а ось продуктивність невисока, помітно, що в роботі беруть участь лише два із чотирьох виділених ядер. Збільшуємо число PHP процесів до 4.
2 nginx і 4 php5-fpm:
Максимальна витрата пам'яті у разі 157Mb. Кількість оброблюваних запитів зросла майже вдвічі. Не погано. Пробуємо збільшити кількість процесів nginx, по суті має зрости значення максимальної кількості одночасних з'єднань.
4 nginx і 4 php5-fpm:
Максимальна витрата пам'яті у разі 154Mb. Що навіть трохи менше, ніж у попередньому випадку, що трохи дивно. Однак кількість запитів, які обробляє сервер кожну секунду, залишилося незмінним. Чи має тоді сенс тримати запущеними кілька nginx?
1 nginx і 4 php5-fpm:
Максимальна витрата пам'яті 151 Мб. Як бачимо, на витрату пам'яті це мало впливає, і на кількість оброблюваних запитів теж. Поки що не бачу сенсу запускати додаткові процеси nginx.
Стало цікаво, а що буде, якщо поставитичисло запущених php-процесів більше, ніж число ядер?
1 nginx і 8 php5-fpm:
Максимальна витрата пам'яті становила 220Mb. Число запитів навіть дещо впало, зміни немає. Тобто фактично збільшувати кількість процесів PHP вище 4 для мого сервера навряд чи варто.
Оптимізація XCache

У всіх тестах використовувалося розширення WP Super Cache. При тесті, звичайно були задіяні кешовані сторінки, що досить непогано піднімало швидкість віддачі сторінки і скорочував час її генерації. Адміністратор за замовчуванням працює з некешованими сторінками і на швидкість впливає лише продуктивність PHP-інтерпретатора. Хоча і був встановлений модуль php5-xcache, в адмінці були помітні деякі гальма.
До цього моменту використовував параметри XCache за промовчанням. вирішив трохи повозитися та пошукати варіанти конфігурацій у мережі інтернет. Змінив лише кілька налаштувань у файлі /etc/php5/conf.d/xcache.ini:
Значення xcache.size збільшив з 16 до 64 мегабайт. Параметр xcache.count вказує на кількість ядер, що використовуються на машині, встановив у 4. І xcache.var_size змінив з 0 на 64 мегабайти.
Після перезапуску php5-fpm і адмінка стала більш чуйною!
Установки програм рідко бувають оптимальними за умовчанням. Потрібно кожен встановлений сервіс протестувати та визначити оптимальні налаштування для кожного конкретного випадку.

За допомогою тестів мені вдалося значно зменшити споживання оперативної пам'яті. І при цьому досягти показників оброблюваних запитів до сервера до 21.72. Що вище, ніж навіть у настроєного шаред-хостингу, що я використав раніше.
Цілком не очікував, що установка memcached дозволить мені вирішити проблему з витоками пам'яті. Тепер жерекомендую використовувати цей модуль PHP на серверах, що розміщують у собі WordPress.
Після проведених тестів зайнявся довести оброблювану кількість запитів до 100 за секунду. Щоправда, розумію, що саме зараз це навряд чи можливо, тому що під час тестів все впиралося у продуктивність процесора. Шукатиму варіанти оптимізації PHP-додатку.