当前位置:编程学习 > C#/ASP.NET >>

C#垃圾回收与多线程

问题是这样的,我用C#开发了一套服务器,其中使用了多线程.
本期望能够利用多线程把服务器的所有CPU都利用起来,但经过压力测试后发现,在百人级别时,8核心 CPU占用量可以达到50%左右.
当人数达到1000甚至2000的时候 服务器开始巨卡,查看CPU占用量只有12%-16%(仅一个核心的占用量)

经过无数测试发现,代码中存在new对象操作后,多个线程的确无法完全发挥效率,通过C++代码测试也是如此,
所以我觉得可能new里面操作的是同一个堆,可能有锁. 通过C++实现了线程之间堆的独立,CPU果然占用满了.
但C#却没找到实现类此功能的方法.

还有一个就是GC的垃圾回收,明文写着会挂起所有的线程. 回收完毕再继续.

服务器代码中每tick大概有几百个临时对象的new 当人数上去这些new的量会非常之大,我在手动调用GC垃圾回收的时候做了一个时间统计,最慢的一次居然达到了20秒.

实在解决不了这个问题,来此求助,希望大神能重视能帮忙出主意解决一下!
非常感谢~~~~ --------------------编程问答-------------------- 信息不足啊

你开了多少线程? 8核心CPU的话,我一般开16个。 --------------------编程问答-------------------- 把所有逻辑分开到5-1000个线程,都测试过,最终都只有一个核心的占用量! --------------------编程问答--------------------
引用 1 楼 rtdb 的回复:
信息不足啊

你开了多少线程? 8核心CPU的话,我一般开16个。

把所有逻辑分开到5-1000个线程,都测试过,最终都只有一个核心的占用量!  --------------------编程问答-------------------- 线程开太多了, 

若是再有锁或共享资源(例如数据库)的话,就肯定跑不好了 --------------------编程问答-------------------- 高并发 就用线程池吧... --------------------编程问答-------------------- 1W以下的 或者用异步 --------------------编程问答--------------------
引用 5 楼 diaodiaop 的回复:
高并发 就用线程池吧...

我用线程吃的时候开了100个线程 有时候调用的方法抛异常 整个线程吃貌似会清空 --------------------编程问答-------------------- 听起来像是高并发下new对象时导致的。一种解决方式就是看看你能不能够重用以前分配的对象。而不是每次都new。一来托管程序的new本身就是很慢的,比C++可能要慢上百倍。另一个就是频繁的new,垃圾回收到后面可能还会产生内存碎片的问题。 --------------------编程问答--------------------
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,