场景: 压测导致cpu过高,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。
https://cloud.tencent.com/developer/article/1614125
Step 1:使用top命令,查询资源占用情况:
如上图所示,显示了服务器当前的资源占用情况,其中PID为5456的进程占用的资源最多。
Step 2:使用ps -mp PID -o THREAD,tid,time | sort -rn命令,查询该进程的线程情况:
Step 3:使用printf “%x\n” TID命令,将TID转为十六进制的TID:(tid 是 线程ID)
在这里,我们之所以需要将TID转为十六进制是因为在堆栈信息中,TID是以十六进制形式存在的。
Step 4:使用jstack PID | grep TID -A 100命令,查询堆栈信息:
jstack
如上图所示,显示该进程下多个线程均处于TIMED_WAITING状态。
虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。
而上面之所以会出现 CPU 使用率飙高的情况,则是因为有人在做压测。
特别地,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。
至于为何在 下午3:45 分之后,CPU 的使用率降下来了,则是因为停止了压测。