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

2

Когда вы спрашиваете о программе, вы можете использовать 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .