線上cpu飆高排查之常用命令

平均負(fù)載

什么是平均負(fù)載?
是指單位時間內(nèi)系統(tǒng)處于可運(yùn)行狀態(tài)(使用cpu或者等待cpu)或者不可中斷狀態(tài)的平均進(jìn)程數(shù)

uptime命令

查看cpu的平均負(fù)載

[lciptv@ipcqa-02 ~]$ uptime
 23:11:02 up 15 days, 13:31,  3 users,  load average: 0.00, 0.00, 0.00
含義
23:11:02 系統(tǒng)時間
up 15 days, 13:31 系統(tǒng)運(yùn)行時間
3 user 用戶數(shù)
load average: 0.00, 0.00, 0.0 系統(tǒng)過去1分鐘,5分鐘,15分鐘的平均負(fù)載

top交互命令

命令 含義
N 按PID由高到低排列
M 根據(jù)內(nèi)存資源使用大小進(jìn)行排序
P 根據(jù)CPU資源使用大小進(jìn)行排序
c 顯示完整的進(jìn)程信息
1(數(shù)字) 顯示每個邏輯CPU的詳細(xì)情況

cpu狀態(tài)信息:

top命令頂部.jpg
含義
us 用戶態(tài)cpu使用的占比(沒有通過 nice 調(diào)度)
sy 內(nèi)核態(tài)cpu使用的占比
ni 改變過優(yōu)先級的進(jìn)程占用CPU的百分比,表示用戶進(jìn)程中,通過 CPU 調(diào)度(nice)過的使用時間
id 空閑cpu占比
wa IO等待占用CPU的百分比
hi 硬中斷(Hardware IRQ)占用CPU的百分比
si 軟中斷(Software Interrupts)占用CPU的百分比

Cpu(s)與%CPU區(qū)別:

Cpu(s): us: 在一定的時間間隔內(nèi),用戶空間占用CPU時間百分比,是多核心cpu的一個平均值。
%CPU:上次更新到現(xiàn)在的CPU時間占用百分比,多線程情況下,如果是多核,占比可能大于100%

內(nèi)存信息:

  • free +buff/cache = 可用內(nèi)存
  • buffer:寫磁盤先將數(shù)據(jù)保存在磁盤緩沖區(qū)(buffer),然后寫入磁盤
  • cache:將磁盤數(shù)據(jù)暫存在磁盤緩沖區(qū)(cache),供后續(xù)程序使用
  • avail Mem:可以分配和使用的內(nèi)存量,而不會導(dǎo)致更多的交換
  • swap used:swap交換分區(qū)的used,如果這個數(shù)值在不斷的變化,說明內(nèi)核在不斷進(jìn)行內(nèi)存和swap的數(shù)據(jù)交換,這是真正的內(nèi)存不夠用了

釋放內(nèi)存:

  • 管理內(nèi)存的三種方式:

    0:是系統(tǒng)默認(rèn)值,默認(rèn)情況下表示不釋放內(nèi)存,由操作系統(tǒng)自動管理  
    1:釋放頁緩存 
    2:釋放dentries和inodes
    3:釋放所有緩存

  • 手動釋放緩沖區(qū)的內(nèi)存到free

(1)手動執(zhí)行sync命令(描述:sync 命令運(yùn)行 sync 子例程。如果必須停止系統(tǒng),則運(yùn)行sync 命令以確保文件系統(tǒng)的完整性。sync 命令將所有未寫的系統(tǒng)緩沖區(qū)寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件)
(2)釋放 echo 3 > /proc/sys/vm/drop_caches 
(3)如果現(xiàn)在想讓操作系統(tǒng)重新分配內(nèi)存,那么設(shè)置drop_caches的值為0即可 echo 0 > /proc/sys/vm/drop_caches

  • 操作系統(tǒng)釋放緩沖區(qū)內(nèi)存到free
top命令中部.jpg

PID — 進(jìn)程id
USER — 進(jìn)程所有者
PR — 進(jìn)程優(yōu)先級
NI — nice值。負(fù)值表示高優(yōu)先級,正值表示低優(yōu)先級
VIRT — 進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES
RES — 進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA
SHR — 共享內(nèi)存大小,單位kb
S — 進(jìn)程狀態(tài)。D=不可中斷的睡眠狀態(tài) R=運(yùn)行 S=睡眠 T=跟蹤/停止 Z=僵尸進(jìn)程
%CPU — 上次更新到現(xiàn)在的CPU時間占用百分比
%MEM — 進(jìn)程使用的物理內(nèi)存百分比
TIME+ — 進(jìn)程使用的CPU時間總計(jì),單位1/100秒
COMMAND — 進(jìn)程名稱(命令名/命令行)

cpu上下文切換

什么是cpu上下文切換?
頻繁的上下文切換,會將CPU都消耗在CPU上下文的保存和恢復(fù)上,導(dǎo)致任務(wù)運(yùn)行時間變短,影響系統(tǒng)性能。

vmstat命令

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0   3084 472340   3352 12038260    0    0     4     2    9    3  0  0 100  0  0
含義
in 每秒中斷的次數(shù)
cs 每秒上下文切換的次數(shù)

jstack命令

jstack命令工具可以得到線程堆棧信息,根據(jù)這些線程堆棧信息,我們可以去檢查Java程序出現(xiàn)的問題,如檢測死鎖,并輸出死鎖的信息的排查

1、打印進(jìn)程下面的線程列表

ps -mp pid(進(jìn)程id) -o THREAD,tid(線程id),time

[lciptv@ipcqa-02 ~]$ ps -mp 126242 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM     TID     TIME
lciptv    0.1   -    - -         -      -       - 00:05:05
lciptv    0.0  19    - -         -      -  126242 00:00:00
lciptv    0.0  19    - -         -      -  126243 00:00:03

2、將需要的線程ID轉(zhuǎn)換為16進(jìn)制格式

printf "%x\n" tid(線程id)

[lciptv@ipcqa-02 ~]$ printf "%x\n" 126242
1ed22

3、打印線程的堆棧信息

jstack pid(進(jìn)程id) |grep tid -A 100

jstack pid |grep tid -A 100

ps命令

  • aux 關(guān)注線程本身a:顯示一個終端所有的進(jìn)程u:顯示進(jìn)程的歸屬用戶及內(nèi)存使用情況x:顯示沒有關(guān)聯(lián)控制終端的進(jìn)程

  • axjf 關(guān)注線程之間的關(guān)系j:顯示進(jìn)程歸屬的進(jìn)程組id、會話id、父進(jìn)程idf:以ascii的形式顯示出進(jìn)程的層次關(guān)系

  • ef

    e:顯示所有進(jìn)程

    -f : 全格式

[lciptv@ipcqa-04 ~] $ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 191204  3592 ?        Ss   6月27   0:40 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    6月27   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   6月27   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    6月27   0:02 [ksoftirqd/0]
  • USER:進(jìn)程是哪個用戶產(chǎn)生的

  • PID:進(jìn)程的身份證號碼

  • %CPU:指進(jìn)程對CPU的占用率

  • %MEM:進(jìn)程占用內(nèi)存的百分比

  • VSZ:進(jìn)程使用虛擬內(nèi)存的大小

  • RSS:進(jìn)程使用物理內(nèi)存的大小

  • TTY:進(jìn)程關(guān)聯(lián)的終端

  • STAT:進(jìn)程當(dāng)前狀態(tài)

    -D:不可被喚醒的睡眠狀態(tài),通常用于I/O情況
    -R:該線程正在運(yùn)行
    -S:該線程處于睡眠狀態(tài),可被喚醒
    -T:停止?fàn)顟B(tài),可能在后臺暫?;蛘哌M(jìn)程處于出錯狀態(tài)
    -X:死掉的進(jìn)程
    -Z:僵尸狀態(tài)
    -N:低優(yōu)先級
    -l:多線程
    -+:位于后臺
    
  • START:進(jìn)程的啟動時間

  • TIME:進(jìn)程運(yùn)行的時間

  • COMMAND:當(dāng)前進(jìn)程執(zhí)行的是哪個程序

[lciptv@ipcqa-04 ~] $ ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     4     0     0 ?           -1 S<       0   0:00  \_ [kworker/0:0H]

PPID:當(dāng)前進(jìn)程父進(jìn)程的idPID:當(dāng)前進(jìn)程的idPGID:當(dāng)前進(jìn)程所在的進(jìn)程組的IDSID:進(jìn)程所在的會話的IDTTY:進(jìn)程所關(guān)聯(lián)的終端TPGID:判斷進(jìn)程是否為守護(hù)進(jìn)程(-1則為守護(hù)進(jìn)程)STAT:進(jìn)程當(dāng)前狀態(tài)UID:用戶ID,記錄進(jìn)程是哪個用戶啟動的TIME:進(jìn)程運(yùn)行的時間COMMAND:記錄進(jìn)程之間的層次關(guān)系(和上邊不同)

ps -ef | grep java 命令詳解

[lciptv@ipcqa-04 ~] $ ps -ef | grep java
lciptv    2948     1  0 6月27 ?        00:20:40 /home/lciptv/app/jdk8/bin/java -classpath . -Dtarget=cqcu_serviceauth-service -Dspring.profiles.active=dev -jar iptv.serviceauth-4.0.0.BUILD-SNAPSHOT.jar

UID :程序被該 UID 所擁有
PID :就是這個程序的 ID
PPID :則是其上級父程序的ID
C :CPU使用的資源百分比
STIME :系統(tǒng)啟動時間
TTY :登入者的終端機(jī)位置
TIME :使用掉的CPU時間
CMD :所下達(dá)的是什么指令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容