Обновлено, смотрите в нижней части длинного (извините) вопроса.
Глядя на нашу статистику memcached, я думаю, что нашел проблему, о которой раньше не знал. Кажется, что у нас странно много пустого места. Я проверил phpmemcacheadmin на предмет изменений и обнаружил, что это изображение смотрит на меня:
Теперь у меня сложилось впечатление, что в худшем случае будет 50% отходов, хотя я первый, кто признает, что не знает всех деталей. Я прочел, среди прочего, эту страницу, которая действительно несколько устарела, но также и наша версия memcached. Я думаю, что я понимаю, как работает система ( например ), я верю, но мне трудно понять, как мы можем получить до 76% потраченного впустую пространства.
Показатель выселения, который показывает phpmemcacheadmin 2 ev/s
, так что здесь есть некоторая проблема.
Основной вопрос: что я могу сделать, чтобы это исправить . Я мог бы бросить больше памяти (есть некоторые дополнительные доступные, я думаю), возможно, я должен возиться с конфигом slab (это вообще возможно в этой версии?), Может быть есть другие варианты? Обновление версии memcached не является доступной опцией.
Второй любопытный вопрос, из любопытства, это, конечно, если ожидается, что будет потрачено 75% (и все больше) потерянного пространства, и если да, то почему.
Система: В настоящее время я ничего не могу с этим поделать, я знаю, что версия memcached не самая новая, но это карты, которые мне сдали.
- Memcached 1.4.5
- Apache 2.2.17
- PHP 5.3.5
В ответ на ответ @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 МБ. Быстрый расчет, который я сделал (поправьте меня, если я ошибаюсь) был:
- предыдущий кусок имеет размер фрагмента 328, поэтому в худшем случае этот фрагмент заполнен фрагментами 329 байт.
- это означает, что он тратит 167 байт на использованный блок = 12942834 байт = 12,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.
Для упрощения объяснения предположим, что у вас есть memcache с 3 МБ оперативной памяти с 3 Slabs:
Выполните один «набор» размером 10К. Вы увидите в своей статистике (примерно), что у вас есть:
Это связано с тем, что memcached выделил один кусок из "класса 1 плиты", и 99% памяти для этой плиты "потеряно", а 1% "использовано". Это не означает, что плита и память, выделенная для этой плиты, исчезли.
Выполните еще один "набор" размером 10 КБ. На этот раз вы увидите:
так что теперь вы используете 2 из 100 выделенных блоков в slab 1, статистика «потраченных впустую» отброшена, а используемая статистика увеличилась.
Нет ничего плохого в том, что использованный% + потраченный% равен 100%. Это не означает, что у вас больше нет памяти, это просто означает, что вы выделили по крайней мере один кусок из каждой плиты.
Чтобы увидеть эту проблему "набор" с размером 100 КБ и еще один с размером 1000 КБ
Теперь вы увидите
источник
У вас, наверное, очень большое количество очень маленьких предметов. Как правило, наименьшая плита содержит 104-байтовые записи. Если у вас есть много записей, которые просто отображают одно целое число в другое, вы можете получить отходы до 85%.
Вы можете найти информацию о том, как это настроить, в статье Memcached для небольших объектов .
источник
-f 1.5 -I 2800
может помочь.-I 2800
что означает 2800K, а не 1M по умолчанию?У меня была эта проблема, и я перешел из memcached в redis (без сохранения на диск). Я знаю, что это может быть невозможно, но вы могли бы попробовать это как вариант и следить за фрагментацией памяти. Вы можете даже включить постоянство, чтобы исправить проблемы «старого кэша» при перезапуске.
источник