Фрагментация на APC Cache на сайта на WordPress

Наскоро инсталирах и активирах APC кеш на уеб сървър (Centos 5.7, PHP 5.3, 1,5 Gb RAM), който е предназначен основно за среден трафик (30 000 уникални посетители/месец) WordPress сайт, работещ с W3Total Cache, който е настроен да използва APC за база данни и кеширане на обекти (страница, минимизиране на използване на диск).

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

Започнах с конфигурацията по подразбиране APC и W3TC и опитах различни комбинации от следните промени: -

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

Изглежда, че нито една от тези промени не е направила голяма разлика, въпреки че досега субективната производителност и времената за зареждане на страниците, измерени от Google Webmaster Tools, не изглежда да са засегнати нито по един от двата начина.

Трябва ли да се тревожа за това? Въпреки че текущата производителност предполага, че не, предпочитам да го сортирам, преди натоварването на сървъра/трафикът на сайта да се повиши. Ако е проблем, какви стъпки мога да предприема, за да разреша?

РЕДАКТИРАНЕ: - Ето пълния конфигурационен файл 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 кеширането

Ако има други 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 само за кеширане на опкод решава проблема.

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 MB размер на кеша е достатъчен, въпреки че големият сегмент не може да бъде причина за фрагментацията. Има ли други VirtualHosts на същия сървър? Също така искам да попитам дали някой използва интерфейса на WP Admin, докато взема тези резултати? Можете ли да добавите вашия пълен apc.ini към вашия въпрос? - person Serkan Yilmaz; 16.02.2012
comment
Току-що зададох apc.ttl=0 и все още виждам фрагментация (8% след httpd рестартиране преди 20 минути). Има 4 други vhost на сървъра, те са с нисък трафик, но единият използва 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 на всички други vhosts не е разрешило проблема. Все още виждам силна фрагментация, въпреки че има много свободна кеш памет. :-( - person rowatt; 17.02.2012
comment
@rowatt Можете ли да деактивирате кеширането на база данни и обекти и просто да кеширате кода на операцията и да видите резултатите? - person Serkan Yilmaz; 17.02.2012
comment
Това е добро предложение! През последните няколко дни се опитах да изключа едното или и двете от DB и кеширането на обекти и фрагментацията е намалена във всички случаи. Кратък тест с изключени и двата не доведе до фрагментация (както се очакваше - тъй като TTL е 0 за код на операцията), само кеширането на DB доведе до много малка фрагментация след няколко часа и след 2 дни само 35% фрагментация в кеша на обекта. И така... изглежда, че кешът на обекти на W3TC е основният виновник, а включването на DB кеш го прави много по-лошо. - person rowatt; 20.02.2012
comment
@rowatt Ако искате да кеширате и тези, можете да използвате memcached. - person Serkan Yilmaz; 20.02.2012