socket发送数据长跑后CPU升至100%,求大侠.该如何解决

socket发送数据长跑后CPU升至100%,求大侠.
本帖最后由 oyljerry 于 2012-09-21 19:48:14 编辑
     
      写了个模拟相机的客户端程序, 启动的时候,从硬盘里读取8M的H264数据,然后循环的将这段数据,以每秒发送15帧的大小约为60KB的数据,这样每秒TCP的socket发送量约为3.5Mb(注意是小b)左右,因为是在100Mb的dell电脑上,所以启动了20个客户端,开始的时候每个进程的CPU占用率为0%,20个进程的CPU总共不到2%,长跑12小时候,CPU就是100%了,而每个进程的 CPU占用率都是5%, 看了内存没有泄露,句柄也没有泄露,求大家一起分析一下,是什么导致CPU过高。

    电脑的性能还是可以i3 2120, 3.5GHz的,2G内存。


   



------解决方案--------------------
是不是有资源泄漏呢。

------解决方案--------------------
每秒TCP的socket发送量约为3.5Mb
----------------
20个进程:20*3.5 = 70Mb
你的带宽达不到这个要求吧?数据包就会丢失,TCP就会重传,更加加重网络的负荷
------解决方案--------------------
流量是70Mb,网卡都是100Mb了吧,至少。
不是流量的问题,如果是流量的问题,一开始就应该要表现出来。

按我的判断,前面我都说了,是你的逻辑的问题,比如有不合理的循环。所谓不合理的循环,是指这个循环里面什么都不做,就循环回来了。

我举个例子,你有一个套接字,你不会去写它,但却放到select模型去检测它的可写状态(同时也检测它的可读状态),那么当套接字上没有数据可读的时候,你这个for中的select将马上返回(因为可写状态检测到了,可写状态一直存在),返回之后,由于你根本不写套接字,于是马上循环回去,继续select,如此循环,cpu都耗在空转上了。

注:上面例子我估计是这样,我在用epoll时真实遇到过,但表达起来麻烦一些,所以以select为例。我用epoll时,在LT模式下,同时检测可读可写,当套接字上没有数据收发时,反而cpu占用更高,都耗在空转上了。正确的做法是在空转时加个sleep,或者在没有写数据的时候,不要检测套接字的可写状态。

上面我举的是在用套接字上可能出现的问题,不排除还有其它问题也会造成这个现象,这个与你的业务有关,需要你自己去检查,或者贴出代码。