記錄一次線上服務器出現cpu占用過高,避免之后再次出現相關問題,這里記錄一下
用代碼模擬cpu 占用過高進行排查
新建一個web項目,這里以springboot為例子新建一個web項目
package com.wanjun.jvm; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class JvmApplication { public static void main(String[] args) { SpringApplication.run(JvmApplication.class, args); } //這里寫個死循環 模擬 cpu 占用 @RequestMapping("/cpu") public String testCpu() { System.out.println("request cpu"); while (true) { } } }
將項目部署到linux 服務器上
啟動項目
訪問
curl localhost:8080/cpu
排查
查看占用cpu高的進程
top
如下圖:可看出PID為4060的java進程占用cpu最高,達到了99.5%


查看子進程情況:
top -p 4606 -H

將 子進程id 轉換成16進制
printf "%x \n" 4648
查詢具體出現問題的代碼位置
jstack 4606|grep 1228 -C 30
如下圖:可看出是JvmApplication類的第19行出現問題