高性能文件操作& I / O完成线程

时间:2010-09-28 20:11:23

标签: .net performance file compression

关于文件性能的两个问题:

我需要创建一个服务器来处理可能的数千个并发请求:

  • 散列文件
  • 压缩文件
  • 文件解压缩
  • 可能还有一些文件复制/移动

我无法控制客户的硬件(RAID配置等),因此我认为我所能做的只是请求数百个文件操作,并允许操作系统和磁盘控制器提供他们可以进行的任何优化。正确的吗?

下一个问题:我想最大限度地使用I / O完成线程(而不是工作线程)。我认为唯一可以通过.net 3.5获得的,通过“BeginRead / Write”提供:

  • System.IO.Compression.DeflateStream
  • System.IO.Compression.GZipStream
  • System.IO.FileStream
  • System.IO.Stream

是否有一些我缺少的东西会让我能够使用I / O完成线程来散列文件? 7Zip SDK是否使用I / O完成线程?

2 个答案:

答案 0 :(得分:0)

首先,虽然.NET在性能方面表现相当不错,但如果非常高性能是基本要求,我会转向使用C ++等本机编译的非托管语言。 JIT编译和CLR的其他开销会降低用.NET编写的任何算法的性能。

我认为成千上万的真正同步请求将表明高度分散的模型;目前,市场上最好的服务器硬件(双Xeon四核超线程CPU)只能同时执行32项操作,并且监听执行操作的请求,与硬件层交谈以及其他一般操作系统/运行时开销将需要其中几个。我会分析您期望此服务器同时处理的实际流量,并缩放您处理它的盒子数量以匹配。

其次,我认为你所说的“I / O完成线程”是异步开始/结束调用用来完成工作的线程,而不是ThreadPool中的线程(避免在真正的线程中) - 重要的应用程序)或用户创建的线程(没有这些问题,只需看你的线程数)。实际上,除了一些特殊情况,一个线程是一个线程,并且它产生的确切位置在硬件级别没有太大区别,所以如果你真的想要,产生使用同步调用的工作线程会让你很漂亮大致相同的结果(但通常使用您拥有的工具而不是伪造新工具更好)。

现在,问你真正的问题。不,没有散列的异步模型;如果你想多线程一个散列操作,必须单独生成线程。但是,散列需要一个流或字节缓冲区,可以使用Stream.BeginRead()异步获取,并且传递给BeginRead()的回调方法可以在异步调用生成的线程中执行散列。

答案 1 :(得分:0)

我建议在F#中查看新的异步编程模型。卢克·霍本(Luke Hoban)在新奥尔良举办的MS TechEd 2010上有一个关于这个主题的精彩视频:

http://www.msteched.com/2010/NorthAmerica/DEV307

http://blogs.msdn.com/b/lukeh/archive/2010/06/13/f-scaling-from-explorative-to-net-component-f-talk-teched-2010.aspx