是否值得同步I / O密集的线程,以提高总磁盘性能?

我们的Windows .NET应用程序有几个I / O密集的线程不断写入磁盘(旋转媒体)。 来自一个线程的写入操作在不知道其他线程的写入操作的情况下完成,因此这意味着写入请求按照与正在执行的调用相同的顺序到达Windows I / Opipe理器。

在我们的项目中有一个讨论,如果这是正确的做法,或者我们可以通过同步写入操作来获得一些性能,以便只有一个(或几个)线程执行对磁盘的写入操作在同一时间(也许通过共享锁)。 理论上说,这样可以减轻CPU的压力,并且可以提高吞吐量(请注意,我们已经在所有操作中使用了asynchronousI / O)。

我对这个想法有些怀疑,因为我认为我们将会完成操作系统最初devise要解决的一部分工作。 现在已经进行了一些实验,并指出根本没有任何好处。 我的印象是,只要缓冲区大小足够,决定何时将块写入磁盘最好留给操作系统来决定。

那么有人可以请我们吗? 为了获得性能,同步multithreading进程中的磁盘访问是一个好主意吗? 例如Windows或Linux在这方面有什么区别?

理论是这样可以减轻CPU的压力

怎么可能? 这是相同数量的写入,但现在增加了同步。 它会创建(一点)更多的CPU负载。

那么我们将会完成操作系统最初设计要解决的一部分工作。

可悲的是,Windows不能执行任何类型的智能IO调度。 我不确定什么是磁盘驱动程序。 有了NCQ和SATA,对操作进行一定程度的重新排序。 但是我从来没有注意到Windows在IO方面做了一些聪明的事情(除了预取工作正常)。

主要的问题是你想要执行顺序还是随机IO。

  1. 顺序:多个顺序流导致Windows将数据流分成64KB或256KB的块,使得它们具有高度的随机性。 这真是太糟糕了。 在这种情况下,您可以通过智能地发出大IO来获得数量级的性能。
  2. 随机:一次发出多个IO,以便磁盘硬件可以对它们重新排序。 例如SQL server有时会发出数千个(在此期间完全阻止其他进程 – 请注意,Windows实际上没有IO公平的概念)。

我不太了解Linux,但至少一些IO调度。 Windows团队似乎不想解决这个问题。