我目前正在开发一个音频录制应用程序,该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘(简化的;))。
现在,每个流都由一个线程处理 - >同一线程还在磁盘上执行保存工作。
这意味着我有 8 个不同的线程在同一磁盘上执行写入操作,每个线程写入不同的文件。
您认为如果所有写入工作都由一个公共线程完成(将数据依次写入特定文件),磁盘 I/O 性能是否会有所提高?
操作系统是嵌入式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,并针对每个大小测量系统的性能。这将使您清楚地了解什么最适合您的特定硬件,而无需您多次重写代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)