一般来说,一个进程在某一时刻突然导致cpu的使用率变高,怎么才能定位到哪里出现问题呢,需要如下几个操作。
1.ps命令
>ps -Leo pid,lwp,user,comm,pcpu
PID LWP USER COMMAND %CPU
1 1 root systemd 0.0
2 2 root kthreadd 0.0
....
2.排序
>ps -Leo pid,lwp,user,comm,pcpu|sort -k5 -r -n|head --lines 4
PID LWP USER COMMAND %CPU
9 9 root rcu_bh 20.0
99 99 root migration/18 10.0
9901 9901 root kworker/11:1 5.0
3.查找相关程序(这里以java为例,用的是网上的例子)
>ps -Leo pid,lwp,user,comm,pcpu|awk '$4=="java"{print $0}'|sort -k5 -r -n|head --lines 3
7114 7199 ocdp java 0.4
28178 28205 root java 0.4
2046 2355 ocdp java 0.3
4.这样就找到了cpu使用率最高的进程是7114中的线程7199,将线程id转为16进制
5.通过jstack 7114 > ~/7114.tmp将进程的堆栈信息输出到临时文件中
6.在临时文件中查找1c1f,会找到这个线程当前的状态,从而可以定位当相应的代码
"sparkDriverActorSystem-scheduler-1" #41 daemon prio=5 os_prio=0 tid=0x00007f649d661000 nid=0x1c1f waiting on condition [0x00007f646bbfc000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at akka.actor.LightArrayRevolverScheduler.waitNanos(Scheduler.scala:226)
at akka.actor.LightArrayRevolverScheduler$$anon$8.nextTick(Scheduler.scala:405)
at akka.actor.LightArrayRevolverScheduler$$anon$8.run(Scheduler.scala:375)
at java.lang.Thread.run(Thread.java:745)
总结
根据ps和jstack可以定位相关的位置,从而进一步查错
网友评论