Низкая производительность параллельного ввода-вывода, как обменять задержки на пропускную способность?

379
Davidmh

У меня довольно тяжелый процесс ввода-вывода, ограниченный графическим процессором, который должен читать случайные файлы из папки на локальном жестком диске. Когда процесс выполняется сам по себе, я получаю постоянную пропускную способность около 30 МБ / с, но при наличии двух конкурирующих процессов общая пропускная способность падает до 7 МБ / с.

Как я могу максимизировать пропускную способность при наличии двух программ? Задержка не проблема.

Каждый файл имеет порядок 1-20 МБ. Процессы выполняются на независимых графических процессорах и используют очень мало ЦП. Тот же эффект наблюдается, если я одновременно запускаю один графический процессор и один процесс чистого ввода-вывода.

Нет никаких различий между доступными планировщиками: дедлайн, cfq и noop. Я также попытался увеличить время чтения до 5 с, без изменений.

Детали машины:

  • Fedora Linux с ядром 4.16.7-200.fc27.x86_64
  • i7-4770 CPU @ 3.40 ГГц
  • 32 ГБ ОЗУ, 20 из которых заняты запущенными процессами.
  • Своп включен, но пустой.
  • Накопитель WDC WD2003FYYS-0,2 ТБ, но я вижу то же самое, если переместить все на другие накопители.
  • cat big_file> / dev / null обеспечивает пропускную способность около 100 МБ / с, поэтому пропускная способность для обеих систем есть.
  • Всего данных около 500 ГБ.

Больше информации:

  • Я переместил файлы на другой, более быстрый диск, который больше не используется, и использовал сжатие. Общая пропускная способность немного улучшена.
  • Предоставление максимального приоритета одному из процессов улучшило производительность на 10%.
  • Запуск iostat -x 1показывает, что коэффициент использования составляет около 87% при запуске одного процесса и 100% при запуске двух.
  • Процессы читают случайные файлы. Если бы у меня был только один процесс, он мог бы обеспечить более чем удвоенную пропускную способность, которую может потреблять каждый из отдельных.
1
Получить SSD. Жесткие диски ужасны с одновременным доступом. Mokubai 5 лет назад 3
@Mokubai Мне не нужно больше, чем то, что может предоставить HD, и, поскольку мои запросы помещаются в очередь, я не возражаю против задержки, поэтому планировщик может, например, дать целую секунду, выделенную каждому процессу, с максимальной пропускной способностью. Davidmh 5 лет назад 0
Выстрел в темноте: поэкспериментируйте с «ionice -c best-старателем» с разными уровнями «-n» для двух процессов; или даже попробуйте `-c realtime` для одного из них. Kamil Maciorowski 5 лет назад 0
@KamilMaciorowski, кажется, помогает незначительно (улучшение ~ 10%). Спасибо! Davidmh 5 лет назад 0
Но вам * нужно * больше, чем могут предоставить ваши жесткие диски. Твердотельные накопители на несколько порядков быстрее при произвольном доступе, чем механические жесткие диски. Конечно, вы можете создать пользовательский демон для управления доступом к файлам с большим буфером чтения и записи, но зачем? Daniel B 5 лет назад 0
@DanielB, если бы каждому процессу была назначена часть в одну секунду с полным доступом к диску, этого было бы достаточно, потому что у них есть внутренние буферы. Это то, что находится в сфере планировщика ОС. Davidmh 5 лет назад 0
Планировщик ОС спроектирован так, чтобы быть справедливым и относиться к * каждому * процессу в системе одинаково. Они были настроены так, чтобы дать каждому процессу возможность получить доступ к диску и получить высокую вероятность того, что их обращения к диску будут обрабатываться в течение десятков миллисекунд, а не сотен миллисекунд. Если вам нужно что-то большее, чем значения по умолчанию, предоставляемые предоставленным планировщиком, то вы можете изменить или написать свой собственный, но это будет вопрос программирования, выходящий за рамки этого сайта. Однако мы можем * сказать *, что существуют другие устройства, которые гораздо больше подходят для небольших случайных обращений, называемых SSD. Mokubai 5 лет назад 0

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

2
Mikko Rantalainen

Используйте cfqshceduler для этих дисков с данными и установить slice_asyncи slice_syncна довольно высокие значения (например, 500) и slice_idleоколо 20. Вы можете также необходимо увеличить fifo_expire_asyncи fifo_expire_syncдо около 4000 каждый. (Подробнее см. Https://unix.stackexchange.com/a/41831/20336 ).

Идея состоит в том, чтобы позволить каждому процессу получить полный контроль над устройством в течение 0,5 с, чтобы поиск между различными областями диска не занимал все время.

Если вы можете себе это позволить, лучшим выбором будет получить хороший SSD-накопитель, который может хранить ваши данные. Для случайного чтения я бы рекомендовал серию Samsung 860 EVO, потому что 2018 год кажется наилучшим балансом между затратами и производительностью. Если цена не является проблемой, выбирайте самый большой из имеющихся на рынке твердотельных накопителей Intel Optane.

Похожие вопросы