這些排查內(nèi)存問題的命令,你用過多少?
我相信大家都遇到過內(nèi)存占用率過高的情況,在排查過程中,我們會(huì)用到一些命令或工具,下面來看下這些你都用過嗎?
top 命令
首先比較常用的就是 top 命令,是性能監(jiān)控的常用命令,該命令可以實(shí)時(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況。

在這里簡(jiǎn)單說下每行的意義:
第一行中 load average 為最近 1 分鐘、5 分鐘、15 分鐘的負(fù)載情況。
第二行的 Tasks 為進(jìn)程的情況,如上圖所示就是系統(tǒng)目前有 126 個(gè)進(jìn)程,其中正在運(yùn)行(running)的進(jìn)程有 1 個(gè),有 125 個(gè)睡眠(sleeping)進(jìn)程,處于暫停(stopped)和僵尸(zombie)進(jìn)程沒有。
第三行為 CPU 狀態(tài)信息,其中幾個(gè)屬性的意義如下:
| 參數(shù) | 含義 |
|---|---|
| us | 用戶空間占用CPU的百分比 |
| sy | 內(nèi)核空間占用CPU的百分比 |
| ni | 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級(jí)的進(jìn)程占用CPU百分比 |
| id | 空閑CPU百分比 |
| wa | 等待輸入輸出的CPU時(shí)間百分比 |
| hi | 硬中斷(Hardware IRQ)占用CPU的百分比 |
| si | 軟中斷(Software Interrupts)占用CPU的百分比 |
| st | 用于有虛擬cpu的情況,用來指示被虛擬機(jī)偷掉的cpu時(shí)間 |
第四、五行為內(nèi)存信息,其參數(shù)含義如下:
| 參數(shù) | 含義 |
|---|---|
| KiB Mem:total | 物理內(nèi)存總量 |
| KiB Mem:free | 空閑內(nèi)存總量 |
| KiB Mem:used | 使用的物理內(nèi)存總量 |
| KiB Mem:buff/cache | 用作內(nèi)核緩存的內(nèi)存量 |
| KiB Swap:total | 交換區(qū)總量 |
| KiB Swap:free | 空閑交換區(qū)總量 |
| KiB Swap:used | 使用的交換區(qū)總量 |
| KiB Swap:avail Mem | 可用于進(jìn)程下一次分配的物理內(nèi)存數(shù)量 |
還可以通過 top -Hp pid 查看具體線程使用系統(tǒng)資源情況:

vmstat 命令
vmstat 命令可以展現(xiàn)給定時(shí)間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的CPU使用率、內(nèi)存使用、虛擬內(nèi)存交換情況、IO讀寫情況。
比如執(zhí)行 vmstat 2 3 命令,其中第一個(gè)參數(shù)是采樣的時(shí)間間隔數(shù)(單位為秒),第二個(gè)參數(shù)為采樣的次數(shù)。

下面來介紹下每個(gè)參數(shù)到含義:
procs 主要是進(jìn)程信息,有以下兩個(gè)字段:
r:等待運(yùn)行到進(jìn)程數(shù) b:處于非中斷睡眠狀態(tài)的進(jìn)程數(shù)
memory 主要是內(nèi)存信息,有以下四個(gè)字段:
swpd:虛擬內(nèi)存使用情況 free:空閑的內(nèi)存 buff:用來作為緩沖的內(nèi)存數(shù) cache:緩存的內(nèi)存容量
swap主要是交換分區(qū)信息,有下面兩個(gè)字段:
si:從磁盤交換到內(nèi)存的交換頁數(shù)量 so:從內(nèi)存交換到磁盤的交換頁數(shù)量
io 主要是磁盤讀/寫信息,有以下兩個(gè)字段:
bi:發(fā)送到塊設(shè)備的塊數(shù) bo:從塊設(shè)備接收到的塊數(shù)
system 為系統(tǒng)信息,有如下字段:
in:每秒中斷數(shù) cs:每秒上下文切換次數(shù)
cpu 為 CPU 信息,主要有如下字段:
us:用戶 CPU 使用時(shí)間 sy:內(nèi)核 CPU 系統(tǒng)使用時(shí)間 id:空閑時(shí)間 wa:等待 I/O 時(shí)間 st:運(yùn)行虛擬機(jī)竊取的時(shí)間
pidstat 命令
pidstat 是一個(gè)進(jìn)程性能分析工具,用來實(shí)時(shí)查看進(jìn)程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)。
如果對(duì)命令不熟悉,可以使用 pidstat -help 來查看。

下面對(duì)命令中的 options 參數(shù)進(jìn)行簡(jiǎn)單介紹:
-d:顯示各個(gè)進(jìn)程的 I/O 使用情況 -r:顯示各個(gè)進(jìn)程的內(nèi)存使用情況 -u:默認(rèn)的參數(shù),顯示各個(gè)進(jìn)程的 cpu 使用情況 -w:顯示每個(gè)進(jìn)程的上下文切換情況 -p:指定進(jìn)程號(hào) -t:顯示進(jìn)程中線程的統(tǒng)計(jì)信息
比如使用 pidstat -p 3286779 -r 2 3 命令就可以查看進(jìn)程的內(nèi)存使用情況,其中 -p 后面為進(jìn)程 ID,-r 表示查看內(nèi)存使用情況,2 為每 2 秒采樣一次,3 為采樣次數(shù)。

下面對(duì)圖中的參數(shù)做下介紹:
minflt/s:任務(wù)每秒發(fā)生的次要錯(cuò)誤,不需要從磁盤中加載頁 majflt/s:任務(wù)每秒發(fā)生的主要錯(cuò)誤,需要從磁盤中加載頁 VSZ:虛擬地址大小,虛擬內(nèi)存使用 KB RSS:常駐集合大小,非交換區(qū)內(nèi)存使用 KB %MEM:進(jìn)程使用內(nèi)存的百分比 Command:拉起進(jìn)程對(duì)應(yīng)的命令
使用 pidstat -p 3286779 -d 2 3 可以查看進(jìn)程 IO 情況,結(jié)果如下圖所示:

這些字段的含義如下所示:
| 參數(shù) | 含義 |
|---|---|
| kB_rd/s | 每秒進(jìn)程從磁盤讀取的數(shù)據(jù)量(以kB為單位) |
| kB_wr/s | 每秒進(jìn)程向磁盤寫的數(shù)據(jù)量(以kB為單位) |
| kB_ccwr/s | 每秒進(jìn)程向磁盤寫入時(shí)被取消的數(shù)據(jù)量(以kB為單位) |
還有其他的參數(shù)大家可以自己摸索下。
除了通過上述的 Linux 命令來查看服務(wù)的內(nèi)存使用情況外,還有很多常用的 JDK 命令來查看 JVM 的內(nèi)存分配和使用情況,感興趣的可以閱讀下這篇文章:不可不知的 7 個(gè) JDK 命令
總結(jié)
本文主要對(duì)排查內(nèi)存問題中常用的 Linux 命令 top、vmstat、pidstat 進(jìn)行了簡(jiǎn)單講解,大家可以自己在本機(jī)進(jìn)行實(shí)踐。
了解這些命令后會(huì)在 CPU、內(nèi)存占用過高問題的排查、程序性能調(diào)優(yōu)上會(huì)有很大的幫助。
最好的關(guān)系就是互相成就,大家的在看、轉(zhuǎn)發(fā)連就是我創(chuàng)作的最大動(dòng)力。
完
? ? ? ?
???