none
cpu使用率达到100%?? RRS feed

  • 问题

  • 我写了一个从网上搜索邮箱的程序,采用多线程搜索,刚开始CPU使用率不是太高,随着开启线程的增多,CPU使用率越来越高,有的时候达到90%--100%,请问大家这是怎么回事,我从网上找的说 执行循环时sleep(100),我添加了,还是不行, 请各位给与指点,谢谢
    2009年4月20日 7:59

答案

  • 楼主,你好,首先我们要对问题进行定性,造成CPU使用率高,是量大,还是本身程序有问题,这个你要先进行一次测试。合适的线程数量影响效率。
    jon.valett@gmail.com
    2009年4月20日 11:19
    版主
  • 这是正常的,CPU 计算能力是有限的,你只有优化你的处理代码这样可以多开一些线程, 不要指望一台电脑或服务器就可以开无限个线程
    知识改变命运,奋斗成就人生!
    2009年4月21日 12:02
    版主

全部回复

  • 指定时间做不完  自然会占满哦
    工作突然有点忙 嘿嘿
    2009年4月20日 8:12
    版主
  • 可能是因为你的线程开得太多了,而 Sleep(100) 也是一个非常短的时间,所以当线程达到一定数量,CPU处理就跟不上了,你可以 Sleep 更长的时间试试比如 Sleep (10000)
    知识改变命运,奋斗成就人生!
    2009年4月20日 8:14
    版主
  • 已经改成这个 Sleep (10000),感觉没变化,能不能帮我解决下,很急,谢谢
    msn: 2008xiangzhang@live.cn
    2009年4月20日 11:00
  • 楼主,你好,首先我们要对问题进行定性,造成CPU使用率高,是量大,还是本身程序有问题,这个你要先进行一次测试。合适的线程数量影响效率。
    jon.valett@gmail.com
    2009年4月20日 11:19
    版主
  • 你可以考虑优化你的处理代码或根据硬件情况设一个最大线程数,计算机的资源是有限的,线程增加到计算机的处理瓶颈,速度就是越来越慢
    知识改变命运,奋斗成就人生!
    2009年4月20日 12:00
    版主
  • 先让线程函数不工作,看看CPU使用率随着线程增加的情况是什麽样子的从而确定问题是否出自线程函数本身?
    总之你应该先确定问题出在哪,然后再一步步排查缩小范围!
    2009年4月21日 8:05
  • 你好,如果线程不开启或者刚开始启动的少,CPU不是太高,但随着线程开得越来越多,Cpu使用率也随着升高了,不知道这是什么问题,请大家给与帮助,谢谢

    2009年4月21日 11:57
  • 这是正常的,CPU 计算能力是有限的,你只有优化你的处理代码这样可以多开一些线程, 不要指望一台电脑或服务器就可以开无限个线程
    知识改变命运,奋斗成就人生!
    2009年4月21日 12:02
    版主
  • 可能是你开的线程太多了啊!

    周雪峰
    2009年4月21日 12:03
    版主
  • 就是线程开的太多了,但是必须开那么多线程,因为要搜索,有什么办法解决吗?
    2009年4月22日 13:29
  • 我想没有办法了吧,就好比给同一个人不断的增加工作量,那个人的工作效率会越来越低。想提高效率的话你可以考虑在多台电脑上运行你的程序每台机器开一定数量的线程
    知识改变命运,奋斗成就人生!
    2009年4月22日 13:41
    版主
  • 是呀,线程慢慢的越开越多,Cpu使用率自然会越来越高,能不能把已经使用过的线程销毁了,或者别的什么办法?

    2009年4月23日 0:40
  • 加一行就行了
    Thread.Sleep(1)
    2009年4月23日 13:08
  • 楼主你好,我觉得这是一个算法问题:

    1 首先,发送邮件:发邮件是需要远端服务器响应的,想必楼主这是在群发邮件,这样一来,各种地址的返回时间是不定的,而且有时候遇到发送错误时,会占用更长的时间


    2 其次,多线程:楼主并没有定义线程的上限值


    这两个原因结合到一起:越来越多的线程没有得到释放的时候,不断地产生新的线程,造成了CPU需要处理的 释放过程、错误处理  等工作越来越多。最后造成100%占用资源。


    解决办法:
    1 设置一个更合理的SLEEP时间,
    2 设置线程最大上限。
    3 判断现存的、尚未回收的资源,如果太多,就暂时先不要生成新的线程,一直SLEEP下去。
    梁逸晨
    2009年5月1日 19:13
  • 我也遇到楼主的问题了,,哈哈,,

    我的情况是一个backgroundworker...然后里面去读取内存的资料,,
    因为这内存非常慢,,,,我用批读的,,,最后把批读设小一点好像明显好了...
    • 已建议为答案 tssing 2009年5月2日 1:57
    2009年5月2日 1:57
  • 关键是看看你的线程中的循环、计算等语句的语法是否出现问题?
    竹林逍遥自在,快活任我行!
    2009年5月3日 8:47
  • 线程开太多。每开一个线程,就会强行插入队列优先执行线程。5个线程抢一个CPU效果好,还是5N个线程抢一个CPU效果好,显而易见。
    当然是用线程也要考虑一个“量”的问题,要多少个线程最合适。

    2009年5月5日 12:58
  • 线程开太多。每开一个线程,就会强行插入队列优先执行线程。5个线程抢一个CPU效果好,还是5N个线程抢一个CPU效果好,显而易见。


    这么高级,从来没做超过1条线程,,
    2009年5月5日 13:01
  • MN
    2009年5月5日 13:05
  • 如果你的程序没有别的问题的话,看看是否gc 占用了你大部分的cpu时间?

    如果有内存泄露,则大部分cpu时间会被用来gc操作。

    2011年7月5日 0:54