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