Вот выдалось время написать в собственном блоге. Эта статья откроет новую тему на блоге – Linux администрирование. Ко мне обратился знакомый, помочь настроить сервер на Linux (CentOS). Я в сновном работаю только на CentOS.
Суть проблемы заключалась в том, что на сервере запущена онлайн игра, написанная на php.
Так вроде и сервер мощный и написана не корявыми руками, но сервер еле дышит, еще немного и совсем ляжет. Работать невозможно, даже консоль тормозит.
Посмотрел нагрузку, она зашкаливает load average: 10.54, 10.28, 9.96
Я подумал, как можно это исправить. Для оптимизации работы данного сайта, стоит понять как работает php.
Дело в том, что php это не просто скрипт с инструкциями для определённой программы. Суть его заключается в том, что каждый скрипт проходит несколько стадий, прежде чем вернет результат:
Второе и третье понятно, а вот первое знакомо программистам на более сложных языках, чем php. Байт-код это уже набор инструкций, каждая эквивалентна одной или нескольким инструкциям ассемблера. Такой код выполняется во десятки раз быстрее чем скрипт, выполняемый программой. Одна только проблема, для перевода скрипта в байт-код затрачивается очень много ресурсов, для одного скрипта, конечно это ерунда, но когда идут десятки и сотни обращений к серверу, вот тогда уже ресурсы сервера начинают использоваться в немереных количествах.
Выход есть. Чтобы не тратить постоянно ресурсы на перевод скриптов в байт-код, можно хранить часто используемые скрипты уже в таком состоянии, что заметно снизит потребление ресурсов сервера.
Для этого существует множество программ, я решил использовать одну из таких – это eAccelerator.
Это удобный, легко настраиваемый модуль для php.
И так приступим к установке. Подключитесь к серверу по SSH ну или если есть прямой доступ, зайдите в консоль.
Я создаем папку /usr/local/eAccelerator , в которой будем работать и переходим в нее
# mkdir /usr/local/eAccelerator # cd /usr/local/eAccelerator
Теперь скачаем собственно eAccelerator c официального сайта http://www.eaccelerator.net/
# wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2 # tar -xvjf ./eaccelerator-0.9.5.3.tar.bz2
Переходим в директорию eaccelerator-0.9.5.3:
# cd eaccelerator-0.9.5.3
Собираем eAccelerator:
# /usr/bin/phpize # ./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config --with-eaccelerator-shared-memory
Опция –with-eaccelerator-shared-memory необходима для возможности использования API eAccelerator. Полный список опций.
# make
Инсталлируем eAccelerator:
# make install
Собственно теперь модуль готов и установлен в папке /usr/lib/php/modules/ , куда устанавливаются все модули php
Теперь пришло время подключить модуль и настроить его, чем сейчас и займемся.
Файлы для подключения модулей php находятся в папке php.d. При загрузке Apache он считывает все фалы с расширением ini из этой папки.
Теперь создадим файл конфигурации в этой папке. Я использую VIM, Вы можете использовать тот редактор, который вам больше нравится.
# cd /etc/php.d/ # vi eaccelerator.ini
extension="eaccelerator.so" eaccelerator.shm_size="80" eaccelerator.cache_dir="/tmp/eaccelerator" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="3600" eaccelerator.shm_prune_period="1800" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9"
eaccelerator.shm_size | Размер кэша совместно используемой памяти, устанавливается в мегабайтах. |
eaccelerator.cache_dir | Директория для дискового кэша. eAccelerator сохраняет в указанной директории бинарное представление кода, сессии и другие данные. |
eaccelerator.enable | С помощью этой опции можно отключать и включать eAccelerator. Значение 1 – включено, 0 – выключено. |
eaccelerator.shm_ttl | Указывает в секундах время, по истечении которого давно не используемый код должен быть удален из совместно используемой памяти при превышении объема выделяемой памяти.
По умолчанию эта опция отключена, рекомендую устанавливать значение от 60 до 300 при большом количестве файлов и от 900 до 1800 при малом количестве файлов. |
eaccelerator.shm_prune_period | Когда eAccelerator не имеет достаточно свободного памяти, он пытается удалить старые данные, если предыдущая попытка была сделана более “shm_prune_period” секунд назад. По умолчанию значение “0″, при котором eAccelerator не будет пытаться удалить старый данные из памяти. |
eaccelerator.keys eaccelerator.session eaccelerator.content |
Параметры указывают доступные способы сохранения кэша eAccelerator. Возможные значения:
|
Теперь создадим папку для кэша, которую мы указан в директиве eaccelerator.cache_dir – /tmp/eaccelerator, и дадим ей права на запись
# mkdir /tmp/eaccelerator # chmod 777 /tmp/eaccelerator
Собственно настройка закончена, теперь перезапустим Apache:
# service httpd restart
Собственно, что же это дало. Я на самом деле даже не совсем ожидал подобного результата, но нагрузка на сервер упала в десятки раз.
load average: 0.91, 0.88, 0.72