Настройка APC. Кеширование в php.

admin друпал drupal

!!! Внимание !!! не используйте apc если у вас PHP версии 5.5 или выше, OPCache замещает apc и встроен в PHP.

On the 21st March 2013, the PHP 5.5 beta 1 was released including "Zend OPCache" - It looks firmly like this will be the replacement for APC going forward as it is included in the PHP core, and will have to be maintained for each new release.

APC - альтернативный кэш PHP, записывает код операции в кэш PHP, или, как разработчики описывают его: "APC является свободной, открытой и надежной системой для кэширования и оптимизации промежуточного кода PHP".

PHP является высокоуровневым языком. Как и во всех языках высокого уровня, он может быть составлен быть скомпилирован на различных платформах. Системы управления контентом, такие как Drupal состоят из сотен, если не тысячи скриптов PHP, а также модульная природа таких систем означает, что при каждой загрузке страницы действительно может использовать сотни из этих сценариев. В отличие от языков высокого уровня, PHP подцепляется на лету, то есть фактическии сценарий преобразуется в байт-код во время исполнения. Здесь APC приходит на подмогу: APC можно сохранить копию скомпилированный скрипт в памяти и готов к работе, что значительно сокращает объем ресурсов, необходимых для Drupal. (Стоит отметить, что в некоторых языках это делается автоматически - Python скрипт на сервере Apache передается переводчику Python, оставляя скомпилированную версию сценария в непосредственной близости от самого сценария, который веб-сервер будет использовать для доступа к будущему)
Настраивается APC очень просто. Сначала необходимо его установить:

sudo apt-get install php-pear
sudo apt-get install php5-dev apache2-prefork-dev build-essential
sudo pecl install apc

Теперь нужно скопировать файл apc.php, который я прикрепил к уроку положить на сервер, после этого перезагружаем апач:

sudo /etc/init.d/apache2 restart

Теперь можете открыть файл http://test/apc.php и посмотреть статистику apc.

apc drupal

Будет примерно вот такая вот статистика. Как видите на диаграммах картина не очень. Очень большое количества отсутствия файлов в кеше (MISS) и маленькое количетсво наличия файлов в кеше (HITS). И фрагментация файлов в памяти APC высока. Все это говорит об неэффективном использование APC. Почему это происходит:

Не хватает памяти: если у вас 8 МБ для APC, а размер подгружаемых скриптов 12 МБ, то вам не хватит 8 МБ под эти файлы, поэтому появляются новые MISS.

Фрагментация: возможно что размер памяти под APC у вас 32 МБ, но файлов на 40 МБ. Но не всегда все файлы используются. Например какой-то модуль подгружается время от времени и используйтся редко. И может так получится, что из-за настроек APC, эти файлы будут в кэше лежать без дела, когда активные файлы будут нуждаться в кеширование. Файлы в кэш записываются не всегда блоками, возможно что размер файла большой и чтобы его уместить его в кеше нужно разбить его на две части, и получается в памяти появляются пробелы.

Но для начала разберемся с полями конфигурации APC, файл конфигурации APC в debian/ubuntu находится в /etc/php5/conf.d/apc.ini:

apc.enabled=1

APC включен. Довольно очевидная настройка, но очень важная. Отключение APC может привести к уменьшению производительности на рабочем сервере.

apc.shm_segments=1
apc.shm_size=32

Эти настройки показывают сколько памяти выделять под APC. APC.shm_segments=1 - показывает что выделяется один сегмент памяти, а apc.shm_size=32 показывает, что размер этого сегмента 32 мегабайта. Вы можете поменять размер сегмента, скажем на 64 мегабайта и перезапустить апач. Потом если количество MISS не будет сведено к 1% сделать размер 128 МБ  и так далее. Мне кажется это основной параметр для работы с APC.

apc.cache_by_default=1

;apc.filters=

Работа APC для всех php скриптов. При этом мы можем закомментировать строчку с apc.filters.

apc.cache_by_default=0
apc.filters="+drupal6"

Таким образом мы можем ограничить использование APC, только для файлов Друпала 6. Это нужно когда мы не хотим потерять кеш всякий раз, когда пользуемся PhpMyAdmin на сервере.

apc.stat=1

Этот параметр напрямую влияет на производительность. При включенной настройке кеш в APC остается там пока не будет удален. В случае когда настройка отключена, то APC будет сравнивать время выполнения скрипта и время последнего изменения файла и добавлять в кеш новую версию. Эта настройка необходима для рабочего сервера, однако для разработки эту настройку лучше всего отключить. И еще при включенной настройке apc.stat необходимо очистить кеш APC при обновление модулей и ядра Друпала.

apc.ttl=0

Эта настройка показывает через сколько милисекунд очистить кеш. При 0 кеш не очищается. Поэтому мы ставим 0, мы же не хотим чтобы каждый час нужный нам кэш очищался (по умолчанию 7200, то есть 2 часа).

apc.rfc1867=1

Эту настройку можно включить для Друпала если вы хотите, чтобы статус загрузки файлов отображался через APC.

apc.num_files_hint=2048

Эта настройка может быть очень нужна, когда на сервере несколько сайтов, несколько друпалов. Потому что один друпал может забивать в кэш более 500 файлов. Чтобы кеш одного сайта не затирал в кэше файлы другого, лучше включить эту настройку побольше (по умолчанию 1024).

После правки настроек, не забудьте перезагрузить сервер. В результате у вас должны быть вот такие графики:

apc php

Заметьте что количество MISS должно быть близко к нулю, а фрагментация 0%.

ВложениеРазмер
Файл apc.rar11.55 КБ

Комментарии

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

apc.cache_by_default=0 apc.fi

apc.cache_by_default=0

apc.filters = "+sayt1,+sayt2,+sayt3"

 

Сайт 4 будет работать без APC

/home/user/sayt4

 А как запретить кешировать только папку phpMyAdmin  на сайте 1, а всё кроме неё чтоб кешировалось?

сделайте папку

сделайте папку apc

/home/user/apc

и в нее помещайте сайты, которые нужно кешировать. А для phpmyadmin сделайте отдельный поддомен и разместите phpmyadmin вне папки apc.

А в конфиге напишите:

apc.filters = "+apc"

 

Вот вы пишеие про параметр

Вот вы пишеие про параметр apc.stat что если установить его в 0, то сервер не будет сравнивать текущую дату и время модификации реального php файла. Тогда получается что он вообще не будет проверять его наличие? Если удалить файл после того как он попал в кеш по идее тогда скрипт должен продолжать работу?

 

Я провёл эксперемент установил apc.stat=0 и после кеширования файла модели подменил в ней данные. Результат в представлении в этом случаи должен был бы остаться неизменным, но этого не происходит и данные из базы данных подменяются значением из массива установленными в ручную, а значит кешь файла всётаки обновился.

 

Тестировал на PHP 5.3 Centos 6 x64. Можете что то сказать по этому поводу?

Как я понял именно при

Как я понял именно при ВКЛЮЧЕНОЙ опции файл останется неизменным. Вы же опицю выключили (значение 0), а значит скрипт будь проверяться на изменение.

Да на 0 будет работать

Да на 0 будет работать быстрее, потому что apc впервую очередь нужен на production сервере, где сайт работает, а не разрабатывается. Сделайте себе отдельный сервер или папку на сервере, где apc работать не будет.