Вопрос или проблема
У меня есть нагрузка с крайне высокими скоростями записи в течение коротких промежутков времени. Целевые диски довольно медленные, но у меня достаточно оперативной памяти, и я очень толерантен к мгновенной потере данных.
Я пытался настроить 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 для управления "грязными" страницами
- vm.dirty_ratio – процент памяти, который может быть занят "грязными" страницами, прежде чем система начнет сбрасывать их на диск.
- vm.dirty_background_ratio – процент памяти, при превышении которого фоновые задачи могут запускаться для сброса грязных страниц на диск.
- vm.dirty_expire_centisecs – время, через которое "грязные" страницы считаются устаревшими и должны быть сброшены.
- vm.dirty_bytes – это значение указывает на абсолютное количество байтов, которое может использоваться для "грязных" страниц.
- vm.dirty_background_bytes – это абсолютное количество байтов, при превышении которого будет активировано фоновое сбрасывание.
Решение проблемы с потолком записи
На основании ваших наблюдений с использованием команды vmstat
можно сделать вывод, что проблема в работе с кэшем записи (write-back cache) не заключается в грязном кешировании памяти, а в ограничениях, наложенных системой на запись грязных страниц на диск. Следует рассмотреть несколько аспектов:
-
Использование опции
noauto_da_alloc
для ext4**:- Ваша файловая система
ext4
имеет механизм отложенной аллокации (delayed allocation), который может вызывать синхронизацию данных при записи файла. Установка параметра монтированияnoauto_da_alloc
может помочь избежать ненужной синхронизации при записи.
mount -o remount,noauto_da_alloc /path/to/mount
- Ваша файловая система
-
Параметры Vim:
- Если вы используете текстовый редактор
vim
с учётом частоты записи данных, убедитесь, что в нем отключены параметры, которые могут вызвать дополнительную синхронизацию. Для этого можно использовать::set fs=n :set wb=n
- Если вы используете текстовый редактор
-
Настройка системы для предотвращения синхронизации:
- Позаботьтесь о том, чтобы уменьшить частоту фоновых операций записи, путем увеличения значения
vm.dirty_background_ratio
иvm.dirty_background_bytes
, чтобы фоновые процессы реже вызывали сброс данных.
- Позаботьтесь о том, чтобы уменьшить частоту фоновых операций записи, путем увеличения значения
-
Увеличение размера кэша записи:
- Возможно, вам потребуется увеличить мин. лимит записи через
echo <значение> > /proc/sys/vm/dirty_bytes
для устранения ограничений кэша.
- Возможно, вам потребуется увеличить мин. лимит записи через
-
Настройка параметров I/O:
- Примените разные алгоритмы планирования ввода-вывода, такие как
noop
илиdeadline
, которые могут оказать более лояльное влияние на вашу нагрузку в зависимости от специфики использования.
- Примените разные алгоритмы планирования ввода-вывода, такие как
Вывод
Удаление ограничения кэша записи в Linux требует многоступенчатого подхода, который включает как параметры системы, так и настройки конкретных приложений. Используйте указанные рекомендации, чтобы минимизировать влияние дисковых операций на вашу систему. Настраивая параметры и выбирая правильные опции файловой системы, вы сможете заметно улучшить производительность работы с высокоскоростными записями и избежать нежелательных задержек при их обработке.