Linux 內存佔用分析的幾個方法,你知道幾個?

  1. 引言:

系統內存是硬件系統中必不可少的部分,定時查看系統內存資源運行情況,可以幫助我們及時發現內存資源是否存在異常佔用,確保業務的穩定運行。

例如:定期查看公司的網站服務器內存使用情況,可以確保服務器的資源是否夠用,或者發現服務器內存被佔用異常可以及時解決,避免因內存不夠導致無法訪問網站或訪問速度慢的問題。

因此,對於 Linux 管理員來說,在日常工作中能夠熟練在 Linux 系統下檢查內存的運行狀況就變得尤爲重要!

查看內存的運行狀態並非難事,但是針對不同的情況使用正確的方式查看呢?

一口君整理了幾個 個非常實用的 Linux 內存查看方法

Linux 內存總覽圖

該圖很好的描述了 OS 內存的使用和分配等詳細信息。建議大家配合該圖來一起學習和理解內存的一些概念。

一、free 命令

free 命令可以顯示當前系統未使用的和已使用的內存數目,還可以顯示被內核使用的內存緩衝區。

1. free 命令語法:

free [options]

free 命令選項:

-b # 以Byte爲單位顯示內存使用情況;
-k # 以KB爲單位顯示內存使用情況;
-m # 以MB爲單位顯示內存使用情況;
-g # 以GB爲單位顯示內存使用情況。 
-o # 不顯示緩衝區調節列;
-s<間隔秒數> # 持續觀察內存使用狀況;
-t # 顯示內存總和列;
-V # 顯示版本信息。

2. free 命令實例

free -t    # 以總和的形式顯示內存的使用信息
free -h -s 10 # 週期性的查詢內存使用信息,每10s 執行一次命令

free -h -c 10 #輸出10次
  在版本 v3.2.8,就是輸出一次!需要配合 -s 使用。
  在版本 v3.3.10,不加-s,就默認1秒輸出一次。
free -V #查看版本號

v3.2.8

v3.3.10

下面先解釋一下輸出的內容:

WHQQXA

二、vmstat 指令

vmstat 命令是最常見的 Linux/Unix 監控工具,用於查看系統的內存存儲信息,是一個報告虛擬內存統計信息的小工具,屬於 sysstat 包。

vmstat 命令報告包括:進程、內存、分頁、阻塞 IO、中斷、磁盤、CPU

可以展現給定時間間隔的服務器的狀態值, 包括服務器的 CPU 使用率,內存使用,虛擬內存交換情況, IO 讀寫情況。

這個命令是我查看 Linux/Unix 最喜愛的命令,一個是 Linux/Unix 都支持,二是相比 top,我可以看到整個機器的 CPU, 內存, IO 的使用情況,而不是單單看到各個進程的 CPU 使用率和內存使用率 (使用場景不一樣)。

1. 命令格式:

vmstat -s(參數)

2. 舉例

一般 vmstat 工具的使用是通過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:

 root@local:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0

2 表示每個兩秒採集一次服務器狀態,1 表示只採集一次。

實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束 vmstat 就行了, 例如: 這表示 vmstat 每 2 秒採集數據,按下 ctrl + c 結束程序,這裏採集了 3 次數據我就結束了程序。

qhTxOF

3. 常見問題處理

常見問題及解決方法

  1. 如果 r 經常大於 4,且 id 經常少於 40,表示 cpu 的負荷很重。

  2. 如果 pi,po 長期不等於 0,表示內存不足。

  3. 如果 disk 經常不等於 0,且在 b 中的隊列大於 3,表示 io 性能不好。

當發生以上問題的時候請先調整應用程序對 CPU 的佔用情況. 使得應用程序能夠更有效的使用 CPU. 同時可以考慮增加更多的 CPU.  關於 CPU 的使用情況還可以結合 mpstat,  ps aux top  prstat –a 等等一些相應的命令來綜合考慮關於具體的 CPU 的使用情況, 和那些進程在佔用大量的 CPU 時間. 一般情況下,應用程序的問題會比較大一些. 比如一些 sql 語句不合理等等都會造成這樣的現象.

4. 內存問題現象:

內存的瓶頸是由 scan rate (sr) 來決定的. scan rate 是通過每秒的始終算法來進行頁掃描的. 如果 scan rate(sr) 連續的大於每秒 200 頁則表示可能存在內存缺陷. 同樣的如果 page 項中的 pi 和 po 這兩欄表示每秒頁面的調入的頁數和每秒調出的頁數. 如果該值經常爲非零值, 也有可能存在內存的瓶頸, 當然, 如果個別的時候不爲 0 的話, 屬於正常的頁面調度這個是虛擬內存的主要原理.

解決辦法:

關於內存的使用情況還可以結 ps aux top  prstat –a 等等一些相應的命令來綜合考慮關於具體的內存的使用情況, 和那些進程在佔用大量的內存.

一般情況下,如果內存的佔用率比較高, 但是, CPU 的佔用很低的時候, 可以考慮是有很多的應用程序佔用了內存沒有釋放, 但是, 並沒有佔用 CPU 時間, 可以考慮應用程序, 對於未佔用 CPU 時間和一些後臺的程序, 釋放內存的佔用。

r 表示運行隊列 (就是說多少個進程真的分配到 CPU),我測試的服務器目前 CPU 比較空閒,沒什麼程序在跑,當這個值超過了 CPU 數目,就會出現 CPU 瓶頸了。

這個也和 top 的負載有關係,一般負載超過了 3 就比較高,超過了 5 就高,超過了 10 就不正常了,服務器的狀態很危險。

top 的負載類似每秒的運行隊列。如果運行隊列過大,表示你的 CPU 很繁忙,一般會造成 CPU 使用率很高。

5. 常見性能問題分析

IO/CPU/men 連鎖反應

1.free急劇下降
2.buff和cache被回收下降,但也無濟於事
3.依舊需要使用大量swap交換分區swpd
4.等待進程數,b增多
5.讀寫IO,bi bo增多
6.si so大於0開始從硬盤中讀取
7.cpu等待時間用於 IO等待,wa增加

內存不足

1.開始使用swpd,swpd不爲0
2.si so大於0開始從硬盤中讀取

io 瓶頸

1.讀寫IO,bi bo增多超過2000
2.cpu等待時間用於 IO等待,wa增加 超過20
3.sy 系統調用時間長,IO操作頻繁會導致增加 >30%
4.wa io等待時間長
    iowait% <20%            良好
    iowait% <35%            一般
    iowait% >50%
5.進一步使用iostat觀察

CPU 瓶頸:load,vmstat 中 r 列

    1.反應爲CPU隊列長度
    2.一段時間內,CPU正在處理和等待CPU處理的進程數之和,直接反應了CPU的使用和申請情況。
    3.理想的load average:核數*CPU數*0.7
        CPU個數:grep 'physical id' /proc/cpuinfo | sort -u
        核數:grep 'core id' /proc/cpuinfo | sort -u | wc -l
    4.超過這個值就說明已經是CPU瓶頸了

三、/proc/meminfo

用途:用於從 / proc 文件系統中提取與內存相關的信息。這些文件包含有 系統和內核的內部信息。其實 free 命令中的信息都來自於 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起來不太直觀。

1. 查看方法:

cat /proc/meminfo

2. 實例及信息解釋

peng@ubuntu:~$ cat /proc/meminfo
MemTotal:        2017504 kB //所有可用的內存大小,
物理內存減去預留位和內核使用。系統從加電開始到引導完成,firmware/BIOS要預留一
些內存,內核本身要佔用一些內存,最後剩下可供內核支配的內存就是MemTotal。這個值
在系統運行期間一般是固定不變的,重啓會改變。
MemFree:          511052 kB //表示系統尚未使用的內存。
MemAvailable:     640336 kB //真正的系統可用內存,
系統中有些內存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可
以回收,所以這部分可回收的內存加上MemFree纔是系統可用的內存
Buffers:          114348 kB //用來給塊設備做緩存的內存,(文件系統的 metadata、pages)
Cached:           162264 kB //分配給文件緩衝區的內存,例如vi一個文件,就會將未保存的內容寫到該緩衝區
SwapCached:         3032 kB //被高速緩衝存儲用的交換空間(硬盤的swap)的大小
Active:           555484 kB //經常使用的高速緩衝存儲器頁面文件大小
Inactive:         295984 kB //不經常使用的高速緩衝存儲器文件大小
Active(anon):     381020 kB //活躍的匿名內存
Inactive(anon):   244068 kB //不活躍的匿名內存
Active(file):     174464 kB //活躍的文件使用內存
Inactive(file):    51916 kB //不活躍的文件使用內存
Unevictable:          48 kB //不能被釋放的內存頁
Mlocked:              48 kB //系統調用 mlock 
SwapTotal:        998396 kB //交換空間總內存
SwapFree:         843916 kB //交換空間空閒內存
Dirty:               128 kB //等待被寫回到磁盤的
Writeback:             0 kB //正在被寫回的
AnonPages:        572776 kB //未映射頁的內存/映射到用戶空間的非文件頁表大小
Mapped:           119816 kB //映射文件內存
Shmem:             50212 kB //已經被分配的共享內存
Slab:             113700 kB  //內核數據結構緩存
SReclaimable:      68652 kB //可收回slab內存
SUnreclaim:        45048 kB //不可收回slab內存
KernelStack:        8812 kB //內核消耗的內存
PageTables:        27428 kB //管理內存分頁的索引表的大小
NFS_Unstable:          0 kB //不穩定頁表的大小
Bounce:                0 kB //在低端內存中分配一個臨時buffer作爲跳轉,把位
於高端內存的緩存數據複製到此處消耗的內存
WritebackTmp:          0 kB //FUSE用於臨時寫回緩衝區的內存
CommitLimit:     2007148 kB //系統實際可分配內存
Committed_AS:    3567280 kB //系統當前已分配的內存
VmallocTotal:   34359738367 kB //預留的虛擬內存總量
VmallocUsed:           0 kB //已經被使用的虛擬內存
VmallocChunk:          0 kB //可分配的最大的邏輯連續的虛擬內存
HardwareCorrupted:     0 kB //表示“中毒頁面”中的內存量
即has failed的內存(通常由ECC標記). ECC代表“糾錯碼”. ECC memory能夠糾正小錯誤並檢測較大錯誤;
在具有非ECC內存的典型PC上,內存錯誤未被檢測到.如果使用ECC檢測到無法糾正的錯誤(在內存或緩存中,
具體取決於系統的硬件支持),則Linux內核會將相應的頁面標記爲中毒.
AnonHugePages:         0 kB //匿名大頁
【/proc/meminfo的AnonHugePages==所有進程的/proc/<pid>/smaps中AnonHugePages之和】
ShmemHugePages:        0 kB  //用於共享內存的大頁
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB //連續內存區管理總量
CmaFree:               0 kB //連續內存區管理空閒量
HugePages_Total:       0    //預留HugePages的總個數
HugePages_Free:        0    //池中尚未分配的 HugePages 數量,
真正空閒的頁數等於HugePages_Free - HugePages_Rsvd
HugePages_Rsvd:        0    //表示池中已經被應用程序分配但尚未使用的 HugePages 數量
HugePages_Surp:        0    //這個值得意思是當開始配置了20個大頁,現在修改配置爲16,那麼這個參數就會顯示爲4,一般不修改配置,這個值都是0
Hugepagesize:       2048 kB //大內存頁的size
//指直接映射(direct mapping)的內存大小,從代碼上來看,值記錄管理頁表佔用的內存,就是描述線性映射空間中,有多個空間分別使用了2M/4K/1G頁映射
DirectMap4k:       96128 kB
DirectMap2M:     2000896 kB 
DirectMap1G:           0 kB
  1. 注意這個文件顯示的單位是 kB 而不是 KB,1kB=1000B, 但是實際上應該是 KB,1KB=1024B

  2. 還可以使用命令 less /proc/meminfo 直接讀取該文件。通過使用 less 命令,可以在長長的輸出中向上和向下滾動,找到你需要的內容。

從中我們可以很清晰明瞭的看出內存中的各種指標情況,例如 MemFree 的空閒內存和 SwapFree 中的交換內存。

3. 代碼實例

負責輸出 / proc/meminfo 的源代碼是:

fs/proc/meminfo.c : meminfo_proc_show()
static int meminfo_proc_show(struct seq_file *m, void *v)
{
 struct sysinfo i;
 unsigned long committed;
 long cached;
 long available;
 unsigned long pages[NR_LRU_LISTS];
 int lru;
 
 si_meminfo(&i);
 si_swapinfo(&i);
 committed = percpu_counter_read_positive(&vm_committed_as);
 
 cached = global_node_page_state(NR_FILE_PAGES) -
   total_swapcache_pages() - i.bufferram;
 if (cached < 0)
  cached = 0;
 
 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
  pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
 
 available = si_mem_available();
 
 show_val_kb(m, "MemTotal:       ", i.totalram);
 show_val_kb(m, "MemFree:        ", i.freeram);
 show_val_kb(m, "MemAvailable:   ", available);
 show_val_kb(m, "Buffers:        ", i.bufferram);
 show_val_kb(m, "Cached:         ", cached);
 show_val_kb(m, "SwapCached:     ", total_swapcache_pages());
 show_val_kb(m, "Active:         ", pages[LRU_ACTIVE_ANON] +
        pages[LRU_ACTIVE_FILE]);
 show_val_kb(m, "Inactive:       ", pages[LRU_INACTIVE_ANON] +
        pages[LRU_INACTIVE_FILE]);
 show_val_kb(m, "Active(anon):   ", pages[LRU_ACTIVE_ANON]);
 show_val_kb(m, "Inactive(anon): ", pages[LRU_INACTIVE_ANON]);
 show_val_kb(m, "Active(file):   ", pages[LRU_ACTIVE_FILE]);
 show_val_kb(m, "Inactive(file): ", pages[LRU_INACTIVE_FILE]);
 show_val_kb(m, "Unevictable:    ", pages[LRU_UNEVICTABLE]);
 show_val_kb(m, "Mlocked:        ", global_zone_page_state(NR_MLOCK));
 
#ifdef CONFIG_HIGHMEM
 show_val_kb(m, "HighTotal:      ", i.totalhigh);
 show_val_kb(m, "HighFree:       ", i.freehigh);
 show_val_kb(m, "LowTotal:       ", i.totalram - i.totalhigh);
 show_val_kb(m, "LowFree:        ", i.freeram - i.freehigh);
#endif
 
#ifndef CONFIG_MMU
 show_val_kb(m, "MmapCopy:       ",
      (unsigned long)atomic_long_read(&mmap_pages_allocated));
#endif
 
 show_val_kb(m, "SwapTotal:      ", i.totalswap);
 show_val_kb(m, "SwapFree:       ", i.freeswap);
 show_val_kb(m, "Dirty:          ",
      global_node_page_state(NR_FILE_DIRTY));
 show_val_kb(m, "Writeback:      ",
      global_node_page_state(NR_WRITEBACK));
 show_val_kb(m, "AnonPages:      ",
      global_node_page_state(NR_ANON_MAPPED));
 show_val_kb(m, "Mapped:         ",
      global_node_page_state(NR_FILE_MAPPED));
 show_val_kb(m, "Shmem:          ", i.sharedram);
 show_val_kb(m, "Slab:           ",
      global_node_page_state(NR_SLAB_RECLAIMABLE) +
      global_node_page_state(NR_SLAB_UNRECLAIMABLE));
 
 show_val_kb(m, "SReclaimable:   ",
      global_node_page_state(NR_SLAB_RECLAIMABLE));
 show_val_kb(m, "SUnreclaim:     ",
      global_node_page_state(NR_SLAB_UNRECLAIMABLE));
 seq_printf(m, "KernelStack:    %8lu kB\n",
     global_zone_page_state(NR_KERNEL_STACK_KB));
 show_val_kb(m, "PageTables:     ",
      global_zone_page_state(NR_PAGETABLE));
#ifdef CONFIG_QUICKLIST
 show_val_kb(m, "Quicklists:     ", quicklist_total_size());
#endif
 
 show_val_kb(m, "NFS_Unstable:   ",
      global_node_page_state(NR_UNSTABLE_NFS));
 show_val_kb(m, "Bounce:         ",
      global_zone_page_state(NR_BOUNCE));
 show_val_kb(m, "WritebackTmp:   ",
      global_node_page_state(NR_WRITEBACK_TEMP));
 show_val_kb(m, "CommitLimit:    ", vm_commit_limit());
 show_val_kb(m, "Committed_AS:   ", committed);
 seq_printf(m, "VmallocTotal:   %8lu kB\n",
     (unsigned long)VMALLOC_TOTAL >> 10);
 show_val_kb(m, "VmallocUsed:    ", 0ul);
 show_val_kb(m, "VmallocChunk:   ", 0ul);
 
#ifdef CONFIG_MEMORY_FAILURE
 seq_printf(m, "HardwareCorrupted: %5lu kB\n",
     atomic_long_read(&num_poisoned_pages) << (PAGE_SHIFT - 10));
#endif
 
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 show_val_kb(m, "AnonHugePages:  ",
      global_node_page_state(NR_ANON_THPS) * HPAGE_PMD_NR);
 show_val_kb(m, "ShmemHugePages: ",
      global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR);
 show_val_kb(m, "ShmemPmdMapped: ",
      global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR);
#endif
 
#ifdef CONFIG_CMA
 show_val_kb(m, "CmaTotal:       ", totalcma_pages);
 show_val_kb(m, "CmaFree:        ",
      global_zone_page_state(NR_FREE_CMA_PAGES));
#endif
 
 hugetlb_report_meminfo(m);
 
 arch_report_meminfo(m);
 
 return 0;
}

四、top 指令

用途:用於打印系統中的 CPU 和內存使用情況。輸出結果中,可以很清晰的看出已用和可用內存的資源情況。top 最好的地方之一就是發現可能已經失控的服務的進程 ID 號(PID)。有了這些 PID,你可以對有問題的任務進行故障排除(或 kill)。

語法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

參數說明:

d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的權限,則 top 將會以最高的優先序執行
c : 切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
S : 累積模式,會將己完成或消失的子進程 ( dead child process ) 的 CPU time 累積起來
s : 安全模式,將交談式指令取消, 避免潛在的危機
i : 不顯示任何閒置 (idle) 或無用 (zombie) 的進程
n : 更新的次數,完成後將會退出 top
b : 批次檔模式,搭配 "n" 參數一起使用,可以用來將 top 的結果輸出到檔案內

舉例

第一行,任務隊列信息,同 uptime 命令的執行結果

系統時間:02:19:10 運行時間:up 2:26 min, 當前登錄用戶:1 user 負載均衡 (uptime)  load average: 0.00, 0.06, 0.07 average 後面的三個數分別是 1 分鐘、5 分鐘、15 分鐘的負載情況。load average 數據是每隔 5 秒鐘檢查一次活躍的進程數,然後按特定算法計算出的數值。如果這個數除以邏輯 CPU 的數量,結果高於 5 的時候就表明系統在超負荷運轉了

第二行,Tasks — 任務(進程)

總進程: 229 total, 運行: 1 running, 休眠: 163 sleeping, 停止: 0 stopped, 殭屍進程: 0 zombie

第三行,cpu 狀態信息

0.7%us【user space】— 用戶空間佔用 CPU 的百分比。1.0%sy【sysctl】— 內核空間佔用 CPU 的百分比。0.0%ni【】— 改變過優先級的進程佔用 CPU 的百分比 97.9%id【idolt】— 空閒 CPU 百分比 0.3%wa【wait】— IO 等待佔用 CPU 的百分比 0.0%hi【Hardware IRQ】— 硬中斷佔用 CPU 的百分比 0.0%si【Software Interrupts】— 軟中斷佔用 CPU 的百分比

第四行, 內存狀態

2017504 total,   653616 free,  1154200 used,   209688 buff/cache【緩存的內存量】

第五行,swap 交換分區信息

998396 total,   771068 free,   227328 used.   635608 avail Mem

第七行以下:各進程(任務)的狀態監控

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

常用實例

# top
# top -c
# top -b
# top -S
top -n 2

// 表示更新兩次後終止更新顯示

# top -d 3

// 表示更新週期爲 3 秒

# top -p 139

// 顯示進程號爲 139 的進程信息,CPU、內存佔用率等

top -n 10

五、htop 指令

htop 它類似於 top 命令,但可以讓你在垂直和水平方向上滾動,所以你可以看到系統上運行的所有進程,以及他們完整的命令行。

可以不用輸入進程的 PID 就可以對此進程進行相關的操作 (killing, renicing)。

htop 快照:可以使用快捷鍵

F1,h,?:查看htop使用說明,
F2,s  :設置選項
F3,/  :搜索進程
F4, :過濾器,輸入關鍵字搜索
F5,t  :顯示屬性結構
F6,<,>:選擇排序方式
F7, [,:減少進程的優先級(nice)
F8,] :增加進程的優先級(nice)
F9,k :殺掉選中的進程
F10,q:退出htop
u:顯示所有用戶,並可以選中某一特定用戶的進程
U:取消標記所有的進程

第 1 行 - 第 4 行:顯示 CPU 當前的運行負載,有幾核就有幾行,我的是 1 核

**Mem:**顯示內存的使用情況,3887M 大概是 3.8G,此時的 Mem 不包含 buffers 和 cached 的內存,所以和 free -m 會不同 **Swp:**顯示交換空間的使用情況,交換空間是當內存不夠和其中有一些長期不用的數據時,ubuntu 會把這些暫時放到交換空間中

其他信息可以參考 top 命令說明。

PS:如果你終端沒安裝 htop, 先通過指令來安裝。sudo apt-get update sudo apt install htop

六、查看制定進程的內存

通過 / proc/procid/status 查看進程內存

peng@ubuntu:~$ cat /proc/4398/status
Name: kworker/0:0    //進程名
Umask: 0000
State: I (idle)   //進程的狀態
//R (running)", "(sleeping)", "(disk sleep)", "(stopped)", "T(tracing stop)", "(zombie)", or "(dead)"
Tgid: 4398 //線程組的ID,一個線程一定屬於一個線程組(進程組).
Ngid: 0
Pid: 4398 //進程的ID,更準確的說應該是線程的ID.
PPid: 2  //當前進程的父進程
TracerPid: 0 //跟蹤當前進程的進程ID,如果是0,表示沒有跟蹤
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64 //當前分配的文件描述符,該值不是上限,如果打開文件超過64個文件描述符,將以64進行遞增
Groups: //啓動這個進程的用戶所在的組
NStgid: 4398
NSpid: 4398
NSpgid: 0
NSsid: 0
Threads: 1
SigQ: 0/7640
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffffffffff
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: vulnerable
Cpus_allowed: 00000000,00000000,00000000,00000001
Cpus_allowed_list: 0
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 5
nonvoluntary_ctxt_switches: 0

總結:

確定內存使用情況是 Linux 運維工程師必要的技能,尤其是某個應用程序變得異常和佔用系統內存時。當發生這種情況時,知道有多種工具可以幫助你進行故障排除十分方便的。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/d1RC3I_MvzWcCd2TZMe_6A