Может ли демон Memcached когда-либо освобождать () неиспользуемую память, не прерывая процесс? - PullRequest
2 голосов
/ 18 сентября 2010

Я полагаю, что вы не можете заставить запущенный экземпляр Memcached освободить память, если не завершить этот экземпляр Memcached (и освободить всю память, которую он содержал). Кто-нибудь знает какой-либо определенный документ или даже список рассылки или запись в блоге из надежного источника, который может подтвердить или опровергнуть это впечатление?

Насколько я понимаю, процесс Memcached изначально выделяет кусок памяти (точный начальный размер выделения настраивается), а затем монотонно увеличивает использование памяти в течение своего времени жизни, ограниченное максимальным размером выделения памяти демоном (также настраивается) , Ни при каких условиях демон Memcached никогда не освобождает память, независимо от того, нуждается ли демон в постоянной памяти.

Я знаю, что этот вопрос может звучать немного плаксиво, с тоном "Я ТРЕБУЮ, чтобы проект с открытым исходным кодом X поддержал мою конкретную потребность!" Это совсем не так - я просто заинтересован в точном техническом ответе здесь, и я клянусь, что я не критикую Memcached. Для любопытных этот вопрос возник из обсуждения возможных методов изящного манипулирования несколькими экземплярами Memcached на одном сервере с учетом приложения, в котором стоимость очистки кэша может быть довольно высокой.

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

Ответы [ 3 ]

0 голосов
/ 18 сентября 2010

Стандартный и стандартный механизм управления памятью в memcached - распределитель slab Это означает, что память выделяется для процесса и никогда не освобождается операционной системой. По сути, когда память больше не используется для хранения некоторых данных, она удерживается процессом для последующего повторного использования, когда это необходимо. Однако операционная система освобождает память, выделенную процессом, когда он завершен. Вот почему память освобождается, когда вы убиваете / останавливаете memcached.

В memcached есть опция времени компиляции для включения механизма malloc / free . Таким образом, при вызове free () память может быть освобождена для операционной системы (это зависит от реализации стандартной библиотеки C). Но это может повредить хорошей фрагментации и производительности .

Подробнее о проблеме читайте здесь:

0 голосов
/ 18 сентября 2010

Это, вероятно, самая сложная проблема, которую мы должны решить для memcached в настоящее время (ну, во всяком случае, ее вариация).

Чтобы освободить кусок памяти, мы должны знать, что a) ничто внутри блока не являетсяв использовании и б) ничто не начнет использовать его, пока мы находимся в процессе очистки для повторного использования / освобождения.Я слышал несколько действительно хороших идей о том, как мы могли бы решить наши проблемы с балансировкой плит, которые в основном те же, за исключением того, что мы не пытаемся освободить память, а отдать ее чему-то другому (распространенная проблема в нескольких больших установках).

Кроме того, зависит, действительно ли free уменьшает RSS вашего процесса, зависит от реализации.Во многих случаях malloc / fill / free оставляет отображенную память в памяти (если только ваш распределитель не использует mmap вместо sbrk).

0 голосов
/ 18 сентября 2010

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

...