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

Есть ли способ ограничить использование «буферной» памяти в Linux?

Я хотел бы ограничить выделение сервером Linux оперативной памяти в буфер дискового кеша и вместо этого оставить его бездействующим. (CentOS 5, если это важно). Я знаю, что идеально использовать каждую каплю физической оперативной памяти, доступной для что-то даже если просто кэшировать диск - Linux в этом отлично справляется. В большинстве случаев я даже не стал бы пытаться победить это. Позвольте мне сказать вам, почему я хочу (я не озабочены мониторингом):

Моя компания имеет контракт с третьей стороной на некоторые виртуальные машины, и у нас есть фиксированный лимит памяти, включенный в наш ежемесячный счет. Излишки безумно дороги. 2 из этих виртуальных машин запускают приложение, которое просто жует Оперативная память во время запуска процесса, но после стабилизации ее использование сильно снижается. Разработчики уверяют меня, что эта служба должна делать именно это, и в ближайшее время не станет «лучше». Поэтому я оставляю эти виртуальные машины примерно в 2 раза больше оперативной памяти, которая обычно требуется в нормальном режиме работы. После стабилизации лишнее просто сбрасывается в буферный кеш, и все счастливы. Кроме финансистов.

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

Итак, я ищу способ сказать Linux что-то вроде «эй, используйте только 1 ГБ (или лучше, x%) свободной оперативной памяти для буферизации дискового кеша, да, просто продолжайте и тратьте остаток!». Мы могли бы сэкономить много долларов за эти годы, поскольку, если бы эта оперативная память фактически оставалась свободной и не выделялась для буферов, она не засчитывалась бы в нашу выделенную сумму, и нам не пришлось бы ее «сдавать в аренду». Но с тех пор что-то использует его, даже если это просто буферный кеш, мы за него платим.

Я много искал вокруг и в основном вижу такие вопросы, как «Боже мой, почему мой сервер почти на 100% все время ...», и людей, волнующихся о своем мониторинге / тревоге / nms и получающих образование по ответам - это не мой вопрос; У меня была такая же реакция 10 лет назад, но в данном случае я действительно хочу не использовать эту оперативную память, поэтому мне не нужно «платить за нее», когда она не нужна приложению.

Альтернативные предложения приветствуются, если вы думаете о другом способе добиться этого.

Большое спасибо...

Я не знаю, можно ли предотвратить кеширование, но вы можете регулярно просить Linux сбросить кеш. Здесь объясняется, как это сделать: https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system если ты sync прямо перед echo to /proc/sys/vm/drop_caches команда, она должна освободить много оперативной памяти.

Linux не будет активно заполнять вашу оперативную память, открывая файлы и кешируя их. Кэшируются только фактически активные файлы. Это могут быть файлы, используемые вашим приложением, включая двоичный код программы.

Это также могут быть файлы журнала. Вы можете использовать сетевой журнал, чтобы избежать этого.

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

Интересно, как ваш провайдер знает, сколько оперативной памяти выделено, но не используется вашей системой. Эти страницы барана, даже если они не используются, не будут пустыми.

vm.min_free_kbytes похоже может помочь. Например. выполнение

echo 5248000 > /proc/sys/vm/min_free_kbytes

заставит систему всегда оставлять 512 МБ ОЗУ свободной. Если процессу нужна память, он ее получит, после чего система будет пытаться снова освободить этот объем памяти, возможно, за счет освобождения буферного кеша или замены других процессов. Вы можете установить этот параметр после запуска приложения.

Если кеш создается этим приложением, я думаю, вы могли бы использовать cgroups после стабилизации приложения:

Создайте контрольную группу с именем group1 с ограничением памяти (например, 50 ГБ, поддерживаются другие ограничения, такие как ЦП, в примере также упоминается ЦП):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Затем после запуска перенесите приложение в эту cgroup:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)