Назад | Перейти на главную страницу

Неожиданно (?) Слишком много потраченной впустую памяти в memcached

Обновлено, см. Внизу длинный (извините) вопрос.

Глядя на нашу статистику memcached, я думаю, что обнаружил проблему, о которой раньше не знал. Похоже, у нас очень много потраченного впустую пространства. Я проверил с phpmemcacheadmin для разнообразия и обнаружил, что это изображение смотрит на меня:

Теперь у меня сложилось впечатление, что в худшем случае будет 50% потерь, хотя я первый, кто признает, что не знаю всех деталей. Я прочитал - среди прочего - эта страница который действительно несколько устарел, но и наша версия memcached. Думаю, я понимаю, как работает система (например) Я верю, но мне трудно понять, как мы могли бы достичь 76% потерянного пространства.

Показатель выселения, который показывает phpmemcacheadmin, составляет 2 ev/s, так что здесь есть проблема.

Система: В настоящее время я ничего не могу с этим поделать, я знаю, что версия memcached не самая новая, но это карты, которые я получил.

В ответ на ответ @DavidSchwartz: вот статистика плит, которую производит phpmemcacheadmin: (есть еще плиты, кстати, чем эти)

(Я также вставил сюда статистику чуть позже в текстовом формате.)

ОБНОВИТЬ

Я перезапустил демон с помощью -f 1.5, и это выглядело действительно хорошо. После некоторого потепления у нас было израсходовано / потрачено 50/50. Но, как и раньше, чем дольше у нас было в течение дня (он становится более загруженным в течение дня), он начал возвращаться к тому, что есть сейчас: 30/70, а потери все еще растут. Кроме того, я до сих пор не знаю, откуда берутся «потраченные впустую». Я вижу эту плиту:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

Он не заполнен, не выселен, но тратит 117,3 Мбайт. Быстрый расчет, который я сделал (поправьте меня, если я ошибаюсь), был:

Так где же тогда другой 105 МБ потрачено впустую родом из? Рядом с ним старший брат выглядит так:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

С момента этого вопроса прошел год, и я не знаю, нашли ли вы свой ответ, но я собираюсь сказать, что ваше восприятие «напрасно» неверно.

Потраченная впустую память выделяется в памяти, поэтому она не может использоваться другим приложением, но по-прежнему доступна для memcached.

Чтобы упростить объяснение, предположим, что у вас есть кэш памяти с 3 МБ оперативной памяти с 3 пластинами:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

Выполните одиночный «набор» размером 10к. Вы увидите в своей статистике (примерно), что у вас есть:

0.03% used
66.6% free
33% wasted

Это связано с тем, что memcached выделил один фрагмент из «slab class 1», и 99% памяти для этого slab «потрачено впустую», а 1% «используется». Это не означает, что slab и память, выделенная для этого slab, исчезли.

Выполните еще один одиночный «набор» размером 10к. На этот раз вы увидите:

0.06% used
66.6% free
32.7% wasted

Итак, теперь вы используете 2 из 100 выделенных фрагментов в слэбе 1, статистика «потраченных впустую» упала, а использованная статистика увеличилась.

Нет ничего плохого в том, что used% + wasted% равняется 100%. Это не означает, что у вас больше не осталось памяти, это просто означает, что вы выделили хотя бы один фрагмент из каждой плиты.

Чтобы увидеть эту проблему, «набор» размером 100 КБ и еще один - размером 1000 КБ

Теперь ты увидишь

36.6% used
   0% free
63.3% wasted

Вероятно, у вас очень много очень маленьких объектов. Как правило, самая маленькая плита содержит 104-байтовые записи. Если у вас много записей, которые просто сопоставляют одно целое число с другим, вы можете потерять до 85%.

Информацию о том, как это исправить, вы можете найти в статье. Memcached для небольших объектов.

У меня возникла эта проблема, и я перешел с memcached на redis (без сохранения на диске). Я знаю, что это может быть невозможно, но вы можете попробовать это как вариант и следить за фрагментацией памяти. Вы даже можете включить постоянство, чтобы исправить проблемы со старым кешем при перезапуске.