首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux文件IO -多线程性能-写入不同的文件

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

Stack Overflow用户
提问于 2011-11-17 02:00:15
回答 3查看 2.8K关注 0票数 5

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

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

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

操作系统是嵌入式Linux,“磁盘”是CF卡,应用程序用C语言编写。

谢谢你的点子,尼克

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 03:14:12

简而言之:假设你正在写一个闪存盘,我不认为线程的数量会有多大的不同。但如果这真的有所不同,我希望多线程比单个线程更快,而不是更慢。

更长的答案是:

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-17 02:51:23

如果是嵌入式linux,我猜您的机器只有一个处理器/内核。在这种情况下,线程根本不会提高I/O性能。当然,linux块子系统在并发环境中工作得很好,但在您的情况下(如果我对内核数量的猜测是正确的),不可能出现多个线程同时执行某些操作的情况。

如果我的猜测是错误的,并且您有多个内核,那么我建议对磁盘I/O进行基准测试。编写一个从不同线程写入大量数据的程序,另一个仅从一个线程执行相同操作的程序。结果将显示您想要了解的所有内容。

票数 0
EN

Stack Overflow用户

发布于 2011-11-17 13:21:47

我认为在你的情况下,多线程和单线程的解决方案没有太大的区别,但在多线程的情况下,你可以在接收线程之间进行同步,并且在某些系统调用中发生阻塞的情况下,任何线程都不会影响其他线程。

我在嵌入式系统上做了同样的事情,问题是当内核丢弃许多缓存的脏页到CF时,cpu使用率很高,pdflush内核进程在那一刻占用了所有的cpu时间,如果你通过udp接收流,那么当udp流到来时,它可以被跳过,所以我通过fdatasync()调用解决了这个问题,每次当一些不是很大的数据接收到时,pdflush内核进程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8156399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档