Linux下找出吃內存的方法總結

2021-02-14 Linux就該這麼學


linux下查詢進程佔用的內存方法總結,假設現在有一個「php-cgi」的進程 ,進程id為「25282」。現在想要查詢該進程佔用的內存大小。linux命令行下有很多的工具進行查看,現總結常見的幾種方式。

通過進程的 status

[root@web3_u ~]# cat /proc/25282/status

Name: php-cgi
State: S (sleeping)
Tgid: 25282
Pid: 25282
PPid: 27187
TracerPid: 0
Uid: 99 99 99 99
Gid: 99 99 99 99
Utrace: 0
FDSize: 256
Groups: 99
VmPeak: 496388 kB
VmSize: 438284 kB
VmLck: 0 kB
VmHWM: 125468 kB
VmRSS: 113612 kB
VmData: 92588 kB
VmStk: 100 kB
VmExe: 6736 kB
VmLib: 18760 kB
VmPTE: 528 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/46155
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000184000004
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 68245
nonvoluntary_ctxt_switches: 15751

VmRSS: 113612 kB 表示佔用的物理內存

通過 pmap

[root@web3_u ~]# pmap -x 25282

25282: /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 6736 2692 0 r-x-- php-cgi
0000000000c93000 264 196 120 rw--- php-cgi
0000000000cd5000 60 48 48 rw--- [ anon ]
. . .
00007fd6226bc000 4 4 4 rw--- ld-2.12.so
00007fd6226bd000 4 4 4 rw--- [ anon ]
00007fff84b02000 96 96 96 rw--- [ stack ]
00007fff84bff000 4 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
- - - -
total kB 438284 113612 107960

關鍵信息點

1、進程ID

2、啟動命令「/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf」

3、RSS :佔用的物理內存 113612KB

通過 smaps

[root@web3_u ~]# cat /proc/25282/smaps | grep '^Rss:' \
| awk '{sum +=$2} END{print sum}'
113612

求和得到實際佔用物理內存為 113612

通過 ps 命令

[root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' \
| awk '$1 ~ /25282/'
25282 php-cgi /usr/local/php/bin/php-cgi 0.0 113612 438284 Oct09 nobody 99

awk 過濾 25282 進程號,得到第5列「rsz」的內存大小為「113612」

輸出php-cgi進程佔用的物理內存,並從高到低進行排序

[root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' \
| grep php-cgi | sort -k5nr

輸出結果

23946 php-cgi /usr/local/php/bin/php-cgi 0.0 129540 440000 Oct06 nobody 99
24418 php-cgi /usr/local/php/bin/php-cgi 0.0 129336 437684 Oct06 nobody 99
18973 php-cgi /usr/local/php/bin/php-cgi 0.0 129268 440176 Oct06 nobody 99
17219 php-cgi /usr/local/php/bin/php-cgi 0.0 126588 439840 Oct06 nobody 99
6996 php-cgi /usr/local/php/bin/php-cgi 0.0 124876 438104 Oct09 nobody 99
23850 php-cgi /usr/local/php/bin/php-cgi 0.0 122984 440036 Oct09 nobody 99
28310 php-cgi /usr/local/php/bin/php-cgi 0.0 122920 436456 Oct09 nobody 99

其中rsz為實際內存,上例實現按內存排序,由大到小

TOP 命令輸出的列

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25282 nobody 20 0 428m 110m 93m S 0.0 1.9 0:34.42 php-cgi

輸出列信息

PID 25282

用戶 nobody

虛擬內存 428M

物理內存 110M 110*1024= 112640 「和前面計算出來的值基本一致」

共享內存 93M

進程使用的物理內存和總內存的百分比 1.9 %

PID:進程的ID
USER:進程所有者
PR:進程的優先級別,越小越優先被執行
NInice:值
VIRT:進程佔用的虛擬內存
RES:進程佔用的物理內存
SHR:進程使用的共享內存
S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值為負數
%CPU:進程佔用CPU的使用率
%MEM:進程使用的物理內存和總內存的百分比
TIME+:該進程啟動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。
COMMAND:進程啟動命令名稱

按P

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16036 root 20 0 8902m 8.6g 480 R 100.0 36.6 0:33.15 redis-server
12934 root 20 0 8902m 8.6g 1072 S 5.5 36.6 285:37.81 redis-server
969 root 20 0 0 0 0 D 4.2 0.0 277:14.85 flush-252:16
1304 root 23 3 1689m 50m 3264 S 4.2 0.2 1445:03 xs-searchd
1294 root 20 0 14928 928 584 S 3.5 0.0 635:05.31 xs-indexd
1287 nobody 20 0 12884 772 576 S 2.8 0.0 833:11.42 dnsmasq
1302 root 23 3 1113m 39m 3244 S 0.7 0.2 1437:57 xs-searchd
4444 www 20 0 280m 43m 884 S 0.7 0.2 27:43.92 nginx
1 root 20 0 19232 1160 868 S 0.0 0.0 0:06.75 init

按 P .表示按cpu排序,默認也是按cpu排序

按M

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12934 root 20 0 8902m 8.6g 1072 S 6.0 36.6 285:39.77 redis-server
16036 root 20 0 8902m 8.6g 480 R 100.0 36.6 1:11.42 redis-server
1236 www 20 0 1053m 209m 6556 S 0.0 0.9 4:40.70 php-cgi
1231 www 20 0 1034m 146m 6536 S 0.0 0.6 4:20.82 php-cgi
1184 www 20 0 1043m 119m 6584 S 0.0 0.5 4:21.85 php-cgi

按M 。 表示按佔用內存排序。 第一列 redis伺服器佔用了8.6G的內存 。 這個內存和redis info

[root@img1_u ~]# redis-cli info memory
# Memory
used_memory_human:8.32G

基本相同。

[root@img1_u ~]# top -u www
top - 22:09:01 up 67 days, 14:16, 1 user, load average: 0.61, 0.90, 0.98
Tasks: 283 total, 2 running, 281 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.9%us, 1.0%sy, 0.5%ni, 89.7%id, 4.6%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 24542176k total, 21130060k used, 3412116k free, 1750652k buffers
Swap: 524280k total, 0k used, 524280k free, 4039732k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
681 www 20 0 855m 25m 5796 S 0.0 0.1 0:47.00 php-cgi
1181 www 20 0 887m 57m 6484 S 0.0 0.2 4:41.66 php-cgi
1183 www 20 0 864m 34m 6320 S 0.0 0.1 3:52.39 php-cgi
1184 www 20 0 1043m 119m 6584 S 0.0 0.5 4:21.85 php-cgi
1185 www 20 0 869m 39m 6376 S 0.0 0.2 3:57.84 php-cgi
1186 www 20 0 886m 56m 6244 S 0.0 0.2 3:44.75 php-cgi
1187 www 20 0 926m 66m 6480 S 0.0 0.3 4:16.12 php-cgi
1188 www 20 0 890m 60m 6288 S 0.0 0.3 4:13.35 php-cgi
1189 www 20 0 892m 62m 6408 S 0.0 0.3 4:06.60 php-cgi

-u 指定用戶。 php-cgi佔用的內存在60M左右

按進程消耗內存多少排序的方法

通過 ps 命令

第一種方法

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr

第二種方法

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz

輸出結果

[root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user' | sort -k5nr
23946 php-cgi /usr/local/php/bin/php-cgi 0.0 129540 440000 Oct06 nobody
24418 php-cgi /usr/local/php/bin/php-cgi 0.0 129336 437684 Oct06 nobody
18973 php-cgi /usr/local/php/bin/php-cgi 0.0 129268 440176 Oct06 nobody
17219 php-cgi /usr/local/php/bin/php-cgi 0.0 126588 439840 Oct06 nobody
6996 php-cgi /usr/local/php/bin/php-cgi 0.0 125056 438104 Oct09 nobody
23850 php-cgi /usr/local/php/bin/php-cgi 0.0 122984 440036 Oct09 nobody

參數解析:

-e 顯示所有進程

-o 定製顯示信息

pid 進程ID

comm 進程名

args 啟動命令

pcpu 佔用CPU 百分比

rsz 佔用物理內存大小

vsz 佔用虛擬內存大小

stime 進程啟動時間

user 啟動用戶

以第一行為例

進程ID 23946
進程名 php-cgi
啟動命令 /usr/local/php/bin/php-cgi
佔用CPU 0
佔用物理內存 129540
佔用虛擬內存 440000
啟動時間 Oct06
啟動用戶 nobody

通過 top 命令

top命令默認是以CPU排序輸出的,按字母「M」,可以按內存佔用大小進行排序顯示

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23946 nobody 20 0 429m 126m 107m S 0.0 2.2 1:15.01 php-cgi
24418 nobody 20 0 427m 126m 109m S 0.0 2.2 1:19.56 php-cgi
18973 nobody 20 0 429m 126m 107m S 0.0 2.2 1:20.18 php-cgi
17219 nobody 20 0 429m 123m 104m S 0.0 2.1 1:23.60 php-cgi
6996 nobody 20 0 427m 122m 105m S 0.0 2.1 1:05.27 php-cgi
23850 nobody 20 0 429m 120m 101m S 0.0 2.1 1:02.43 php-cgi

輸出參數介紹

PID:進程的ID

USER:進程所有者

VIRT:進程佔用的虛擬內存

RES:進程佔用的物理內存

SHR:進程使用的共享內存

S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值為負數

%CPU:進程佔用CPU的使用率

%MEM:進程使用的物理內存和總內存的百分比

TIME+:該進程啟動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。

通過比較進程ID 「23946」,top 命令和 ps 命令輸出的結果基本保持一致

讓您學習到的每一節課都有所收穫

《Linux就該這麼學》是一本由資深運維專家劉遄老師及國內多名紅帽架構師(RHCA)基於最新RHEL7系統共同編寫的高質量Linux技術自學教程,極其適合用於Linux技術入門教程或講課輔助教材。榮獲雙11、雙12購物狂歡節IT品類書籍銷量冠軍,2017年、2018年國內讀者增速最快的技術書籍,您可以在京東、噹噹、亞馬遜及天貓搜索書名後購買,亦可加劉遄老師微信交流學習(手指按住下圖3秒鐘即可自動掃描)~

劉遄老師QQ:5604215

☀ Linux技術交流群:560843新群,火熱加群中……

☀ 官方站點:www.linuxprobe.com

☀ 書籍在線學習(電腦在線閱讀效果更佳

http://www.linuxprobe.com/chapter-00.html

《Linux就該這麼學》是一本基於最新Linux系統編寫,面向零基礎讀者的技術書籍。從Linux基礎知識講起,然後漸進式地提高內容難度,詳細講解Linux系統中各種服務的工作原理和配置方式,以匹配真實生產環境對運維人員的要求,突顯內容的實用性。想要學習Linux系統的讀者可以點擊"閱讀原文"按鈕了解這本書,同時這本書也適合專業的運維人員閱讀,作為一本非常有參考價值的工具書!

相關焦點

  • 嵌入式Linux內存管理的一些知識點總結
    這個內存管理的知識點還真的需要我們專門的去理解一下,今天大家一起來學習學習嵌入式Linux內存管理的知識。1.不涉及linux內核的彙編知識,僅C語言層面解析1.回答:彙編主要處理的是寄存器地址(包括內容)的計算,進行一部分的地址轉換工作(當然,它是重要的);C語言處理了極大部分的系統內存管理工作。
  • 【開源工具】推薦一款Linux下內存檢測工具:valgrind
    你的工作越接近系統,你就需要面對越多的內存問題。有時這些問題非常瑣碎, 常見的內存問題主要有下面幾種:內存方面的問題定位一直是個老大難,對於自己寫的demo來說,簡單去檢查代碼中malloc/new和free/delete的匹配對數就基本能定位到問題,但是對於數以萬甚至十萬行的工程時,僅靠肉眼檢查來定位問題那就非常困難了。所以我們需要利用工具幫助我們找出問題所在。
  • Linux如何調試內存洩漏
    內存洩漏並非指內存在物理上的消失,而是應用程式分配某段內存後,由於設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。我們平時開發過程中不可避免的會遇到內存洩漏問題,你是如何排查的呢?估計你是使用下面這幾個工具吧?
  • linux系統下free命令內存計算邏輯
    本篇文章介紹下linux下free命令展示的內存相關計算邏輯。
  • Linux內存、Swap、Cache、Buffer
    在Linux系統下,我們一般不需要去釋放內存,因為系統已經將內存管理的很好,但是凡事也有例外。    used:已經使用的內存大小(這裡面包含cached和buffers和shared部分)。  free:空閒的內存大小。  shared:進程間共享內存(一般不會用,可以忽略)。  buffers:內存中寫完的東西緩存起來,這樣快速響應請求,後面數據再定期刷到磁碟上。
  • Linux內核中的內存管理
    由於vmalloc分配得到的內存在虛擬地址和物理地址之間不存在線性關係,所以vmalloc可以從HIGH_MEMORY處分配page frame,而不局限於896M以下。事實上,vmalloc優先考慮HIGH_MEMORY。這裡順便說下,ioremap所得到的虛擬地址也佔用HIGH_MEMORY。一般情況下,調用vmalloc能夠分配到的內存空間可以遠大於一次kmalloc所能得到的。
  • 在linux下使用noatime提升文件系統性能的方法
    在linux下使用noatime提升文件系統性能的方法 linux系統功能強大,但是目前大多數用戶都是用的是windows系統,對於linux系統來說很多功能用戶還很陌生,本文介紹了在linux下如何使用noatime提升文件系統性能的方法。
  • 10 張圖解再談 Linux 物理內存和虛擬內存
    釋放的時候會檢查,釋放的這幾個頁框前後的頁框是否空閒,能否組成下一級長度的塊。按字節為單位虛擬內存,一般用於分配小塊內存,釋放內存對應於 kfree ,可以分配連續的物理內存。函數原型在 <linux/kmalloc.h> 中聲明,一般情況下在驅動程序中都是調用 kmalloc() 來給數據結構分配內存 。還記得前面說的 slab 嗎?
  • Linux平臺中調試C/C++內存洩漏方法 (騰訊和MTK面試的時候問到的)
    本文將從靜態分析和動態檢測兩個角度介紹在 Linux 環境進行內存洩漏檢測的方法,並重點介紹靜態分析工具 BEAM、動態監測工具 Valgrind 和 rational purify 的使用方法。相信通過本文的介紹,能給大家對處理其它產品或項目內存洩漏相關的問題時提供借鑑。從 歷史上看,來自計算機應急響應小組和供應商的許多最嚴重的安全公告都是由簡單的內存錯誤造成的。
  • 郭健:Linux內存管理系統參數配置之OOM(內存耗盡)
    按照慣例,最後一章是參考文獻,本文的參考文獻都是來自linux內核的Documentation目錄,該目錄下有大量的文檔可以參考,每一篇都值得細細品味。二、什麼是OOMOOM就是out of memory的縮寫,雖然linux kernel有很多的內存管理技巧(從cache中回收、swap out等)來滿足各種應用空間的vm內存需求,但是,當你的系統配置不合理,讓一匹小馬拉大車的時候,linux kernel會運行非常緩慢並且在某個時間點分配page frame的時候遇到內存耗盡、無法分配的狀況
  • Linux下軟體安裝方法
    環境、相關軟體屬性,這個步驟的相關信息應該要參考一下該目錄下的INSTALL或README相關的文件。二、Rpm軟體包管理:Rpm是centos下的軟體管理機制,那麼rpm軟體安裝方式有什麼特點呢?1、先將srpm編譯成為rpm文件2、然後將編譯完成的rpm文件安裝到linux系統當中。rpm文件一般格式:如Rp-pppoe-3.1-5.i386.rpmRp-pppoe為軟體名稱,3.1為版本信息(3為主版本,在主版本的架構下改動部分原始碼而釋出的新版本就是次版本,就是1了),5為發布版本的次數,i386為操作硬體平臺。
  • android內存優化總結
    ※1、追查內存的方法使用lintlint會提醒你很多使用不得當的地方,主要會集中再這麼幾個地方:(1)handler等長周期匿名內部類的使用,具體原因下文表(2)數據結構的優化,hashmap向稀疏數組的優化(3)未使用的圖片資源當然lint
  • 每個程式設計師都該了解一點 Linux 內存管理知識
    在內存極度緊張的時候, sshd 這種不怎麼佔內存的進程也無法倖免。覆巢之下,焉有完卵。OOM Killer 的全稱叫 Out Of Memory Killer,今天簡單給大家介紹下,它是 linux 內核的內存保護機制。當應用程式大量請求內存導致內存不足的時候,通常會觸發 OOM Killer,OOM Killer 會根據相對簡單粗暴的算法殺掉某個進程以解燃眉之急。
  • Linux內存初始化(上)
    有了armv8架構訪問內存的理解,我們來看下linux在內存這塊的初始化就更容易理解了。創建啟動頁表:在彙編代碼階段的head.S文件中,負責創建映射關係的函數是create_page_tables。彙編結束後的內存映射關係如下圖所示:
  • 為何Cortex-M處理器運行不了linux
    圖1 ARMv7下的Cortex系列● 款式A:高性能的處理器級平臺,性能比肩計算機。● 款式R:定位應用於高端嵌入式系統,高可靠及高時效性。● 款式M:用於深度嵌入、定製的嵌入式系統。值得注意的是,Cortex-M下的處理器沒有內存管理單元MMU。
  • 17 種查看 Linux 物理內存的方法 | Linux 中國
    大多數系統管理員在遇到性能問題時會檢查 CPU 和內存利用率。Linux 中有許多實用程序可以用於檢查物理內存。這些命令有助於我們檢查系統中存在的物理內存,還允許用戶檢查各種方面的內存利用率。我們大多數人只知道很少的命令,在本文中我們試圖包含所有可能的命令。你可能會想,為什麼我想知道所有這些命令,而不是知道一些特定的和例行的命令呢。
  • Linux內存、Swap、Cache、Buffer詳解(三)
    咱接著Linux內存、Swap、Cache、Buffer詳解(二)聊,前面提到Linux 內核會在內存將要耗盡時觸發內存自動回收工作。
  • 別再說你不懂 Linux 內存管理了
    你也可以在linux下用size 命令查看編譯後程序的各個內存區域大小:[lemon ~]# size /usr/local/永久內存映射區Persistent Kernel Mapping Region 該區域可訪問高端內存。訪問方法是使用 alloc_page (_GFP_HIGHMEM) 分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。
  • 系統內存/進程內存知識掃盲
    Linux的內存管理和相關概念要比Windows複雜一些,而且還有一些區別,有悖於平時的理解,而做性能測試的同學都知道,很多時候性能測試的伺服器都是linux
  • Linux下如何掛載新磁碟:mount
    前言在linux系統伺服器上插了一個U盤,結果系統顯示不出來,是什麼原因導致了系統不能識別U盤呢?經過一番搜索,發現新的硬體設備插在linux系統上時,如果不能正常顯示,則需要通過掛載讓U盤顯示出來,這裡就用到了我們今天要介紹的命令:mount。