Что означает загадочная запись в кэш GC
Время от времени я получаю это странное предупреждение. Обычно это происходит при перезагрузке страницы. Что это значит. Я погуглил, но безрезультатно.
Warning: include(): GC cache entry '/.../...class.php' (dev=2049 ino=37120489) was on gc-list for 3840 seconds in /.../...class.php on line 111
1 ответ
Определенно эта проблема исходит от 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)
apc.gc_ttl integer
Количество секунд, в течение которых запись в кэше может оставаться в списке сбора мусора. Это значение обеспечивает отказоустойчивость в том случае, если процесс сервера умирает при выполнении кэшированного исходного файла; если этот исходный файл будет изменен, память, выделенная для старой версии, не будет возвращена, пока не достигнут этот TTL. Установите на ноль, чтобы отключить эту функцию.
Мы получаем сообщения "Запись кэша GC"%s "(dev=%d ino=%d) была в списке gc в течение% d секунд" или "Запись кэша GC"%s "была в списке gc в течение% d секунд" в этом состоянии:
(gc_sec > cache->gc_ttl) && (dead->value->ref_count > 0)
Первое условие означает, что элемент был удален позже, чем apc.gc_ttl несколько секунд назад, и он все еще находится в списке сборщика мусора. Условие Seconds означает, что на элемент все еще ссылаются.
например, когда процесс неожиданно остановился, ссылка не уменьшается. Сначала в кэше APC активны apc.ttl секунд, затем он удаляется (следующего элемента по этому элементу нет). Теперь элемент находится в списке сборщика мусора (GC) и время ожидания apc.gc_ttl запущено. Когда значение apc.gc_ttl меньше (теперь - item_deletion_time), выдается предупреждение и элемент полностью сбрасывается.
Попробуйте проверить свои журналы (веб-сервер, php, система / ядро) на наличие критических ошибок, например, php, веб-сервер segfault.