Суть проблеми полягала в тому, що на сервері запущена онлайн гра, написана на php.
Так ніби й сервер потужний і написана не кострубатими руками, але сервер ледве дихає, ще трохи і зовсім ляже. Працювати неможливо, навіть консоль гальмує.
Подивився навантаження, вона зашкалює load average: 10.54, 10.28, 9.96
Я подумав, як можна це виправити. Для оптимізації роботи даного сайту, варто зрозуміти як працює php.
Справа в тому, що php це не просто скрипт з інструкціями для певної програми. Суть його полягає в тому, що кожен скрипт проходить кілька стадій, перш ніж поверне результат:
- Скрипт перекладається в байт-код
- виконується
- Виводиться результат сервером
Друге і третє зрозуміло, а ось перше знайоме програмістам на більш складних мовах, ніж php. Байт-код це вже набір інструкцій, кожна еквівалентна одній або декільком інструкціям асемблера. Такий код виконується у десятки разів швидше ніж скрипт, що виконується програмою. Одна тільки проблема, для перекладу скрипта в байт-код витрачається дуже багато ресурсів, для одного скрипта, звичайно це дурниця, але коли йдуть десятки і сотні звернень до сервера, ось тоді вже ресурси сервера починають використовуватися в неміряних кількостях.
Вихід є. Щоб не витрачати постійно ресурси на переклад скриптів в байт-код, можна зберігати часто використовувані скрипти вже в такому стані, що помітно знизить споживання ресурсів сервера.
Для цього існує безліч програм, я вирішив використовувати одну з таких - це eAccelerator.
Це зручний, легко настроюється модуль для php.
установка eAccelerator
І так приступимо до встановлення. Встановити з'єднання із сервером по SSH ну або якщо є прямий доступ, зайдіть в консоль.
Я створюємо папку / usr / local / eAccelerator. в якій будемо працювати і переходимо в неї
Переходимо в директорію eaccelerator-0.9.5.3:
Опція -with-eaccelerator-shared-memory необхідна для можливості використання API eAccelerator. Повний список опцій.
Власне тепер модуль готовий і встановлений в папці / usr / lib / php / modules /. куди встановлюються всі модулі php
Тепер прийшов час підключити модуль і налаштувати його, ніж зараз і займемося.
Файли для підключення модулів php знаходяться в папці php.d. При завантаженні Apache він зчитує всі файли із розширенням ini з цієї папки.
Опис основних атрибутів конфігурації eAccelerator
Розмір кешу спільно використовуваної пам'яті, встановлюється в мегабайтах.
Директорія для дискового кешу. eAccelerator зберігає у вказаній директорії бінарне представлення коду, сесії та інші дані.
За допомогою цієї опції можна відключати і включати eAccelerator. Значення 1 - включено, 0 - вимкнено.
Вказує в секундах час, після закінчення якого давно не використовується код повинен бути вилучений з спільно використовуваної пам'яті при перевищенні обсягу виділеної пам'яті.
За замовчуванням ця опція відключена, рекомендую встановлювати значення від 60 до 300 при великій кількості файлів і від 900 до 1800 при малій кількості файлів.
Коли eAccelerator не має достатньо вільного пам'яті, він намагається видалити старі дані, якщо попередня спроба була зроблена більш "shm_prune_period" секунд тому. За замовчуванням значення "0", при якому eAccelerator не намагатиметься видалити старий дані з пам'яті.
Параметри вказують доступні способи збереження кешу eAccelerator.
Можливі значення:
- shm_and_disk - кеш даних в загальній пам'яті і на диску (за замовчуванням);
- shm - кеш даних в загальній пам'яті або на диску, якщо загальна пам'ять або розмір даних більше, ніж "eaccelerator.shm_max";
- shm_only - кеш даних в загальній пам'яті;
- disk_only - кеш даних на диску;
- none НЕ кешувати дані.
Тепер створимо папку для кешу, яку ми вказано в директиві eaccelerator.cache_dir - / tmp / eaccelerator, і дамо їй права на запис
Власне настройка закінчена, тепер перезапустити Apache:
висновок
Власне, що ж це дало. Я насправді навіть не зовсім очікував подібного результату, але навантаження на сервер впала в десятки разів.
load average: 0.91, 0.88, 0.72