Фрагментация APC Cache на сайте WordPress - PullRequest
3 голосов
/ 15 февраля 2012

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: - Вот полный файл конфигурации 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

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

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

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

1 Ответ

5 голосов
/ 15 февраля 2012

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

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

Если на вашем сервере есть другие vhosts, которым не требуется кэширование кода операции, вы можете отключить 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, и получить доступ к панели администратора. Сделав так, вы сможете отключить кеширование кода операции. Что также уменьшит фрагментацию.

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

...