Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何增加I/O队列深度以最大限度地提高性能_C#_Io_Parallel Processing_Disk - Fatal编程技术网

C# 如何增加I/O队列深度以最大限度地提高性能

C# 如何增加I/O队列深度以最大限度地提高性能,c#,io,parallel-processing,disk,C#,Io,Parallel Processing,Disk,磁盘基准测试通常有一个图表,显示I/O吞吐量随着队列深度的增加而增加。我假设在硬件层面上发生的事情是,磁盘控制器正在对请求重新排序,以与磁头恰好所在的位置一致。但是如何在我自己的I/O密集型应用程序中增加队列深度呢?我将使用C#,但语言不可知论的答案可能也会有所帮助 我想到的一种(未经测试的)方法是将磁盘访问分成多个文件,并在多个线程中发出I/O。但肯定有一种方法可以做到这一点,而不必为每个并行I/O使用线程。我还假设不需要拆分为多个文件,因为DB通常是一个文件。您不需要为每个I/O操作使用线程

磁盘基准测试通常有一个图表,显示I/O吞吐量随着队列深度的增加而增加。我假设在硬件层面上发生的事情是,磁盘控制器正在对请求重新排序,以与磁头恰好所在的位置一致。但是如何在我自己的I/O密集型应用程序中增加队列深度呢?我将使用C#,但语言不可知论的答案可能也会有所帮助


我想到的一种(未经测试的)方法是将磁盘访问分成多个文件,并在多个线程中发出I/O。但肯定有一种方法可以做到这一点,而不必为每个并行I/O使用线程。我还假设不需要拆分为多个文件,因为DB通常是一个文件。

您不需要为每个I/O操作使用线程,但您确实需要并行化您的I/O。执行大规模I/O(如数据库)的服务器通常使用(IOCP)。完成端口允许并行挂起多个I/O请求,并且可以最大限度地提高底层硬件对排队请求重新排序的能力。IOCP使用对线程池的回调,在挂起的I/O操作完成时通知应用程序

不幸的是,C#对完工港的支持(内置)有限——然而,有一些人试图弥合这一差距


请注意,IOCP不适合心脏不好的人——只有真正执行大量I/O时,性能优势才会增加。

它是否像打开文件流和进行许多BeginRead()调用那样简单?或者,在进入磁盘队列之前,他们只是在一个框架队列中排队吗?是的,这里顶部附近的文本似乎表明事情很简单:不确定您在支持该理论的页面上读到了什么。“当许多I/O请求同时挂起时,异步I/O可以提供更好的性能”谢谢。但是从第二个链接的评论中可以看出:“托管IOCP的主要目标是为.Net开发人员提供一个可等待的事件队列,并对队列上等待的线程进行并发控制。托管IOCP不以任何方式处理I/O异步。”根据Aaronaught at的说法,Stream.beginhead使用I/O完成端口。