Есть ли способ ограничить размер буферного кэша в 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
Во время выполнения программы временно сокращается объем используемой памяти.
Могу ли я как-то ограничить кеширование страниц, дентрии и иноды вместо того, чтобы постоянно их освобождать? Это, вероятно, решит мою проблему.
Раньше не замечал этого, но проблема возникает с каждой операцией ввода-вывода, а не только с разделением. Похоже, что linux кэширует все, что происходит через ввод / вывод, до определенной точки, когда он достигает почти максимальной доступной памяти, оставляя 4 МБ свободной памяти. Таким образом, существует некоторый верхний предел для того, сколько памяти может быть кэшировано для ввода-вывода. Но я не могу найти где это. Добрые от отчаяния. Если я не могу разделить его на 2 где-нибудь в исходниках ядра, я с радостью сделаю это.
12-12-2016 Обновление: я перестал исправлять это, но что-то привлекло мое внимание и напомнило мне об этой проблеме. У меня дома старый неисправный жесткий диск, и он тратит ресурсы, как сумасшедшие, когда я пытаюсь что-то с ним сделать.
Возможно ли, что это может быть в случае сбоя жесткого диска? HDD, о котором идет речь, умер в течение месяца с момента возникновения моей проблемы. Если это так, у меня есть мой ответ.
1 ответ
Когда вы спрашиваете о программе, вы можете использовать cgroups:
Создайте cgroup с именем наподобие group1 с ограничением памяти (например, 50 ГБ, поддерживаются и другие ограничения, например, CPU, например, также упоминается CPU):
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)
Или запустите ваше приложение в этой группе:
cgexec -g memory,cpu:group1 your_app_name