Обновлено, см. Внизу длинный (извините) вопрос.
Глядя на нашу статистику memcached, я думаю, что обнаружил проблему, о которой раньше не знал. Похоже, у нас очень много потраченного впустую пространства. Я проверил с phpmemcacheadmin для разнообразия и обнаружил, что это изображение смотрит на меня:
Теперь у меня сложилось впечатление, что в худшем случае будет 50% потерь, хотя я первый, кто признает, что не знаю всех деталей. Я прочитал - среди прочего - эта страница который действительно несколько устарел, но и наша версия memcached. Думаю, я понимаю, как работает система (например) Я верю, но мне трудно понять, как мы могли бы достичь 76% потерянного пространства.
Показатель выселения, который показывает phpmemcacheadmin, составляет 2 ev/s
, так что здесь есть проблема.
Главный вопрос: что я могу сделать, чтобы исправить это. Я мог бы добавить в него больше памяти (я думаю, есть некоторые дополнительные возможности), может быть, мне стоит поиграть с конфигурацией плиты (возможно ли это вообще с этой версией?), Может быть, есть другие варианты? Обновление версии memcached не является быстрым вариантом.
Второй вопрос, вызванный любопытством, - это, конечно, ожидаемый уровень 75% (и рост) потраченного впустую пространства, и если да, то почему.
Система: В настоящее время я ничего не могу с этим поделать, я знаю, что версия 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 (без сохранения на диске). Я знаю, что это может быть невозможно, но вы можете попробовать это как вариант и следить за фрагментацией памяти. Вы даже можете включить постоянство, чтобы исправить проблемы со старым кешем при перезапуске.