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

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

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

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

Итак, я ищу способ сказать Linux что-то вроде «эй, используйте только 1 ГБ (или лучше, для этого, когда приложению это не нужно.

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

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

2
задан 2 February 2016 в 08:05
3 ответа

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

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

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

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

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

.
1
ответ дан 3 December 2019 в 12:42

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

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

cgcreate -g memory,cpu:group1

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

Затем введите приложение в эту контрольную группу после запуска:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)
0
ответ дан 3 December 2019 в 12:42

vm.min_free_kbytes выглядит так, как будто это может помочь. Eg. exec

echo 5248000 > /proc/sys/vm/min_free_kbytes

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

.
0
ответ дан 3 December 2019 в 12:42

Теги

Похожие вопросы