Фрагментация кэша APC на сайте WordPress

Недавно я установил и активировал кеш APC на веб-сервере (Centos 5.7, PHP 5.3, 1,5 ГБ ОЗУ), который в основном предназначен для среднего трафика (30 тыс. Уникальных посетителей в месяц). Сайт WordPress, на котором запущен W3Total Cache, настроен на использование APC для кэширование базы данных и объектов (страница, минимизация использования диска).

Информационная страница APC для сервера показывает, что постоянно наблюдается сильная фрагментация. Например, после перезапуска httpd фрагментация достигает 75% через 11 часов, а через пару дней я видел 100%. Я никогда не видел, чтобы использовалось более 40% кэш-памяти, и сервер постоянно работал с объемом используемой памяти около 400 МБ, 1100 МБ свободно (- / + буферы / кеш, как сообщает free -m). Так что, похоже, фрагментация не связана с нехваткой памяти.

Я начал с конфигурации APC и W3TC по умолчанию и пробовал различные комбинации следующих изменений:

  • apc.ttl уменьшен до 1800 (с 7200).
  • apc.user_ttl установлен в 0 (единственное, что использует пользовательский кеш, - это W3TC, и он устанавливает свои собственные TTL)
  • Тайм-аут W3TC увеличен со 180 до 7200 секунд.
  • apc.filters для блокировки timthumb

Ни одно из этих изменений, похоже, не имело большого значения, хотя до сих пор субъективная производительность и время загрузки страницы, измеренные с помощью инструментов Google для веб-мастеров, не повлияли ни на что.

Стоит ли мне об этом беспокоиться? Хотя текущая производительность предполагает, что это не так, я бы предпочел отсортировать это до того, как нагрузка на сервер / трафик сайта возрастут. Если это вызывает беспокойство, какие шаги я могу предпринять для решения?

РЕДАКТИРОВАТЬ: - Вот полный файл конфигурации apc.ini: -

; Enable apc extension module
extension = apc.so

; Options for the APC module version >= 3.1.3
; See http://www.php.net/manual/en/apc.configuration.php

; This can be set to 0 to disable APC. 
apc.enabled=1
; The number of shared memory segments to allocate for the compiler cache. 
apc.shm_segments=1
; The size of each shared memory segment, with M/G suffixe
apc.shm_size=256M
; A "hint" about the number of distinct source files that will be included or 
; requested on your web server. Set to zero or omit if you're not sure;
apc.num_files_hint=1024
; Just like num_files_hint, a "hint" about the number of distinct user cache
; variables to store.  Set to zero or omit if you're not sure;
apc.user_entries_hint=4096
; The number of seconds a cache entry is allowed to idle in a slot in case this
; cache entry slot is needed by another entry.
apc.ttl=7200
; use the SAPI request start time for TTL
apc.use_request_time=1
; The number of seconds a user cache entry is allowed to idle in a slot in case
; this cache entry slot is needed by another entry.
apc.user_ttl=0
; The number of seconds that a cache entry may remain on the garbage-collection list. 
apc.gc_ttl=3600
; On by default, but can be set to off and used in conjunction with positive
; apc.filters so that files are only cached if matched by a positive filter.
apc.cache_by_default=1
; A comma-separated list of POSIX extended regular expressions.
apc.filters="-.[omitted]/timthumb.php$"
; The mktemp-style file_mask to pass to the mmap module 
apc.mmap_file_mask=/tmp/apc.XXXXXX
; This file_update_protection setting puts a delay on caching brand new files.
apc.file_update_protection=2
; Setting this enables APC for the CLI version of PHP (Mostly for testing and debugging).
apc.enable_cli=0
; Prevents large files from being cached
apc.max_file_size=1M
; Whether to stat the main script file and the fullpath includes.
apc.stat=1
; Vertification with ctime will avoid problems caused by programs such as svn or rsync by making 
; sure inodes havn't changed since the last stat. APC will normally only check mtime.
apc.stat_ctime=0
; Whether to canonicalize paths in stat=0 mode or fall back to stat behaviour
apc.canonicalize=0
; With write_lock enabled, only one process at a time will try to compile an 
; uncached script while the other processes will run uncached
apc.write_lock=1
; Logs any scripts that were automatically excluded from being cached due to early/late binding issues.
apc.report_autofilter=0
; RFC1867 File Upload Progress hook handler
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
; Optimize include_once and require_once calls and avoid the expensive system calls used.
apc.include_once_override=0
apc.lazy_classes=0
apc.lazy_functions=0
; Enables APC handling of signals, such as SIGSEGV, that write core files when signaled. 
; APC will attempt to unmap the shared memory segment in order to exclude it from the core file
apc.coredump_unmap=0
; Records a md5 hash of files. 
apc.file_md5=0
; not documented
apc.preload_path

ОБНОВЛЕНИЕ Я также опубликовал на форумах WP и получил ответ от автора W3TotalCache: -

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

Таким образом, похоже, что W3TotalCache является основной причиной фрагментации.


person rowatt    schedule 15.02.2012    source источник


Ответы (1)


Попробуйте увеличить размер сегмента, используемого APC. Используйте только один сегмент. Также получите доступ к интерфейсу администратора wp из созданного вами поддомена.

Оптимизация кеширования APC

Если на вашем сервере есть другие хосты, для которых не требуется кеширование кода операции, вы можете отключить APC для этих сайтов. Вы можете сделать это на уровне vhost, установив apc.cache_by_default=0 в файле apc.ini и поместив php_flag apc.cache_by_default On в файл .htaccess в корневой каталог wp. Это должно быть причиной фрагментации.

Изменения в файлах также могут вызвать фрагментацию. Отредактированный файл будет удален, а новый файл будет добавлен в кеш. Если вы еще этого не сделали, вам также следует установить apc.stat=0. Это улучшит общую производительность, поскольку не будет каждый раз проверять, были ли файлы изменены или нет.

Если вы не хотите, чтобы WP Admin кэшировался, вы можете создать поддомен, например admin.example.com, и получить доступ к панели администратора. Сделав это, вы сможете отключить кеширование опкодов. Что также уменьшит фрагментацию.

Обновление: отключение кеширования объектов и кэширования баз данных помогает уменьшить фрагментацию. Использование redis или memcached для кэширования объектов и APC для кэширования только кода операции решает проблему.

person Serkan Yilmaz    schedule 15.02.2012
comment
У меня только 1 сегмент (apc.shm_segments = 1), и это 256M (apc.shm_size = 256M). Может быть, я неправильно понимаю, но поскольку я никогда не видел, чтобы использовалось более 40% этой памяти, как поможет увеличение размера сегмента? - person rowatt; 15.02.2012
comment
Какую версию APC вы используете? - person Serkan Yilmaz; 16.02.2012
comment
@rowatt, вы когда-нибудь проверяли фрагментацию при установке apc.ttl=0? Обычно некоторая фрагментация в APC считается нормальной, но 100% фрагментация - это слишком. Вы также используете очень большой сегмент. Для WP от 48 до 64 Мбайт кеша вполне достаточно, хотя большой сегмент не может быть причиной фрагментации. Есть ли другие VirtualHosts на том же сервере? Я также хочу спросить, использует ли кто-нибудь интерфейс WP Admin при получении этих результатов? Можете ли вы добавить к своему вопросу полный apc.ini? - person Serkan Yilmaz; 16.02.2012
comment
Я только что установил apc.ttl = 0 и все еще вижу фрагментацию (8% после перезапуска httpd 20 минут назад). На сервере есть еще 4 хоста с низким трафиком, но один использует Code Igniter, что, возможно, объясняет более высокие, чем обычно, требования к памяти. Доступ к wp-admin на этом сервере ограничен (и его нет после перезапуска httpd). Все записи в пользовательском кэше взяты из W3TC, и все они имеют TTL 7200 ... поэтому я озадачен тем, как память может фрагментироваться всего через 20 минут, когда еще достаточно (›200M) свободной кэш-памяти! - person rowatt; 16.02.2012
comment
Спасибо за обновления. Я не знал об использовании apc.cache_by_default для включения / выключения apc для vhosts, так что это действительно полезно. Я не понимаю, как apc.stat может помочь фрагментации ... конечно, если он установлен на 0 и файл изменяется, кеш не будет обновляться, и это уменьшит фрагментацию, но если файл был изменен, я хочу, чтобы он обновляться, нет? В любом случае ... установка apc.stat на 0 и отключение APC на всех других хостах не решила проблему. Я все еще наблюдаю сильную фрагментацию, несмотря на то, что имеется много свободной кэш-памяти. :-( - person rowatt; 17.02.2012
comment
@rowatt Можете ли вы отключить кеширование базы данных и объектов и просто кэшировать код операции и просматривать результаты? - person Serkan Yilmaz; 17.02.2012
comment
Хорошее предложение! За последние пару дней я пытался отключить кеширование БД и объектов, или оба, и во всех случаях фрагментация уменьшилась. Короткий тест с выключенными обоими значениями не привел к фрагментации (как и ожидалось - поскольку TTL для кода операции равен 0), только кэширующая БД привела к очень небольшой фрагментации через несколько часов, а через 2 дня фрагментация в кэше объектов составила лишь 35%. Итак ... похоже, что кеш объектов W3TC является основным виновником, а включение кеша БД делает его намного хуже. - person rowatt; 20.02.2012
comment
@rowatt Если вы хотите также кэшировать их, вы можете использовать memcached. - person Serkan Yilmaz; 20.02.2012