首页 新闻 会员 周边 捐助

WCF获得客户端的内存信息慢(特定客户端Server 2008 R2 SP1+64位操作系统)

0
悬赏园豆:100 [已解决问题] 解决于 2012-10-16 22:37

功能描述:服务器端获得客户端的硬件信息。绝大多数都正常,只有一种情况不正常。

特定客户端系统信息:Windows Server 2008 R2 SP1

系统类型:64位操作系统

在该客户端本机获得总内存和可用内存信息平均需要280毫秒。 但远程WCF调用需要50多秒。

经过调研在其他的客户端上都正常,上面这一种(Server 2008 R2+64位操作系统)获得内存信息特别慢,而获得其他硬件信息(比如CPU信息、光驱等)正常。感觉是WCF的问题(本机很正常,远程调用慢),不知道怎么解决,还望了解的指点一二。

WCF的绑定是netTcpBinding的,下面是绑定的配置文件

<bindings> <netTcpBinding>     

    <binding name="tcpBinding" receiveTimeout="24.00:00:00" transferMode="Buffered" maxReceivedMessageSize="2147483647">           <reliableSession inactivityTimeout="24.00:00:00"/>  

<security mode="None">

<transport clientCredentialType="None" protectionLevel="None"/>             <message clientCredentialType="None" algorithmSuite="Default"/>           </security>   

</binding>

</netTcpBinding></bindings>

获得内存信息的代码

Stopwatch sw = new Stopwatch();

sw.Start();           

//总内存大小           

ulong MemoryCapacity = 0;      

//可用内存大小          

ulong MemoryOccupancy = 0;       

ManagementClass memoryHelper = new ManagementClass("Win32_PhysicalMemory");          

ManagementObjectCollection moc = memoryHelper.GetInstances();             foreach (ManagementObject m in moc)             {

 MemoryCapacity = ulong.Parse(m.Properties["Capacity"].Value.ToString()) / 1024 / 1024;        

     }      

//获取内存可用大小         

memoryHelper = new ManagementClass("Win32_PerfFormattedData_PerfOS_Memory");     

moc = memoryHelper.GetInstances();        

foreach (ManagementObject m in moc)             {   

MemoryOccupancy = ulong.Parse(m.Properties["AvailableMBytes"].Value.ToString());      

}           

Console.WriteLine("获取内存信息耗时(单位毫秒):"+sw.ElapsedMilliseconds); sw.Stop();         

Console.ReadLine();

MoonSky的主页 MoonSky | 初学一级 | 园豆:5
提问于:2012-10-08 11:03
< >
分享
最佳答案
0

不算解决了,但还是要感谢给予帮助的三位园友,参考了http://www.cnblogs.com/netwom/articles/1085578.html,设置了安全设置后将Local Service和Network Service的权限全部给足之后,时间缩短至十五六秒;不过问题还没有根本解决,因为我将那个权限再调回去发现再没有重现五十多秒的情况,正式发布后时间五六秒,虽然还很慢,但我没办法解决也就这么上线了。

MoonSky | 初学一级 |园豆:5 | 2012-10-16 22:33
其他回答(3)
0

1 本机和远程用的是同一个wcf服务吗? 不是的话和账号可能有关

2 localhost访问wcf是否正常?

3 如果仍有问题,你可以使用VS的“分析、探查器”采样一下程序,看哪个函数在耗时

收获园豆:52
2012 | 园豆:21645 (高人七级) | 2012-10-08 13:22

本机模拟服务端和客户端时正常,服务端和客户端是双工的,服务端发出请求,客户端执行读取内存信息返回给服务端。绝大多数的都正常,只有 Server 2008 R2 SP1+64位操作系统的才会慢。我逐步写日志的,发现是在读内存的地方耗时的。

另外我还写了个单独获得内存的控制台程序,在那种机型上测试,只要280毫秒。

支持(0) 反对(0) MoonSky | 园豆:5 (初学一级) | 2012-10-08 13:32

@MoonSky: 控制台程序和双工的客户端程序的设置区别在哪里,是否这些引起的?

另外看看系统的日志查看器 有没有告警什么的,也是线索

支持(0) 反对(0) 2012 | 园豆:21645 (高人七级) | 2012-10-08 18:33

@2012: 调用的是相同的函数,不同之处一个是直接调用获取内存信息的函数,一个是远程WCF调用那个执行获取内存信息的函数。系统的日志查看器里面是看不到任何警告或者报错的信息的。没有错误只是慢。

支持(0) 反对(0) MoonSky | 园豆:5 (初学一级) | 2012-10-08 20:57

@MoonSky: 这种情况很奇怪的,可以使用reflector看看生成的代码有差别吗?

或者使用sysinternal工具包中的procexp.exe procmon.exe看看两种进程执行时的差别信息http://www.cnblogs.com/2018/archive/2011/04/28/2031445.html 

支持(0) 反对(0) 2012 | 园豆:21645 (高人七级) | 2012-10-09 08:46
0

单从64位操作系统和你的new ManagementClass("Win32_PhysicalMemory");来看,可以推断出问题是64位系统调用了32位的API造成的问题,正常情况下,64位系统应该调用64位的API,除非项目编译选项里强制指定该程序是32位运行的,默认的Any PC方式会在64位系统下,按照64位模式运行,所有.NET的方法全部调用64位的API。

你尝试将客户端项目强制运行在X86模式下面,估计就能好了。

收获园豆:30
秦楼东 | 园豆:913 (小虾三级) | 2012-10-09 10:50

尝试了,没看到变快的效果。

支持(0) 反对(0) MoonSky | 园豆:5 (初学一级) | 2012-10-09 11:56
0

确定是程序慢还是请求过程慢

收获园豆:18
贺臣 | 园豆:307 (菜鸟二级) | 2012-10-09 18:17

是程序慢,把获取内存信息的那段注释掉,别的瞬间完成。单独执行那个函数快,但用WCF调用那个函数就慢。

支持(0) 反对(0) MoonSky | 园豆:5 (初学一级) | 2012-10-09 19:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册