Как отключить кэширование блоков для отдельных процессов?

Как отключить кэширование блоков для отдельных процессов?

У меня большая система со множеством дисковых служб. Они работают намного лучше с использованием кэша блоков.

Помимо этого, также выполняется какой-то процесс резервного копирования.

Я знаю, как им следует использовать кэш блоков: они ни в коем случае не должны этого делать.

Резервное копирование происходит путем копирования блочного устройства на другое с помощьюbufferкоманда. Вероятность того, что потребуется какое-либо кэширование, практически равна нулю.

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

Можно ли как-то настроить эту bufferкоманду так, чтобы она вообще не использовала кэш блоков?

Он копирует тома lvm на другой, если это имеет значение.

решение1

Я нашелnocacheинструмент для выполнения задачи.

В общем случае, в Linux это невозможно: нет такой опции, или флага, или чего-то еще, что можно было бы настроить дляпроцесс.

Однакоposix_fadvise(...)Вызов может быть использован для информирования подсистемы кэширования блоков/буферов, когда ожидается последовательная операция чтения/записи. A POSIX_FADV_DONTNEEDдает ядру «дополнительную информацию», что оно не должно их кэшировать, поскольку они не будут повторно прочитаны в ближайшем будущем.

nocacheперехватывает все важные файловые операции с posix_fadvise(...)помощью общей библиотеки, внедренной LD_PRELOADпеременной окружения.

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

решение2

Такие инструменты nocacheна самом деленетсоответствующее решение. ЦитироватьnocacheИсточник:

Что это за инструмент?нетхорош для:

  • Управление использованием кэша вашей страницы
    • Почему вы думаете, что какой-то случайный инструмент, найденный вами на GitHub, может быть лучше ядра Linux?
  • Защита от переполнения кэша
    • Используйте cgroups для ограничения объема памяти, который имеет процесс. Смотрите ниже или поищите в Интернете, это широко известно, работает надежно и не приводит к потерям производительности или потенциально опасному поведению, как этот инструмент.

Итак, используйте cgroups (точнее, в 2023 году определенно cgroupsv2, когда это возможно), чтобы ограничить объем кэша, который может использовать ваш процесс (и, таким образом, ограничить объем кэша, который он может освободить):

Как запустить процесс и его дочерние процессы в cgroup с ограничением памяти

Сделайте это, например, если вы хотите выполнить резервное копирование, но не хотите, чтобы ваша система замедлялась из-за переполнения кэша страниц.

Если вы используете systemd

Если ваш дистрибутив использует systemd, это очень просто. Systemd позволяет запускать процесс (и его подпроцессы) в «области», которая является cgroup, и вы можете указать параметры, которые будут переведены в пределы cgroup.

Когда я создаю резервные копии, я делаю следующее:

$ systemd-run --scope --property=MemoryLimit=500M -- backup command 

( MemoryMaxдля версии 2)

Эффект заключается в том, что пространство кэша остается ограниченным дополнительным максимальным размером в 500 МБ:

До:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.4G        1.3G        1.0G        3.7G        3.7G
Swap:          9.7G         23M        9.7G

Во время (обратите внимание, что бафф/кэш увеличиваются всего на ~300 МБ):

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.5G        1.0G        1.1G        4.0G        3.6G
Swap:          9.7G         23M        9.7G

Как это работает?

Используйте systemd-cglsдля перечисления cgroups, которые создает systemd. В моей системе указанная выше команда создает группу, называемую run-u467.scopeв system.sliceродительской группе; вы можете проверить ее настройки памяти следующим образом:

$ mount | grep cgroup | grep memory cgroup on
/sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec
latime,memory)

$ cat /sys/fs/cgroup/memory/system.slice/run-u467.scope/memory.limit_in_bytes
524288000

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