Linux File IO - многопоточность - запись в разные файлы - PullRequest
5 голосов
/ 16 ноября 2011

В настоящее время я работаю над приложением аудиозаписи, которое извлекает до 8 аудиопотоков из сети и сохраняет данные на диск (упрощенно;)). Прямо сейчас каждый поток обрабатывается одним потоком -> тот же поток также выполняет работу по сохранению на диске.

Это означает, что у меня есть 8 разных потоков, которые выполняют запись на один и тот же диск, каждый в отдельный файл.

Как вы думаете, будет ли увеличение производительности дискового ввода-вывода, если вся работа по записи будет выполняться одним общим потоком (который будет последовательно записывать данные в конкретные файлы)?

ОС - это встроенный Linux, «диск» - это CF-карта, приложение написано на C.

Спасибо за ваши идеи Ник

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Краткий ответ: учитывая, что вы пишете на флэш-диск, я не ожидал бы, что количество потоков так или иначе сильно изменится.Но если бы это имело значение, я бы ожидал, что несколько потоков будут быстрее, чем один поток, а не медленнее.

Более длинный ответ:

Я написал программу, аналогичную той, которую вы описываетеоколо 6 лет назад - он работал на встроенной плате PowerPC Linux и считывал / записывал несколько одновременных аудиофайлов на / с жесткого диска SCSI.Первоначально я написал это с помощью одного потока, выполняющего ввод / вывод, потому что я думал, что это даст лучшую пропускную способность, но оказалось, что это не так.

В частности, когда несколько потоков читали / записывалиуровень SCSI сразу узнал обо всех ожидающих запросах от всех различных потоков и смог переупорядочить запросы ввода-вывода так, чтобы поиск головки диска был минимизирован.В сценарии однопотокового ввода-вывода, с другой стороны, уровень SCSI знал только об одном «следующем» невыполненном запросе ввода-вывода и, таким образом, не мог выполнить эту оптимизацию.Во многих случаях это означало дополнительное перемещение головки привода и, следовательно, более низкую пропускную способность.

Конечно, ваше приложение не использует SCSI или вращающийся диск с головками, которые нужно искать, так что это может не быть проблемой длявы - но могут быть другие оптимизации, которые может выполнять уровень файловой системы / аппаратного обеспечения, если он знает о нескольких одновременных запросах ввода-вывода.Единственный реальный способ выяснить это - попробовать различные модели и измерить результаты.

Я бы предложил отделить дисковый ввод-вывод от сетевого ввода-вывода, переместив дисковый ввод-вывод в поток.-бассейн.Затем вы можете изменить максимальный размер пула потоков ввода-вывода от 1 до N и для каждого размера измерить производительность системы.Это даст вам четкое представление о том, что лучше всего работает на вашем конкретном оборудовании, без необходимости переписывать код более одного раза.

0 голосов
/ 17 ноября 2011

Я думаю, что в вашем случае нет большой разницы между многопоточным и однопоточным решением, но в случае многопоточности вы можете синхронизировать между получающими потоками, и ни один поток не может влиять на другие потоки в случае блокировки в каком-либо системном вызове.
Я сделал то же самое во встроенной системе, проблема была в высокой загрузке процессора, когда ядро ​​сбрасывает много кешированных грязных страниц в CF, процесс ядра pdflush в этот момент занимает все время процессора, и если вы получаете поток через udp, он можетбыть пропущенным из-за того, что процессор был занят, когда пришел поток udp, поэтому я решал эту проблему с помощью fdatasync() вызова каждый раз, когда получалось небольшое количество данных.

0 голосов
/ 16 ноября 2011

Если это встроенный linux, я полагаю, на вашей машине только один процессор / ядро. В этом случае потоки не улучшат производительность ввода-вывода вообще. Конечно, блочная подсистема linux хорошо работает в параллельной среде, но в вашем случае (если мое предположение о количестве ядер верное) не может быть ситуации, когда несколько потоков делают что-то одновременно.

Если мое предположение неверно и у вас более одного ядра, я бы предложил провести тестирование дискового ввода-вывода. Напишите программу, которая записывает много данных из разных потоков, и другую программу, которая делает то же самое только из одного потока. Результаты покажут вам все, что вы хотите знать.

...