5

Я загружаю файлы на 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 секунд, вероятно, будет достаточно.

1 ответ1

4

Ядро Linux проверяет ervery 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/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .