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个线程,都测试过,最终都只有一个核心的占用量! --------------------编程问答--------------------
把所有逻辑分开到5-1000个线程,都测试过,最终都只有一个核心的占用量! --------------------编程问答-------------------- 线程开太多了,
若是再有锁或共享资源(例如数据库)的话,就肯定跑不好了 --------------------编程问答-------------------- 高并发 就用线程池吧... --------------------编程问答-------------------- 1W以下的 或者用异步 --------------------编程问答--------------------
我用线程吃的时候开了100个线程 有时候调用的方法抛异常 整个线程吃貌似会清空 --------------------编程问答-------------------- 听起来像是高并发下new对象时导致的。一种解决方式就是看看你能不能够重用以前分配的对象。而不是每次都new。一来托管程序的new本身就是很慢的,比C++可能要慢上百倍。另一个就是频繁的new,垃圾回收到后面可能还会产生内存碎片的问题。 --------------------编程问答--------------------
补充:.NET技术 , .NET Framework