Отрегулируйте интервалы очистки диска Linux, чтобы избежать блокировки пользовательских процессов.

2353
patraulea

Я загружаю файлы на SD-карту, установленную на Raspberry Pi, используя rtorrent, со скоростью около 6 МБ / с (ограничение пропускной способности). Пользовательский процесс не сбрасывает сами данные, и интервал, с которым очищается кэш диска, зависит от значений sysctl.

Используя iostat и nload, я могу видеть пропускную способность сети и профили записи на диск:

диск:

20M/s .....x.....x....xx... .....x....xx....xx... ....xx....xx....xx... 0M/s ....xx....xx....xx... 

Сеть:

5M/s ..xxx....x.. x.....x. .xxxx...xx..xxx...xxx 0M/s xxxxx...xxx.xxx...xxx 

Видимо, IO Writer всегда останавливается во время очистки. Это 4-ядерный процессор с 3 ядрами, постоянно находящимися в режиме ожидания, а топ сообщает 100% iowait во время сброса.

Если я делаю while true; do sync; sleep 1; doneво время загрузки, очистка диска происходит плавно, 6 МБ каждую секунду. И процесс загрузки не перекрыт, поэтому пропускная способность постоянна.

Я могу получить тот же эффект с:

/proc/sys/vm/dirty_writeback_centisecs: как часто включается очистка дискового кэша - единица измерения составляет 100 с; по умолчанию: 500

и /proc/sys/vm/dirty_expire_centisecs: сколько лет должна быть страница, чтобы иметь право на сброс в 100 секунд; по умолчанию: 3000

Установка их на 100 и 200 соответственно обеспечивает одинаковый профиль очистки диска и постоянную полосу загрузки.

Есть ли способ сделать эту настройку автоматической, т. Е. Сбрасывать как можно чаще, чтобы избежать необходимости блокировать процесс записи? Например, если скорость загрузки составляет 1 МБ / с, то сброса каждые 5 секунд, вероятно, будет достаточно.

5

1 ответ на вопрос

4
Ludovic Ronsin

Ядро Linux проверяет все ошибки, dirty_writeback_centisecsесли у вас есть грязные страницы старше, чем dirty_expire_centisecs. С настройками по умолчанию он проверяет каждые 5 секунд на наличие грязных страниц старше 30 секунд.

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

Что вы должны настроить это

  • vm.dirty_background_ratio : объем системной памяти, который может быть заполнен грязными страницами до того, как ядро ​​начнет сбрасываться на диск в фоновом режиме.
  • vm.dirty_ratio: максимальная системная память, которую можно заполнить грязными страницами. Затем ядро ​​блокирует все запросы ввода / вывода, пока все не будет сброшено на диск.

Чтобы не получить такое поведение, вы должны сообщить ядру, что оно должно содержать не менее 30 с * 6 МБ / с = 180 МБ. Вам также необходимо учитывать медленную скорость записи Raspberry Pi, поскольку в течение времени, необходимого для записи на диск, в ОЗУ будет записываться больше грязных страниц.

Это может представлять слишком много оперативной памяти для Raspberry Pi, поэтому вам может потребоваться уменьшить ее dirty_expire_centisecs. Имейте в виду, что использование малых значений может повредить быстродействию системы, поскольку вы почти получите синхронный ввод-вывод.

Вот более полное объяснение того, как это работает: https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/