磁盘基准测试通常有一个图表,显示I / O吞吐量随着队列深度的增加而增加。我假设在硬件级别发生的事情是磁盘控制器正在重新排序请求以与磁头碰巧的位置重合。但是如何在我自己的I / O繁重的应用程序中增加队列深度?我将使用C#,但与语言无关的答案可能也会有所帮助。
我遇到的一种(未经测试的)方法是将我的磁盘访问分成许多文件并在许多线程中发出I / O.但是肯定有一种方法可以在不使用每个并行I / O的线程的情况下完成它。而且我还假设不需要拆分为多个文件,因为DB通常是一个文件。
答案 0 :(得分:1)
每个I / O操作不需要使用线程,但您需要并行化I / O. 执行大规模I / O的服务器(如数据库)通常使用 I/O completion ports(IOCP)。完成端口允许多个I / O请求并行挂起 - 并且可以最大化底层硬件重新排序排队请求的能力。 IOCP使用回调到线程池来在挂起的I / O操作完成时通知应用程序。
不幸的是,C#对完成端口的支持有限(内置) - 但是,有一些open-source libraries试图弥补这一差距。
请注意,IOCP不适合内心的弱点 - 如果您真正执行大量I / O,则只会产生性能优势。