Из-за того, что я не смог найти надежную программу в сети, которая извлекает все ключи memcache после подсчета ключей в slab> 500k, я хотел написать свою собственную программу на PHP.
Затем я понял, что есть причина, по которой все программы действительно не работали для этого большого количества ключей.
Когда я читаю ключи со stats cachedump <slab-id> <limit>
он возвращает только определенное количество ключей, которое заканчивается – в моем случае – примерно на 30k.
Как я могу получить хотя бы эти 500 тыс., Которые могут быть в одной плите?
Все «сообщения» и «ответы», которые предлагают использовать memdump
, не работают. У них тоже есть это ограничение.
Я использую memcached 1.4.25
После отладки memcached
источника я понял, что ограничение находится в items.c
/ item_cachedump()
вызванном этой строкой:
unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */
Из-за этого назначения выделенный буфер ограничивает количество возвращаемых ключей, потому что общая длина всех ключей [включая \r\n
после каждого имени ключа] не должна превышать этот размер.
Я мог бы решить для моего случая проблему таким образом, что я изменил ее на:
unsigned int memlimit = 128 * 1024 * 1024;
и перекомпиляция memcached
. Теперь я могу читать около 700 тыс. Ключей [у меня не было больше клавиш для максимальной функции].
Я узнал, что очень высокая ценность делает систему нестабильной. При значении 500 * 1024 * 1024
[экв. 500 МБ] моя система почти разбилась с такими сообщениями:
shell-init: ошибка получения текущего каталога: getcwd: не может обращаться к родительским каталогам: нет такого файла или каталога
Даже у моего сервера 5 ГБ оперативной памяти, я действительно не понимаю, почему, но в итоге значение 128 МБ является полезной величиной.
Я попросил команду разработчиков memcached
добавить переключатель, который может установить значение в командной строке.