关于文件性能的两个问题:
我需要创建一个服务器来处理可能的数千个并发请求:
我无法控制客户的硬件(RAID配置等),因此我认为我所能做的只是请求数百个文件操作,并允许操作系统和磁盘控制器提供他们可以进行的任何优化。正确的吗?
下一个问题:我想最大限度地使用I / O完成线程(而不是工作线程)。我认为唯一可以通过.net 3.5获得的,通过“BeginRead / Write”提供:
是否有一些我缺少的东西会让我能够使用I / O完成线程来散列文件? 7Zip SDK是否使用I / O完成线程?
答案 0 :(得分:0)
首先,虽然.NET在性能方面表现相当不错,但如果非常高性能是基本要求,我会转向使用C ++等本机编译的非托管语言。 JIT编译和CLR的其他开销会降低用.NET编写的任何算法的性能。
我认为成千上万的真正同步请求将表明高度分散的模型;目前,市场上最好的服务器硬件(双Xeon四核超线程CPU)只能同时执行32项操作,并且监听执行操作的请求,与硬件层交谈以及其他一般操作系统/运行时开销将需要其中几个。我会分析您期望此服务器同时处理的实际流量,并缩放您处理它的盒子数量以匹配。
其次,我认为你所说的“I / O完成线程”是异步开始/结束调用用来完成工作的线程,而不是ThreadPool中的线程(避免在真正的线程中) - 重要的应用程序)或用户创建的线程(没有这些问题,只需看你的线程数)。实际上,除了一些特殊情况,一个线程是一个线程,并且它产生的确切位置在硬件级别没有太大区别,所以如果你真的想要,产生使用同步调用的工作线程会让你很漂亮大致相同的结果(但通常使用您拥有的工具而不是伪造新工具更好)。
现在,问你真正的问题。不,没有散列的异步模型;如果你想多线程一个散列操作,必须单独生成线程。但是,散列需要一个流或字节缓冲区,可以使用Stream.BeginRead()异步获取,并且传递给BeginRead()的回调方法可以在异步调用生成的线程中执行散列。
答案 1 :(得分:0)
我建议在F#中查看新的异步编程模型。卢克·霍本(Luke Hoban)在新奥尔良举办的MS TechEd 2010上有一个关于这个主题的精彩视频: