场景: 压测导致cpu过高,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。

    https://cloud.tencent.com/developer/article/1614125

    Step 1:使用top命令,查询资源占用情况:
    image.png
    如上图所示,显示了服务器当前的资源占用情况,其中PID为5456的进程占用的资源最多。

    Step 2:使用ps -mp PID -o THREAD,tid,time | sort -rn命令,查询该进程的线程情况:

    image.png

    Step 3:使用printf “%x\n” TID命令,将TID转为十六进制的TID:(tid 是 线程ID)

    在这里,我们之所以需要将TID转为十六进制是因为在堆栈信息中,TID是以十六进制形式存在的。
    Step 4:使用jstack PID | grep TID -A 100命令,查询堆栈信息:
    image.png
    jstack
    如上图所示,显示该进程下多个线程均处于TIMED_WAITING状态。
    虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。
    而上面之所以会出现 CPU 使用率飙高的情况,则是因为有人在做压测。
    特别地,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。
    至于为何在 下午3:45 分之后,CPU 的使用率降下来了,则是因为停止了压测。