程序运行一段时间后CPU占用慢慢上升级,求解决方法(多线程)

时间:2022-09-05 17:01:59
RT
是一个多线程的程序,程序运行一段时间后(30分钟以上,不一定是必定30分钟)CPU占用慢慢上升级,(但是没有新开别的线程)
求解决方法
整个程序中包含了音视频压缩传送等,
在网上看了一下,有的说是SLEEP不够,也有的结合内存泄露来说;
小弟不才,试了许久没有解决,现放出来望大家帮我分析一下。
先谢谢啦

13 个解决方案

#1


打开任务管理器,查看内存占用的变化。更多的情况下是由于内存节点增多引起的,特别是内存不足(或者少于一定量),操作系统在做PageOut动作,这个时候申请内存的效率就相当低,自然程序也就受影响,CPU占用也就上升。当然也不排除内存泄露,或者代码当中出现逻辑问题导致操作重复。如果使用到列表的话,也有可能是列表增大,导致扫描次数增多引起的。

#2


很有可能是内存泄漏引起的。仔细检查一下。

#3


在任务管理器中的内存可用数是在持续下降,但是速度不是很快,我也注意到了这个地方

还有就是,程序在运行且有视音频连接传送才会出现CPU上升

内存不足倒是可以排除在外

但是对于这块我也不是很熟悉,我想请问,内存泄露会导致出现这样的情况大吗?

其实我开始对sleep不够的说法比较认同

#4


sleep不够我倒不觉得,有个Sleep(1)和没有是有很大差别的,但是有事情干的时候,如果Sleep时间太长,就会导致有足够的CPU,却不干活。有视频连接上升这个属于正常。只是我前面提到的,认真查一下有没有什么地方使用到了遍历。如果有存在就需要进行优化。前面我有一个程序,一个数组也不大,也就五十个元素,但是当多次调用的时候,由于遍历,明显导致CPU无故地被占用在遍历过程当中。另外一个就是多线程当中的同步。线程并不是越多越好,线程越多所导致的碰撞越大,反倒会阻碍其它线程的工作。如果当中没有慢速设备操作,包括文件等,建议线程数保持在CPU并行线程稍加一定量就行。有些必须的同步,可以参考我在下面贴子当中所说的过程切割。
http://topic.csdn.net/u/20080122/16/fd55ae2c-aaa4-4848-bcf4-41db7b609d55.html

#5


在视频音频的传输过程中用的是专用线程,的确是有用到像您说的那样WaitFor(...,0)检测WAIT_TIME_OUT
但是整个过程中是必须这样的
还有就是我注意了一下,好像对于您提到的使用了遍历这个原因,我认为如果,如果是有遍历那他应该是在大约相同的时间出现
占用上升,(PS:我说的CPU占用上升主要是从正常值,一路慢慢的上升到100%),而现在的情况是出现的时间不同,在不同的视频
质量下,出现的时间也不同,也就是说数据量不同,出现的时间段不同,有时候跑上个4~~5小时也不上升,这也是我头疼的原因之一

#6


在资源管理器中具体看一下每个进程的CPU使用情况,是你的程序导致的吗??

#7


当然是我程序导致的呀,我都Perfmon.exe跟了半天了

#8


另外楼主要不试一下Intel的那几个性能检测工具。可以记录很多东西,也可以产生很强的报表。并且可以实时的跟踪。

#9


谢谢~~~~~看来这东西还得花点力气~~~~~~

#10


看循环,估计某个地方,循环次数在逐渐增多。

#11


走前,再来UP一下,大家明早见

#12


程序阻塞不够,基本上在全力运行,没有多少机会执行等待操作。考虑优化数据压缩传送算法

#13


mark~

#1


打开任务管理器,查看内存占用的变化。更多的情况下是由于内存节点增多引起的,特别是内存不足(或者少于一定量),操作系统在做PageOut动作,这个时候申请内存的效率就相当低,自然程序也就受影响,CPU占用也就上升。当然也不排除内存泄露,或者代码当中出现逻辑问题导致操作重复。如果使用到列表的话,也有可能是列表增大,导致扫描次数增多引起的。

#2


很有可能是内存泄漏引起的。仔细检查一下。

#3


在任务管理器中的内存可用数是在持续下降,但是速度不是很快,我也注意到了这个地方

还有就是,程序在运行且有视音频连接传送才会出现CPU上升

内存不足倒是可以排除在外

但是对于这块我也不是很熟悉,我想请问,内存泄露会导致出现这样的情况大吗?

其实我开始对sleep不够的说法比较认同

#4


sleep不够我倒不觉得,有个Sleep(1)和没有是有很大差别的,但是有事情干的时候,如果Sleep时间太长,就会导致有足够的CPU,却不干活。有视频连接上升这个属于正常。只是我前面提到的,认真查一下有没有什么地方使用到了遍历。如果有存在就需要进行优化。前面我有一个程序,一个数组也不大,也就五十个元素,但是当多次调用的时候,由于遍历,明显导致CPU无故地被占用在遍历过程当中。另外一个就是多线程当中的同步。线程并不是越多越好,线程越多所导致的碰撞越大,反倒会阻碍其它线程的工作。如果当中没有慢速设备操作,包括文件等,建议线程数保持在CPU并行线程稍加一定量就行。有些必须的同步,可以参考我在下面贴子当中所说的过程切割。
http://topic.csdn.net/u/20080122/16/fd55ae2c-aaa4-4848-bcf4-41db7b609d55.html

#5


在视频音频的传输过程中用的是专用线程,的确是有用到像您说的那样WaitFor(...,0)检测WAIT_TIME_OUT
但是整个过程中是必须这样的
还有就是我注意了一下,好像对于您提到的使用了遍历这个原因,我认为如果,如果是有遍历那他应该是在大约相同的时间出现
占用上升,(PS:我说的CPU占用上升主要是从正常值,一路慢慢的上升到100%),而现在的情况是出现的时间不同,在不同的视频
质量下,出现的时间也不同,也就是说数据量不同,出现的时间段不同,有时候跑上个4~~5小时也不上升,这也是我头疼的原因之一

#6


在资源管理器中具体看一下每个进程的CPU使用情况,是你的程序导致的吗??

#7


当然是我程序导致的呀,我都Perfmon.exe跟了半天了

#8


另外楼主要不试一下Intel的那几个性能检测工具。可以记录很多东西,也可以产生很强的报表。并且可以实时的跟踪。

#9


谢谢~~~~~看来这东西还得花点力气~~~~~~

#10


看循环,估计某个地方,循环次数在逐渐增多。

#11


走前,再来UP一下,大家明早见

#12


程序阻塞不够,基本上在全力运行,没有多少机会执行等待操作。考虑优化数据压缩传送算法

#13


mark~