1
|
ivan_ivanovich_ivanoff · 技术社区 · 15 年前 |
![]() |
1
2
很明显你让读头到处乱跑。你的瓶颈是磁盘,而不是处理器。 换言之,CPU可能是并行的,但磁盘不是。 |
![]() |
2
2
解决方案: 使用NCQ提高性能。为此,请将您的sata hdd控制器配置为使用ahci。 其他详细信息如下: 在分析一个特定的应用程序时,我也做了类似的观察。在我的四核系统上,我比较了以下配置:
结果发现应用程序正在进行大量的并发hdd访问。如果有多个内核(因此有多个线程),这将 明显地 降低总执行时间。 我做了一些研究,发现一个叫做 NCQ (本机命令队列)将对您所指的hdd访问进行优化。 在scsi世界中,这已经是很长一段时间以来的通用标准。在世达的世界里,它早就被改编了。 要解锁此功能,需要将HDD控制器配置为在 阿希 模式-这是使用NCQ的先决条件! 由于现在普通的桌面系统使用的是车载硬盘控制器,所以这个配置部分需要在 BIOS设置 . 对于sata配置,您通常可以在以下操作模式之间进行选择:
我继续并实现了自己的自定义基准测试,以比较一个和同一个运行的系统与以下配置:
—— 结论 : 要释放具有并发HDD访问的系统的全部功能,请执行以下操作:
不这样做会使一些应用程序运行 更慢的 当使用多个线程而不是单个线程时。这是你需要考虑的一个令人惊讶的部分。 —— 注:有一个神话说: NCQ只与“服务器”环境相关(数百个进程并行运行) . 我的基准测试结果指向了另一个方向: 它也适用于“桌面”环境。每当发生大量并发hdd访问时 . 附加说明:
|
![]() |
3
1
你是否看到加速几乎可以肯定地取决于你正在看的场景和硬件。更多关于基准测试方法的细节在这里会很有用。 粗略地说,当你 不 利用I/O控制器及其缓存的最大吞吐量,或者当I/O与CPU密集型工作重叠时,它们会被阻塞等待。 您比较的是读取分布在系统中的多个小文件,还是按顺序读取几个大文件?您将在这里看到不同的性能特征。 你有没有用一个很好的系统剖析器来剖析(免费的) windows performance toolkit 看看你的基准是怎么回事?这几乎是必须的。 这样的基准可以很有趣地编写和描述,不要让一些错误的开始妨碍了深入挖掘和寻找加速。 -里克 |
![]() |
4
1
我认为你关于操作系统优化并发磁盘访问的假设是错误的。我想当您从一个线程中使用分散/聚集I/O时,它会进行这种重新排序,但是没有实际的方法可以用这种方式优化并发请求。任何这样的方案都会在单线程读取中引入不必要的延迟。(操作系统必须稍等一段时间,以防出现并发请求。)总之,简短的回答是,您的并发请求会导致读取头到处跳跃。操作系统无法将其优化。 |
![]() |
5
1
我认为您所说的是本机命令队列,它可能在您正在测试的系统上启用,也可能不启用。从 the Wikipedia entry :
另外,我还没有做过任何测试,但是对于一个必须访问整个磁盘上的小文件/索引节点的目录遍历来说,ncq可能没有那么有效。这可能是因为磁盘控制器能够足够快地为每个请求提供服务,以至于永远不会建立队列来重新排序,因此您看不到任何好处。 |
![]() |
6
1
在这里很重要的一点是 阅读 对目录或文件信息的处理远离了该信息。换句话说,磁盘IO在一个线程中,在另一个线程中处理和搜索。将完成的IO信息传递给具有有界队列的处理线程。通过这样做,您将确保IO线程在忙于读取下一个要处理的数据块之前从不等待结果的处理。 |
![]() |
7BeholdeR7 · 文件夹的重量超过其中的文件(六倍) 2 年前 |
![]() |
ilteris · 为什么程序在fscanf后崩溃 2 年前 |
![]() |
Peaceful · 使用fscanf读取C中具有未知行数的文件 2 年前 |
![]() |
NOCi · 如何将Tensorflow的结果记录到CSV文件 2 年前 |
![]() |
Oakzeh · 如何在字符串索引之前读取文件并删除字符 2 年前 |