Отключите ограничение кэширования записи – настройка vm.dirty_ratio

Вопрос или проблема

У меня есть нагрузка с крайне высокими скоростями записи в течение коротких промежутков времени. Целевые диски довольно медленные, но у меня достаточно оперативной памяти, и я очень толерантен к мгновенной потере данных.

Я пытался настроить vm.dirty_ratio, чтобы максимально использовать свободное пространство ОЗУ для грязных страниц.

# free -g
              total        used        free      shared  buff/cache   available
Mem:            251           7         213           3          30         239
Swap:             0           0           0

# sysctl -a | grep -i dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 90000
vm.dirty_ratio = 90

Тем не менее, похоже, я все еще сталкиваюсь с ограничением записи, основанным на скорости основного диска. Как я могу это отключить?

# dd if=/dev/zero of=/home/me/foo.txt bs=4K count=100000 oflag=nonblock
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 10.2175 s, 40.1 MB/s

Пока есть свободная память и грязное соотношение еще не превышено – я хотел бы записывать с полной скоростью в кэш страниц.

Проблема не в грязном ограничении, а в немедленной синхронизации. Вы можете проверить это по столбцу bo в vmstat 1 – я получаю:

   -----io----
   bi    bo
    0     0
    0     0
    0  4000
    0     0
    ...

после dd if=/dev/zero of=16/test bs=4k count=1000. (Вывод vmstat просто 1K-“единицы” – /proc/diskstats имеет 512B-единицы)

Добавление conv=notrunc избегает этого, как и команда rm перед этим. См. комментарий sourcejedi.

Опция монтирования ext4 noauto_da_alloc именно для этого: никакой дополнительной sync для этих операций “перезаписи файла”. man ext4 содержит хорошие примеры. Вопрос возвращается к тому, что должно значить “записать” или “сохранить” файл в редакторе, и как сделать это (безопасным при сбоях).


Вы также можете проверить другую сторону: рост грязных страниц:

]# grep nr_dirty /proc/vmstat      
nr_dirty 7886
nr_dirty_threshold 427666
nr_dirty_background_threshold 170815

Пороги – это соотношения, применяемые к текущей доступной памяти. Только с тех пор, как я довольно сильно отключил периодические записи, я вижу более десятка грязных страниц.


vim

Это действительно сложная ситуация; у vim есть как минимум две ключевые опции: fs и wb: синхронизация файла после записи и перезапись через резервную копию.

На ext2 достаточно установить nofs в vim. На ext4 (с данной задержкой выделения) также необходима опция монтирования noauto_da_alloc, чтобы предотвратить немедленную синхронизацию, на этот раз со стороны файловой системы.

dd у вас есть возможность (перезаписать) только часть файла, в отличие от cp или vim)

Ответ или решение

Отключение ограничения записи кэша и настройка vm.dirty_ratio

В условиях работы с высокими темпами записи, особенно с нерегулярными пиками нагрузки, важно оптимально настраивать параметры операционной системы для максимального использования доступной оперативной памяти. Вам уже удалось настроить параметр vm.dirty_ratio для увеличения количества "грязных" страниц (dirty pages), которые могут храниться в оперативной памяти. Однако, как вы заметили, проблема может заключаться не только в настройках dirty_ratio, но и в дополнительных факторах, связанных с записью данных на диск и настройками файловой системы.

Основные параметры Linux для управления "грязными" страницами

  1. vm.dirty_ratio – процент памяти, который может быть занят "грязными" страницами, прежде чем система начнет сбрасывать их на диск.
  2. vm.dirty_background_ratio – процент памяти, при превышении которого фоновые задачи могут запускаться для сброса грязных страниц на диск.
  3. vm.dirty_expire_centisecs – время, через которое "грязные" страницы считаются устаревшими и должны быть сброшены.
  4. vm.dirty_bytes – это значение указывает на абсолютное количество байтов, которое может использоваться для "грязных" страниц.
  5. vm.dirty_background_bytes – это абсолютное количество байтов, при превышении которого будет активировано фоновое сбрасывание.

Решение проблемы с потолком записи

На основании ваших наблюдений с использованием команды vmstat можно сделать вывод, что проблема в работе с кэшем записи (write-back cache) не заключается в грязном кешировании памяти, а в ограничениях, наложенных системой на запись грязных страниц на диск. Следует рассмотреть несколько аспектов:

  1. Использование опции noauto_da_alloc для ext4**:

    • Ваша файловая система ext4 имеет механизм отложенной аллокации (delayed allocation), который может вызывать синхронизацию данных при записи файла. Установка параметра монтирования noauto_da_alloc может помочь избежать ненужной синхронизации при записи.
    mount -o remount,noauto_da_alloc /path/to/mount
  2. Параметры Vim:

    • Если вы используете текстовый редактор vim с учётом частоты записи данных, убедитесь, что в нем отключены параметры, которые могут вызвать дополнительную синхронизацию. Для этого можно использовать:
      :set fs=n
      :set wb=n
  3. Настройка системы для предотвращения синхронизации:

    • Позаботьтесь о том, чтобы уменьшить частоту фоновых операций записи, путем увеличения значения vm.dirty_background_ratio и vm.dirty_background_bytes, чтобы фоновые процессы реже вызывали сброс данных.
  4. Увеличение размера кэша записи:

    • Возможно, вам потребуется увеличить мин. лимит записи через echo <значение> > /proc/sys/vm/dirty_bytes для устранения ограничений кэша.
  5. Настройка параметров I/O:

    • Примените разные алгоритмы планирования ввода-вывода, такие как noop или deadline, которые могут оказать более лояльное влияние на вашу нагрузку в зависимости от специфики использования.

Вывод

Удаление ограничения кэша записи в Linux требует многоступенчатого подхода, который включает как параметры системы, так и настройки конкретных приложений. Используйте указанные рекомендации, чтобы минимизировать влияние дисковых операций на вашу систему. Настраивая параметры и выбирая правильные опции файловой системы, вы сможете заметно улучшить производительность работы с высокоскоростными записями и избежать нежелательных задержек при их обработке.

Оцените материал
Добавить комментарий

Капча загружается...