简介
在下是刚毕业的小萌新,现在在一家股票资讯公司做Java开发,身在nlp小组,自然要接触很多模型,我的任务就是tensoflow模型的工程部署,开发完成之后,发布到服务器上发现CPU占用一直是100%,糟了,多半是死循环的感觉。
排查步骤
1. 查看服务PID
jps
服务kg_deep_tuple_extraction.jar是我们的服务,PID为31660
2. 使用top -p查看资源情况
top -p 31660
CPU占用一直是100%多
3.使用ps -mp pid -o THREAD,tid,time查看线程
ps -mp 31600 -o THREAD,tid,time |sort -k2r
该命令已经按照cpu占用排序,问题线程基本就是第一个,可以看到tid为31765的线程,cpu占用95.9%,是占用最高的线程了,耗时09:17,那就是这个线程出了毛病,我们接着往下看。
4.将需要的线程ID转换为16进制格式
printf “%x\n” tid
得到转换后的tid为7c15
5.打印线程的堆栈信息
jstack pid |grep tid -A 30
可以看到是哪一行代码出了问题,如图是BatchQueueThread.java:60,线程状态时Runnable,我们去代码里找到这段代码。
@Override
public void run() {
long start = System.currentTimeMillis();
while(true) {
long now = System.currentTimeMillis();
if (queue.size() < batchMaxSize && now -start < sleepTime) {
continue;
}
try{
List<E> inputs = poll();
if (inputs.isEmpty()) {
contitue;
}
start = now;
results.putAll(baseBatchService.predictBatch(inputs));
} catch (Exception e) {
LOG.error("predict batch error : {}", ExceptionUtils.getStackTrace(e));
}
}
}
ooo~原来是忘记了Thread.sleep(1),加上就解决了。
总结
最后,总结下排查CPU100%用到的命令:
1、top:查看CPU等资源的占用情况
2、ps:进程状态监控,可以查看进程以及进程中线程的用情况
3、jstack:JDK的命令,可以查看某个进程的当前线程栈运行情况
4、pstack:可以查看某个进程的当前线程栈运行情况