CPU 使用率 100% 怎么辦
獨家號 碼上實戰 作者 flyhero原文鏈接
工作中遇到CPU使用率100%,不要慌,一起來找出原因並fix掉它。
記住這里大致流程,當線上突然遇到時,也不必手足無措。
總體流程
找出CPU比較高的進程PID
top
打印該進程下線程的CPU占用比較高的tid
top -Hp {PID}
將該tid進行16進制轉換id
printf "%x\n" {tid}
打印線程的堆棧信息
jstack {PID} |grep {id} -A 100
當然這四步的執行需要時間,但我們可以將這幾步寫成shell腳本來執行。
安裝JDK命令行工具
服務器上安裝的OpenJDK ,是否有常用的命令行工具?
驗證是否安裝
[root@op-system ~]$ jstack -h
Usage:
jstack [-l] <pid>
(to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server)
如果輸出如上內容表明,已經擁有工具,倘若沒有,那么繼續下面。
安裝
- 查看JDK版本
[root@op-system ~]$ java -version
openjdk version "1.8.0_201" OpenJDK Runtime Environment (build 1.8.0_201-b09) OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
- 看openJDK有jstack的yum源
[root@op-system ~]$ yum whatprovides '*/jstack'
1:java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64 : OpenJDK Development Environment 8 with full debug on Repo : @updates Matched from: Filename : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64-debug/bin/jstack
找到和JDK版本對應的yum源。
- 安裝
[root@op-system ~]$ sudo yum install java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64
尋找問題所在
-
查出使用率最高的進程
[root@op-system ~]$ top

發現 123067 這個進程特別消耗CPU。
- 查看進程中線程情況
[root@op-system ~]$ top -p 123067 -H

發現 127510 這個線程特別消耗CPU,那么我們來看看這個線程到底是做什么的。
-
十進制id轉十六進制
[root@op-system ~]$ printf "%x\n" 127510 1eaec
- 使用jstack打印出線程的堆棧信息
[root@op-system ~]$ jstack 123067 |grep 1eaec -A 100

從打印出來的信息中發現了很熟悉的代碼,對,就是這里。
解決問題
那么既然找到了問題,我們就只能通過,數據庫索引、SQL優化、算法優化、快速返回等方法來最這段代碼優化了。
