none
多核心CPU服务器上的.net程序性能下降 RRS feed

  • 问题

  •  最近我们正在开发一个项目,服务端和客户端使用自己开发的通讯协议(基于tcp/ip)进行通讯。改服务端在双核单cpu的机器上任务的处理速度以及并发性能都很好,但是在在双cpu,16核,16G内存的机器上,并发性能急剧下降。有哪位朋友遇到过这种情况,有没有什么测量以及改善的方法?
    2010年5月26日 10:51

答案

  • 没做过多核编程,不过以前看编程卓越之道,其中有提及多CPU下线程同步的问题:

    若是单CPU,则数据可以加载到CPU的高速缓存,不必更新至内存就可以进行线程同步。

    若是多CPU,由于各个CPU拥有各自的高速缓存,因此,若在不同CPU上执行的线程间要同步数据,则数据必须更新至内存再使用。

    因此,效率下降将是必然。

    我个人觉得,如果在多核下效率下降很多的话,那说明线程间交互太多了。如果这样的话,那就应当设计更合理的线程分工和划分更合理的数据区域供线程处理。

    2010年5月28日 3:39
  • 你好!

         如果你的程序是构建在.NET Framework4.0以前的版本上的,即使你的程序是多线程的,也无法多个线程保证合理的分配在多个内核上。

         如果使用.NET Framework4.0,可以获得更好的支持!


    周雪峰


    在4.0之前多线程无法保证合理分配在多个内核上,具体什么情况下会这样?

    或者代码有什么要注意的地方,可以规避这个问题吗?

     


    简单说  io一定要用begin/end 的异步模式

    多线程一定要用线程池/begininvok


    入了ipad,最近用ipad上论坛
    2011年3月11日 6:06
    版主

全部回复

  • 你好!

         如果你的程序是构建在.NET Framework4.0以前的版本上的,即使你的程序是多线程的,也无法多个线程保证合理的分配在多个内核上。

         如果使用.NET Framework4.0,可以获得更好的支持!


    周雪峰
    2010年5月26日 11:03
    版主
  • 谢谢你的回复,今天我已经将多线程的实现改为.net4.0的并行方式,但是效果依然不理想,和单CPU双核心下的程序运行效率差别不大。并且,多核的并发性能比单cpu的性能差10倍。
    2010年5月26日 12:10
  • 有没有哪位朋友做过这方面的测试,或者有这方面的资料?不胜感激。

    2010年5月26日 15:11
  • 个人觉得有很多很多很多的可能性。例如你使用同步还是异步的网络模型,或者是用自己写的完全端口?线程池是用 .Net 自带的还是自己写的? 程序并行部分是否使用了信号量,信号量的设置是否正确?操作系统是否支持那么多个 CUP ?。。。。。。等等很多方面

    2010年5月26日 16:40
  • 个人判断,你的程序运行在只有一个核心,但频率为双核CPU两倍的单个CPU之上的并发数应该比运行在双核单CPU上的并发数要高.

    个人推荐你部署一个简单的WCF服务,采用TCP绑定,然后在两台机器上分别做负载测试,以获取基准的并发指标,测试中要注意:

    1,确保你的硬件和操作系统正常,可以使用SuperPI程序测试程序,然后再换.Net 4.0版的SuperPI测试程序;

    2,测试客户端和服务器之间的网络带宽;

    3,WCF相关性能设置可以去WCF论坛询问;

    2010年5月27日 1:21
  • 个人判断,你的程序运行在只有一个核心,但频率为双核CPU两倍的单个CPU之上的并发数应该比运行在双核单CPU上的并发数要高.

    个人推荐你部署一个简单的WCF服务,采用TCP绑定,然后在两台机器上分别做负载测试,以获取基准的并发指标,测试中要注意:

    1,确保你的硬件和操作系统正常,可以使用SuperPI程序测试程序,然后再换.Net 4.0版的SuperPI测试程序;

    2,测试客户端和服务器之间的网络带宽;

    3,WCF相关性能设置可以去WCF论坛询问;

    请问哪里可以下载到.net4的superPI程序?谢谢!
    2010年5月27日 5:09
  • 没做过多核编程,不过以前看编程卓越之道,其中有提及多CPU下线程同步的问题:

    若是单CPU,则数据可以加载到CPU的高速缓存,不必更新至内存就可以进行线程同步。

    若是多CPU,由于各个CPU拥有各自的高速缓存,因此,若在不同CPU上执行的线程间要同步数据,则数据必须更新至内存再使用。

    因此,效率下降将是必然。

    我个人觉得,如果在多核下效率下降很多的话,那说明线程间交互太多了。如果这样的话,那就应当设计更合理的线程分工和划分更合理的数据区域供线程处理。

    2010年5月28日 3:39
  • 你好!

         如果你的程序是构建在.NET Framework4.0以前的版本上的,即使你的程序是多线程的,也无法多个线程保证合理的分配在多个内核上。

         如果使用.NET Framework4.0,可以获得更好的支持!


    周雪峰


    在4.0之前多线程无法保证合理分配在多个内核上,具体什么情况下会这样?

    或者代码有什么要注意的地方,可以规避这个问题吗?

     

    2011年3月11日 5:09
  • 你好!

         如果你的程序是构建在.NET Framework4.0以前的版本上的,即使你的程序是多线程的,也无法多个线程保证合理的分配在多个内核上。

         如果使用.NET Framework4.0,可以获得更好的支持!


    周雪峰


    在4.0之前多线程无法保证合理分配在多个内核上,具体什么情况下会这样?

    或者代码有什么要注意的地方,可以规避这个问题吗?

     


    简单说  io一定要用begin/end 的异步模式

    多线程一定要用线程池/begininvok


    入了ipad,最近用ipad上论坛
    2011年3月11日 6:06
    版主
  • 4.0以前也是可以正确的分配的。

    4.0后 可以使用并行库  把一些互相没有依赖的操作用简单的命令分部到所有核心。


    入了ipad,最近用ipad上论坛
    2011年3月11日 6:17
    版主
  • 谢谢你的回复,今天我已经将多线程的实现改为.net4.0的并行方式,但是效果依然不理想,和单CPU双核心下的程序运行效率差别不大。并且,多核的并发性能比单cpu的性能差10倍。

    您能把您的并发开始的临界部分代码给我们分析下么?
    入了ipad,最近用ipad上论坛
    2011年3月11日 6:33
    版主