在Windows服务中托管的WCF服务运行速度比控制台应用程序慢10倍

10

我有一个C#库,用于进行一些文件处理。我创建了一个控制台和桌面应用程序,这些程序使用该库并在大约1分钟内处理了一个256MB的文件。然后,我创建了一个WCF服务,并将其托管在Windows服务中,该服务使用相同的文件处理库,但是当从网站调用时,处理相同的256MB文件需要花费10倍的时间。Windows服务在具有管理员权限的域帐户下运行。

调用WCF服务的开销非常快,但是LoadFile方法却需要更长的时间。我尝试通过在启动期间增加进程优先级来解决此问题:

Process.GetCurrentProcess ().PriorityClass = ProcessPriorityClass.High;

尝试了很多方法仍然不起作用。我在Win7 64位桌面系统(6GB),2003 XP 32位服务器(4GB)和2008 R2 32位服务器(4GB)上运行此服务,但效果相似。控制台和桌面应用程序在以上系统中处理文件约需1分钟。该过程似乎没有受到内存限制并进入交换区。

Windows服务是否受处理器限制?如果在IIS下运行WCF服务,是否会获得更好的结果?

编辑:我尝试从网站调用库目录,这也比控制台或桌面应用程序慢10倍。

更新:原来是Log4PostSharp。控制台和桌面应用程序的配置文件中没有任何log4net的痕迹,而网站和Windows服务则有。其中一个log4net TraceAppender正在默默地占用宝贵的CPU周期。


2
你是怎么准确地加载文件的?你尝试过使用分析器查看瓶颈在哪里了吗(VS 2010 Ultimate 包含一个分析器)? - Davide Piras
6
如果您还没有这样做,我建议将进程优先级类别恢复为正常状态。更改进程优先级通常不会加快程序速度,并且可能会潜在地引发其他问题。 - Jeffrey L Whitledge
2
当您运行控制台应用程序时,文件是否在同一服务器上?当您作为服务运行时,文件是否在不同的服务器上?复制大文件跨服务器可能会成为瓶颈。 - Steve Wellens
当您运行控制台应用程序时,是否是在服务运行的相同域用户下运行? - John Koerner
你是否会在文件处理过程中创建数以百万计的短暂字符串对象,进而导致内存压力过大?如果是这样,在服务进程中GC行为上的微小差别可能会导致巨大的性能差异。 - Wim Coenen
显示剩余4条评论
1个回答

4
我不知道为什么会发生你描述的行为,这似乎非常奇怪。由于您正在内存中处理一个相对较大的文件,因此垃圾回收器可能会影响它。您可以尝试更改垃圾回收器运行的模式,以查看它是否有任何效果。
垃圾回收器有三种模式 - 工作站、服务器和并发。每种模式的行为方式都不同,并针对不同类型的应用程序进行了优化。工作站模式是默认模式,并且除非配置使用其他模式,否则所有进程都将使用该模式。有关模式的更多信息可以在此处找到。
尝试明确设置垃圾回收器以使用服务器模式(它只会对多处理器机器产生影响)。要做到这一点,请将以下内容放入您的app.config文件中:
<configuration>
    <runtime>
        <gcServer enabled="true" />
    </runtime>
</configuration>

到目前为止,这个更改没有成功。 - Todd Smith
2
我不会给你点踩,但由于垃圾回收而导致10倍的减速似乎有些牵强。首先需要调查其他方面,特别是考虑到我们从OP那里得到的非常少的信息。 - Johann Blais
@Johann:我以前经历过由于垃圾收集器在进行垃圾回收时导致的大幅减速 - 在正在进行繁重工作的运行应用程序上查看%time in GC性能计数器。 - adrianbanks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接