Есть ли способ ограничить размер кэша буфера в Linux?

Есть ли способ ограничить размер кэша буфера в Linux?

У меня есть программа, потребляющая много памяти во время операций ввода-вывода, что является побочным эффектом выполнения большого их количества. Когда я запускаю программу с использованием direct_io, проблема с памятью исчезает, но время, необходимое программе для завершения работы, увеличивается в четыре раза.

Есть ли способ уменьшить максимальный размер буферного кэша (буфер ядра, используемый во время операций ввода-вывода)? Желательно без изменения исходников ядра.

Я пробовал уменьшать /proc/sys/vm/dirty_bytes и т. д. Но, похоже, это не дает заметной разницы.

ОБНОВЛЕНИЕ: использование echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches Во время выполнения программы временно уменьшает объем используемой памяти.

Можно ли как-то ограничить pagecache, dentry и inodes вместо того, чтобы постоянно их освобождать? Это, вероятно, решило бы мою проблему.

Раньше этого не замечал, но проблема возникает с каждой операцией ввода-вывода, не только с разделением. Похоже, что Linux кэширует все, что проходит через ввод-вывод, до определенного момента, когда он достигает почти максимального объема доступной памяти, оставляя 4 МБ свободной памяти. Так что есть какой-то верхний предел того, сколько памяти может быть кэшировано для ввода-вывода. Но я не могу найти, где он находится. Начинаю отчаиваться. Если я не могу разделить это на 2 где-то в исходниках ядра, я с радостью это сделаю.

12-12-2016 Обновление: Я отказался от решения этой проблемы, но что-то привлекло мое внимание и напомнило мне об этой проблеме. У меня дома есть старый неисправный жесткий диск, и он тратит ресурсы как сумасшедший, когда я пытаюсь что-то с ним сделать.

Возможно ли, что это просто выход из строя жесткого диска? Жесткий диск, о котором идет речь, умер в течение месяца с момента возникновения моей проблемы. Если это так, то я получил ответ.

решение1

Как вы спрашиваете опрограмма, вы могли бы использоватьcgroups:

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

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)

Или запустите свое приложение в этой cgroup:

cgexec -g memory,cpu:group1 your_app_name

Связанный контент