同时或顺序写操作——在速度方面重要吗?
对于多核处理器,使用多线程并行化所有文件写入操作是否有意义,只是为了提高速度?当然,所有这些写操作都是独立的。
同时或顺序写操作——在速度方面重要吗?
对于多核处理器,使用多线程并行化所有文件写入操作是否有意义,只是为了提高速度?当然,所有这些写操作都是独立的。
一般来说,没有。
到目前为止,对磁盘的物理写入是几个数量级的瓶颈,并且在大多数情况下是相当顺序的。并行化写入你很有可能通过引发搜索来降低性能。在大多数情况下,顺序读取和写入将大大优于交错。
每磁盘并行化(TCQ 和 NCQ)主要通过减少不同客户端同时从磁盘的不同部分请求数据时自然需要的寻道来工作。如果你能从一开始就避免这些寻求,那么你会过得更好。
在某些情况下 - RAID 1、JBOD 或不同的数据流到达相当缓慢时 - 正确的调度可以提高您的吞吐量,但这需要对手头的硬件有深入的了解,并且其他过程不会破坏您的乐趣。
充其量,您可以将其作为最终用户的决定(例如,提供关闭它的选项),并提供性能指标来指导他。(你甚至可能证明我错了;))
这取决于磁盘及其控制器。他们有 TCQ/NCQ 吗?是RAID吗?如果是这样,那可能有点道理。对于一个没有 NCQ 的普通 SATA 磁盘,它不会。
先写最简单的代码,看看它在目标环境下是否表现得足够好。(不同的磁盘、操作系统版本、CPU、驱动程序等可能会显着影响结果。)
如果最简单的正确代码还不够快,那么尝试找出执行 IO 的更快方法是有意义的。猜测一下,如果您正在写入不同的磁盘,并行化写入操作可能是有意义的,但可能不是。不过,这只是一个完整的猜测。
纯属巧合,我计划很快对相关情况进行基准测试。我有一篇博客文章描述了我打算执行的测试,当我有一些结果时,我会用一个指向结果的链接来更新条目。它与您所描述的并不完全相同,但足够接近可能会引起您的兴趣。
从技术上讲,您可以 mmap 一个文件并让多个线程写入它,但磁盘可能仍会造成瓶颈。
如果您需要最大化 I/O 吞吐量,那么首先要研究您的环境支持的异步 I/O。
这是一个简单的问题,但答案可能非常复杂。Les 尝试通过一些假设来缩小范围:操作系统是 Windows,您有相对大量的真正独立的写入。
最坏的情况是,这将比并行 ATA 控制器上的单个普通旧磁盘慢:它会很慢。
最好的情况是,操作系统可以非常高效地调度写入。对于具有大量主轴的存储系统或具有支持 NCQ 的磁盘的情况,这将是正确的。
这里要记住的关键是磁盘 I/O(通常)不受 CPU 限制,因此竭尽全力使用多核对您没有帮助;它只会让生活变得复杂。
请注意,如果您对写入进行排序,以便它们在文件(整体)中是连续的,或者通过按范围对它们进行排序来在磁盘上是连续的,则可以提供帮助。
如果您正在谈论写入一个文件,答案是否定的。您不能并行写入一个文件,因为每个进程或线程都必须从操作系统获取文件的锁才能进行写入。
否则,这必须取决于硬件控制器和存储类型、操作系统内核和文件系统实现。