我有一个客户端/服务器应用程序。服务器组件运行时,以“远程处理”方式(二进制格式化程序,会话对象)使用WCF。附带调试器的C#代码非常慢; MemoryMappedFile的错?
如果我启动服务器组件并启动客户端,则服务器在第一个任务中将完成0.5秒的<。
如果我使用附加的VS调试器启动服务器组件,然后启动客户端,则任务需要20秒才能完成。
没有代码更改 - 没有条件编译更改。无论我的服务器组件是以32位,64位,VS托管流程,没有VS托管流程还是任何这些组合的方式编译和运行,都会发生同样的情况。
可能重要:如果我用VS.NET 探查(采样模式),然后应用程序,就好像没有附加的调试运行一样快。所以我不能这样诊断。刚刚检查,仪器模式也运行得很快。对于并发性分析模式也是如此,可以快速运行。
主要数据:
- 应用程序使用相当沉重的多线程(在标准的线程池40个线程)。创建线程很快就会发生,而且不是一个慢点。有很多锁,
WaitHandle
s和Monitor
模式 - 该应用程序根本没有引发异常。
- 该应用程序不会创建控制台输出。
- 该应用程序是完全托管代码。
- 该应用程序并在磁盘上映射的几个文件到MemoryMappedFile:1x750MB和12x8MB和一些规模较小的
实测表现:
- CPU使用率在两种情况下最小;当连接调试器时,CPU位于< 1%
- 在这两种情况下,内存使用都很少;在这两种情况下
- 有很多页面故障发生(参考MMF)的大概有50或60MB,但是当调试器附加
- 如果VS宿主进程不使用,或基本上是“远程调试它们发生更慢显示器“进入游戏,然后,使用一个体面的CPU,并创建了很多页面错误。但这不是发生问题的唯一时间
- 无论客户端如何运行,都会看到性能差异。唯一被更改的变量是通过“从调试开始”vs从资源管理器启动的服务器组件。
我的想法:当调试
- WCF慢?
- MemoryMappedFiles调试速度慢吗?
- 使用40个线程 - 调试速度慢?也许监视器/锁通知调试器?线程调度变得很奇怪/上下文切换非常罕见?
- 宇宙背景辐射授予的智慧和幽默的残酷感VS
都显得愚蠢的可能性不大。
所以,我的问题:
- 这究竟是为什么?
- 如果#1未知,我该如何诊断/发现?
是否启用第一个机会异常收获?您还可以尝试启用.NET服务器源代码步进,以在调试模式下捕获最多潜在的“隐藏”异常,特别是(de)服务器异常。另外,痕迹(outputdebugstring或其他)呢? –
是的,根本不会引发任何异常 - 所有类别的异常(包括.NET)都有第一次机会。没有调试控制台输出(这就是我的意思是控制台输出 - 我会编辑澄清)。我刚刚启用.NET框架源步进(无法看到服务器源步进)..发现一些例外。将暂时更新 –
来自WCF的异常:“'字符,十六进制值0x20,不能包含在名称中。”我不知道*可以用这种方式隐藏异常:不是例外吗?将看我能做些什么来解决。也许你可以发表一个答案,这样你可以得到一些upvotes /一个接受,如果这能解决它? :) –