Memcache не очищает и не очищает память - PullRequest
12 голосов
/ 12 октября 2009

Я пытался очистить свой memcache, поскольку заметил, что при использовании ps -aux память занимает почти 30% памяти сервера.

Итак, я запустил следующий код php.

$memcache = new Memcache;
    $memcache->connect("localhost",11211);
    $memcache->flush();
    print_r($memcache->getStats());

В результате получается

(
    [pid] => 4936
    [uptime] => 27318915
    [time] => 1255318611
    [version] => 1.2.2
    [pointer_size] => 64
    [rusage_user] => 9.659531
    [rusage_system] => 49.770433
    [curr_items] => 57864
    [total_items] => 128246
    [bytes] => 1931734247
    [curr_connections] => 1
    [total_connections] => 128488
    [connection_structures] => 17
    [cmd_get] => 170288
    [cmd_set] => 128246
    [get_hits] => 45464
    [get_misses] => 124824
    [evictions] => 1009
    [bytes_read] => 5607431213
    [bytes_written] => 1806543589
    [limit_maxbytes] => 2147483648
    [threads] => 1
)

Это должно быть довольно просто, но ясно, что я что-то упускаю.

Ответы [ 5 ]

16 голосов
/ 12 октября 2009

Вам действительно нужно изменить настройки memcached, чтобы он не занимал так много памяти. Когда вы запускаете memcached, вы можете передать ему объем памяти, который он должен использовать, в мегабайтах, используя флаг -m. Подробнее см. в документации .

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

12 голосов
/ 19 ноября 2009

Колин, Команда «Очистить все» приводит к тому, что кэш-память устанавливает текущее время истечения срока действия. Следующий запрос на существующий ключ ничего не вернет, и запись будет удалена из кеша. Memcached не имеет отдельного процесса для очистки просроченных элементов и использует «ленивый» метод, который делает процесс очень легким и эффективным. Из-за этого, если вам нужно действительно удалить кеш и начать с нуля, единственный реальный способ сделать это - перезапустить Memcached. Долгосрочный обходной путь - сброс всех ваших ключей, отправка команды «Очистить все», а затем цикл по каждому ключу, выполняющему команду get против него, в результате чего запись удаляется. Не уверен на 100%, сработает ли этот метод, но теоретически звучит правдоподобно.

2 голосов
/ 01 августа 2012

Вам нужно подождать как минимум 1 секунду после очистки memcache. в противном случае элементы, добавленные менее чем за одну секунду, станут недействительными.

Ex:

$memcache->flush();

$time = time()+1; //one second future
while(time() < $time) {
//sleep
}
$memcache->set('key', 'value'); // repopulate the cache 

Посмотрите на этот пост, Memcache Flush Issue

0 голосов
/ 02 марта 2015

На самом деле, самый простой способ освободить все значения - перезапустить экземпляр memcached.

0 голосов
/ 25 мая 2010

Попробуйте это

Mage :: приложение () -> getCacheInstance () -> getFrontend () -> getBackend () -> чистый (Zend_Cache :: CLEANING_MODE_ALL);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...