gpt4 book ai didi

multithreading - Linux File IO - 多线程性能 - 写入不同的文件

转载 作者:行者123 更新时间:2023-12-04 20:53:08 25 4
gpt4 key购买 nike

我目前正在开发一个音频录制应用程序,它可以从网络中获取多达 8 个音频流并将数据保存到磁盘(简化;))。
现在,每个流都由一个线程处理 -> 同一个线程也在磁盘上进行保存工作。

这意味着我有 8 个不同的线程在同一个磁盘上执行写入,每个线程都写入不同的文件。

如果所有写入工作都由一个公共(public)线程完成(随后将数据写入特定文件),您认为磁盘 i/o 性能会提高吗?

OS 是嵌入式 Linux,“磁盘”是 CF 卡,应用程序是用 C 编写的。

谢谢你的想法
缺口

最佳答案

简短的回答:鉴于您正在写入闪存盘,我不认为线程数会以某种方式产生太大影响。但如果它确实有所作为,我希望多线程比单线程更快,而不是更慢。

更长的答案:

我写了一个与您大约 6 年前描述的程序类似的程序——它在嵌入式 PowerPC Linux 卡上运行,并从 SCSI 硬盘驱动器读取/写入多个同步音频文件。我最初用单线程编写它来执行 I/O,因为我认为这样可以提供最好的吞吐量,但事实证明并非如此。

特别是,当多个线程同时读/写时,SCSI 层知道来自所有不同线程的所有未决请求,并且能够重新排序 I/O 请求,从而最大限度地减少对驱动器磁头的查找。另一方面,在单线程 IO 场景中,SCSI 层只知道单个“下一个”未完成的 I/O 请求,因此无法进行优化。在许多情况下,这意味着驱动头需要额外的行程,因此吞吐量会降低。

当然,您的应用程序没有使用 SCSI 或带有需要寻找磁头的旋转驱动器,因此这对您来说可能不是问题——但如果文件系统/硬件层知道多个同时的 I/O 请求。找出答案的唯一真正方法是尝试各种模型并测量结果。

我的建议是通过将磁盘 I/O 移动到线程池中来将磁盘 I/O 与网络 I/O 分离。然后,您可以将 I/O 线程池的最大大小从 1 更改为 N,并针对每个大小测量系统的性能。这将使您清楚地了解什么在您的特定硬件上最有效,而无需您多次重写代码。

关于multithreading - Linux File IO - 多线程性能 - 写入不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com