含有多个线程的程序CPU跑满查原因,如何查出到底是哪一个线程占用大量CPU?

解决方案 »

  1.   

    使用多线程就是为了提高 CPU 的利用率
      

  2.   

    如果是 异常,那就与多线程没有直接的关系了
    单线程程序一样会使CPU跑满
      

  3.   

    只要是跑着的线程,那么都是占用CPU的线程。你如果没有对于线程有准确的(通常也不可能有)预估占用率,那么其实也就没有理由追究这个指标。通常先从基本理念上仔细衡量一下有没有明显是多余地、干了不必要的事情的线程。比如说许多系统即使10万客户端同时在线通讯往往只有几个、十几个线程就够了,而又的人弄多少线程在跑?这类问题设计先处理掉。然后整个系统就是要有水平扩展的准备。
      

  4.   

    说“a线程占用1%CPU、b线程占用95%CPU”这其实往往是不能清晰、干净地解决问题的思路,甚至后患无穷,甚至问题原本就是这种思路中带进来的“一颗颗老鼠屎”。那么没有必要时就不应该有线程在执行,把你的系统从轮询机制变为事件驱动机制,这时候你一出问题就能知道该停掉哪些操作!
      

  5.   


    老师您说的不错。但这是我今天遇到的一个变态的面试题,题意就是说有一个程序含有多个线程。假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,面试官说让我想办法查出到底是哪个线程的原因,我表示用log监测。他表示呵呵然后就GG了
      

  6.   

    我知道windbg可以
      

  7.   

    这个首先得看是不是程序占得cpu,这个可以在任务查看器以及性能监测器看
    确定是这个程序的话,可以通过windbg抓dump进行分析(怎么分析反正我不会,这东西都是破指令,学过一次,用完之后不用很快就忘了……)
      

  8.   

    1、如果一个进程有多个线程在 同时 运行,那么cpu占满是不可能的,每个线程本来就是会被操作系统分配时间片的,如果3个线程同时运行,那么只有问题线程所使用的30%是满的,所以cpu总体使用率可能是30%以上,但不可能达到100%。
    2、如果线程设置了优先级的前提下,发生cpu满了,那很明显就是优先级最高的那个线程出的问题。
    3、线程如果不是一直运行的,而是运行完就关闭的,那么也有可能在某个cpu高的时刻,只有一个线程在运行,此时,加log看看是哪个线程即可。
      

  9.   


    老师您说的不错。但这是我今天遇到的一个变态的面试题,题意就是说有一个程序含有多个线程。假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,面试官说让我想办法查出到底是哪个线程的原因,我表示用log监测。他表示呵呵然后就GG了
    那个面试官想听的是自己做一套线程监控,把内部线程和系统线程id结合,但是实际操作中这个东西反而在很多时候会空耗资源和运行时间。
      

  10.   

    线程不停的创建而且没有及时销毁。现在的CLR在管理线程的时候非常聪明,并不是创建了线程A,然后这个A就一直是运行着的,在A运行的时候,也有可能随时会有线程B来替代A继续运行。利用CPU的空闲时间来创建适量的线程 来执行复杂操作,正是CLR将线程从Window线程切换到.net 线程的方式,合理利用而且不浪费。 至于具体查找到那个线程这似乎有点难度。PS:个人观点,欢迎指正。
      

  11.   

    GG了你完全可以顺便问一下他正确答案嘛说不定他只是想让你在调试状态下查看CPU使用率,然后找到哪个函数CPU占用过高呢
      

  12.   

    获取.net线程的CPU占用率有点难度
    不过,Windows系统,默认情况下,耗时操作优先,进程的CPU占用率就是耗时线程的占用率,不断打印线程ID和进程CPU占用率
    还有,从处理的业务入手,启动线程时,加入处理标志,然后结合日志个人观点
      

  13.   

    用VisualVM 工具监控分析
      

  14.   

    “假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,那么”,这个情况在调试时不一定会重现,如果总是在运行一段时间后CUP占用率暴涨,内存泄露是大概率画事件,这个却好跟踪
      

  15.   

    我知道windbg可以
      

  16.   

    我也有类似想法,不知道lz应聘的是什么级别的公司。lz怎么回答的?结果怎么样?
      

  17.   

    这种玩意多数是意外死锁
    可以使用性能分析工具去查或者使用dump查当然如果有条件的话,直接使用vs的远程调试工具也成