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