前几天早上遇到服务不能访问的问题 ,第一时间看了服务器,哇kao;
cpu100% 。 瞬间觉得奇怪,昨天发布之后,一直好好的 怎么突然这样;
突然想起来 ,现在是访问高峰。
那么是什么问题呢,看了下日志 ,发现大量的访问线程取消的;想了下这次没做什么改动啊,突然想起来,之前加了个多线程操作的,这个操作正好是在那个高峰访问接口触发的;第一时间感觉没错,就是这个问题。于是赶紧把代码注释,重新发布,几分钟之后,服务正常了。
那么出问题的是什么代码呢 。如下截图

触发条件是用户访问接口的时候;这样就产生大量的线程。
首先由于每台计算机能进行的并行是有上限的,经过测试本机的上限为1023个左右(win7 64位,i3 2核4线程)。所以线程数的CPU抢占消耗都是极高。
后面看了代码发现项目很多地方都是这么写的,但是一直没问题,是因为很多方法访问量很小,还没达到高压线。
最后解决办法
1、多线程最好是采用线程池,限制数量
2、消息队列方式
3、定时任务,处理业务
此外,我发现这个:
当你调用线程。在线程上启动方法,该线程可能为 或可能不会立即开始执行,具体取决于处理器的数量和当前等待执行的线程数。
https://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx
原文作者:后端Q;如有侵权,请联系管理员删除。