Что означает критическая запись кэша GC

Время от времени я получаю это странное предупреждение. Обычно он перегружается на страницу. Что это значит. Я googled, но безрезультатно.

Warning: include(): GC cache entry '/.../...class.php' (dev=2049 ino=37120489) was on gc-list for 3840 seconds in /.../...class.php on line 111 

Определенно эта проблема связана с APC, исходным кодом из пакета apc-3.1.6-r1. Когда элемент вставляется в кеш пользователя или кеш-файл, эта функция вызывается.

 static void process_pending_removals(apc_cache_t* cache TSRMLS_DC) { slot_t** slot; time_t now; /* This function scans the list of removed cache entries and deletes any * entry whose reference count is zero (indicating that it is no longer * being executed) or that has been on the pending list for more than * cache->gc_ttl seconds (we issue a warning in the latter case). */ if (!cache->header->deleted_list) return; slot = &cache->header->deleted_list; now = time(0); while (*slot != NULL) { int gc_sec = cache->gc_ttl ? (now - (*slot)->deletion_time) : 0; if ((*slot)->value->ref_count <= 0 || gc_sec > cache->gc_ttl) { slot_t* dead = *slot; if (dead->value->ref_count > 0) { switch(dead->value->type) { case APC_CACHE_ENTRY_FILE: apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.file.filename, dead->key.data.file.device, dead->key.data.file.inode, gc_sec); break; case APC_CACHE_ENTRY_USER: apc_warning("GC cache entry '%s'was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.user.info, gc_sec); break; } } *slot = dead->next; free_slot(dead TSRMLS_CC); } else { slot = &(*slot)->next; } } } 

Из конфигурации APC ( http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl )

apc.gc_ttl integer

Количество секунд, в течение которых запись в кэше может оставаться в списке сбора мусора. Это значение обеспечивает отказоустойчивость в случае, если серверный процесс умирает при выполнении кэшированного исходного файла; если этот исходный файл изменен, память, выделенная для старой версии, не будет исправлена ​​до тех пор, пока этот TTL не достигнет. Установите значение «0», чтобы отключить эту функцию.

Мы получаем сообщения «Запись GC-кэша«% s »(dev =% d ino =% d) была включена в gc-list за% d секунд» или «Запись GC-кэша»% s'was на gc-list за% d секунд » в этом условии:

(gc_sec > cache->gc_ttl) && (dead->value->ref_count > 0)

Первое условие означает, что элемент был удален позже, чем apc.gc_ttl секунд назад, и его все еще в списке сборщиков мусора. Seconds condition означает, элемент все еще ссылается.

например, когда процесс неожиданно умер, ссылка не уменьшается. Первые apc.ttl секунд активны в кэше APC, а затем удаляются (следующий элемент не попадает в этот элемент). Теперь элемент находится в списке сборщиков мусора (GC) и выполняется время ожидания apc.gc_ttl. Когда apc.gc_ttl меньше (теперь – item_deletion_time), предупреждение записывается, и элемент полностью очищается.

Попробуйте проверить свои журналы (веб-сервер, php, system / kernel) на критические ошибки, например, php, веб-сервер segfault.