Что означает загадочная запись в кэше 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
Author: Javier Constanzo, 2011-01-11

1 answers

Определенно эта проблема исходит от 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. Установите значение ноль, чтобы отключить эту функцию.

Мы получаем сообщения "Запись кэша 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 секунд назад, и он все еще находится в списке сборщиков мусора. Состояние секунд значит, на элемент все еще есть ссылка.

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

Попробуйте проверить свои журналы (веб-сервер, php, система/ядро) на наличие критических ошибок, например php, web сегментация сервера.

 34
Author: tatra, 2011-01-13 12:55:56