面试题:含有多个线程的程序CPU跑满查原因

gyweiUstc 2018-02-23 03:48:56
含有多个线程的程序CPU跑满查原因,

如何查出到底是哪一个线程占用大量CPU?
...全文
1362 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2018-02-26
  • 打赏
  • 举报
回复
这种玩意多数是意外死锁 可以使用性能分析工具去查或者使用dump查 当然如果有条件的话,直接使用vs的远程调试工具也成
  • 打赏
  • 举报
回复
排除法,一个一个试
gyweiUstc 2018-02-26
  • 打赏
  • 举报
回复
引用 18 楼 From_TaiWan 的回复:
[quote=引用 17 楼 sdghchj 的回复:] 线程较多,都是死循环。 其实你可以直接回答说不知道,然后返问答案,因为有可能面试官自己也就是在钓鱼而已。
我也有类似想法,不知道lz应聘的是什么级别的公司。 lz怎么回答的?结果怎么样? [/quote] 一家普通的软件公司,同时还问了我另一个帖子中的问题,我都回答不了,当然最后是GG了,面试官连给我问他的机会都没给,直接说就这样吧。电话就挂了。。。
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
获取.net线程的CPU占用率有点难度 不过,Windows系统,默认情况下,耗时操作优先,进程的CPU占用率就是耗时线程的占用率,不断打印线程ID和进程CPU占用率 还有,从处理的业务入手,启动线程时,加入处理标志,然后结合日志 个人观点
Anonymous477 2018-02-24
  • 打赏
  • 举报
回复
GG了你完全可以顺便问一下他正确答案嘛。。。说不定他只是想让你在调试状态下查看CPU使用率,然后找到哪个函数CPU占用过高呢。。。
exception92 2018-02-24
  • 打赏
  • 举报
回复
线程不停的创建而且没有及时销毁。现在的CLR在管理线程的时候非常聪明,并不是创建了线程A,然后这个A就一直是运行着的,在A运行的时候,也有可能随时会有线程B来替代A继续运行。利用CPU的空闲时间来创建适量的线程 来执行复杂操作,正是CLR将线程从Window线程切换到.net 线程的方式,合理利用而且不浪费。 至于具体查找到那个线程这似乎有点难度。 PS:个人观点,欢迎指正。
  • 打赏
  • 举报
回复
引用 6 楼 gyweiUstc 的回复:
[quote=引用 4 楼 sp1234 的回复:] 只要是跑着的线程,那么都是占用CPU的线程。你如果没有对于线程有准确的(通常也不可能有)预估占用率,那么其实也就没有理由追究这个指标。通常先从基本理念上仔细衡量一下有没有明显是多余地、干了不必要的事情的线程。比如说许多系统即使10万客户端同时在线通讯往往只有几个、十几个线程就够了,而又的人弄多少线程在跑?这类问题设计先处理掉。 然后整个系统就是要有水平扩展的准备。
老师您说的不错。但这是我今天遇到的一个变态的面试题,题意就是说有一个程序含有多个线程。假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,面试官说让我想办法查出到底是哪个线程的原因,我表示用log监测。他表示呵呵。。。然后就GG了。。。[/quote] 那个面试官想听的是自己做一套线程监控,把内部线程和系统线程id结合,但是实际操作中这个东西反而在很多时候会空耗资源和运行时间。
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
引用 17 楼 sdghchj 的回复:
线程较多,都是死循环。 其实你可以直接回答说不知道,然后返问答案,因为有可能面试官自己也就是在钓鱼而已。
我也有类似想法,不知道lz应聘的是什么级别的公司。 lz怎么回答的?结果怎么样?
圣殿骑士18 2018-02-24
  • 打赏
  • 举报
回复
1、如果一个进程有多个线程在 同时 运行,那么cpu占满是不可能的,每个线程本来就是会被操作系统分配时间片的,如果3个线程同时运行,那么只有问题线程所使用的30%是满的,所以cpu总体使用率可能是30%以上,但不可能达到100%。 2、如果线程设置了优先级的前提下,发生cpu满了,那很明显就是优先级最高的那个线程出的问题。 3、线程如果不是一直运行的,而是运行完就关闭的,那么也有可能在某个cpu高的时刻,只有一个线程在运行,此时,加log看看是哪个线程即可。
sdghchj 2018-02-24
  • 打赏
  • 举报
回复
线程较多,都是死循环。 其实你可以直接回答说不知道,然后返问答案,因为有可能面试官自己也就是在钓鱼而已。
agjwc 2018-02-24
  • 打赏
  • 举报
回复
我知道windbg可以
mlqxj35674 2018-02-24
  • 打赏
  • 举报
回复
“假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,那么”,这个情况在调试时不一定会重现,如果总是在运行一段时间后CUP占用率暴涨,内存泄露是大概率画事件,这个却好跟踪
沸羊羊一个 2018-02-24
  • 打赏
  • 举报
回复
用VisualVM 工具监控分析
  • 打赏
  • 举报
回复
这个首先得看是不是程序占得cpu,这个可以在任务查看器以及性能监测器看 确定是这个程序的话,可以通过windbg抓dump进行分析(怎么分析反正我不会,这东西都是破指令,学过一次,用完之后不用很快就忘了……)
  • 打赏
  • 举报
回复
我知道windbg可以
gyweiUstc 2018-02-23
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
只要是跑着的线程,那么都是占用CPU的线程。你如果没有对于线程有准确的(通常也不可能有)预估占用率,那么其实也就没有理由追究这个指标。通常先从基本理念上仔细衡量一下有没有明显是多余地、干了不必要的事情的线程。比如说许多系统即使10万客户端同时在线通讯往往只有几个、十几个线程就够了,而又的人弄多少线程在跑?这类问题设计先处理掉。 然后整个系统就是要有水平扩展的准备。
老师您说的不错。但这是我今天遇到的一个变态的面试题,题意就是说有一个程序含有多个线程。假设以往都是正常不会占用CPU100%,今天莫名其妙开始跑满CPU,面试官说让我想办法查出到底是哪个线程的原因,我表示用log监测。他表示呵呵。。。然后就GG了。。。
  • 打赏
  • 举报
回复
只要是跑着的线程,那么都是占用CPU的线程。你如果没有对于线程有准确的(通常也不可能有)预估占用率,那么其实也就没有理由追究这个指标。通常先从基本理念上仔细衡量一下有没有明显是多余地、干了不必要的事情的线程。比如说许多系统即使10万客户端同时在线通讯往往只有几个、十几个线程就够了,而又的人弄多少线程在跑?这类问题设计先处理掉。 然后整个系统就是要有水平扩展的准备。
  • 打赏
  • 举报
回复
说“a线程占用1%CPU、b线程占用95%CPU”这其实往往是不能清晰、干净地解决问题的思路,甚至后患无穷,甚至问题原本就是这种思路中带进来的“一颗颗老鼠屎”。那么没有必要时就不应该有线程在执行,把你的系统从轮询机制变为事件驱动机制,这时候你一出问题就能知道该停掉哪些操作!
xuzuning 2018-02-23
  • 打赏
  • 举报
回复
如果是 异常,那就与多线程没有直接的关系了 单线程程序一样会使CPU跑满
gyweiUstc 2018-02-23
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
使用多线程就是为了提高 CPU 的利用率
假设这是异常的跑满,不是正常情况呢?
加载更多回复(1)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧