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

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

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

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

那么有人可以请我们加油吗?从多线程进程同步磁盘访问以获得性能是一个好主意吗?在Windows或Linux之间在这方面有什么不同吗?

最佳答案

The theory is that this would put less strain on the CPU

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

we would then be doing part of the job that the operating system originally was designed to solve.

遗憾的是,Windows无法执行任何类型的智能IO调度.我不确定磁盘驱动程序的作用.使用NCQ和SATA肯定会有一定程度的操作重新排序.但我从来没有观察到Windows在IO方面做了一些聪明的事情(除了预取功能很好).

主要问题是您是否要执行顺序或随机IO.

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

我对Linux知之甚少,但至少它有一些IO调度. Windows团队似乎不想解决这个问题.

点赞