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



我们的Windows.NET应用程序有几个I/O密集型线程,这些线程不断地向磁盘(旋转介质)写入数据。来自一个线程的写操作是在不知道另一个线程写操作的情况下完成的,因此这意味着写请求以与执行调用相同的顺序到达Windows I/O管理器。

在我们的项目中,有人讨论过这是否是正确的方法,或者我们是否可以通过同步写操作来获得一些性能,以便只有一个(或几个)线程同时对磁盘执行写操作(可能通过共享锁)。理论上,这将减少CPU的压力,并为我们提供更好的吞吐量(请注意,我们已经在所有操作中使用异步I/O)。

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

有人能照亮我们吗?同步来自多线程进程的磁盘访问以获得性能是个好主意吗?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团队似乎不想解决这个问题。

最新更新