Оптимизация работы сервера c PHP. eAccelerator | DAndreev.com

Оптимизация работы сервера c PHP. eAccelerator

centos_logo

Вот выдалось время написать в собственном блоге. Эта статья откроет новую тему на блоге – Linux администрирование. Ко мне обратился знакомый, помочь настроить сервер на Linux (CentOS). Я в сновном работаю только на CentOS.

Суть проблемы заключалась в том, что на сервере запущена онлайн игра, написанная на php.
Так вроде и сервер мощный и написана не корявыми руками, но сервер еле дышит, еще немного и совсем ляжет. Работать невозможно, даже консоль тормозит.

Посмотрел нагрузку, она зашкаливает load average: 10.54, 10.28, 9.96

Я подумал, как можно это исправить. Для оптимизации работы данного сайта, стоит понять как работает php.

Введение

Дело в том, что php это не просто скрипт с инструкциями для определённой программы. Суть его заключается в том, что каждый скрипт проходит несколько стадий, прежде чем вернет результат:

  1. Скрипт переводится в байт-код
  2. Выполняется
  3. Выводится результат сервером

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

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

Для этого существует множество программ, я решил использовать одну из таких – это eAccelerator.

Это удобный, легко настраиваемый модуль для php.

Установка eAccelerator

И так приступим к установке. Подключитесь к серверу по 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

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.
Возможные значения:

  • shm_and_disk — кэш данных в общей памяти и на диске (по умолчанию);
  • shm — кэш данных в общей памяти или на диске, если общая память или размер данных больше, чем “eaccelerator.shm_max”;
  • shm_only — кэш данных в общей памяти;
  • disk_only — кэш данных на диске;
  • none не кэшироваь данные.

Теперь создадим папку для кэша, которую мы указан в директиве eaccelerator.cache_dir – /tmp/eaccelerator, и дадим ей права на запись


# mkdir  /tmp/eaccelerator
# chmod 777  /tmp/eaccelerator

Собственно настройка закончена, теперь перезапустим Apache:

# service httpd restart

Заключение

Собственно, что же это дало. Я на самом деле даже не совсем ожидал подобного результата, но нагрузка на сервер упала в десятки раз.

load average: 0.91, 0.88, 0.72

Retweet

Похожие статьи

Оставить комментарий