linux 程序占内存,linux下,一个运行中的程序,究竟占用了多少内存
1. 在linux下,查看一個(gè)運(yùn)行中的程序, 占用了多少內(nèi)存, 通常的命令有php
(1). ps aux:html
其中 ?VSZ(或VSS)列 表示,程序占用了多少虛擬內(nèi)存。linux
RSS列 表示, 程序占用了多少物理內(nèi)存。ios
虛擬內(nèi)存能夠不用考慮,它并不占用實(shí)際物理內(nèi)存。程序員
(2). top 命令也能夠緩存
其中 ?VIRT(或VSS)列 ?表示,程序占用了多少虛擬內(nèi)存。 同 ps aux 中的 VSZ列app
RES列?表示, 程序占用了多少物理內(nèi)存。同 ps aux 中的RSS列ide
2.在linux下, 查看當(dāng)前系統(tǒng)占用了多少內(nèi)存, 通常的命令是 ?free函數(shù)
其中, free就是系統(tǒng)還有多少內(nèi)存可使用。post
但因?yàn)?linux 系統(tǒng)對(duì)內(nèi)存使用有一個(gè)原則, 就是, 內(nèi)存是寶貴的, 能使用多少就使用多少。 因此, linux會(huì)把已經(jīng)調(diào)用過(guò)的包緩存起來(lái),放在內(nèi)存里。
這樣,實(shí)際上,可使用的內(nèi)存,就能夠理解為, free+buffers+cached
3.當(dāng)你了解完這些命令之后, 再去使用ps aux 命令去查看的時(shí)候, 會(huì)發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象。
全部的 ?RSS 列的數(shù)據(jù),加起來(lái), 比物理內(nèi)存的數(shù)要大不少。
好比, 物理內(nèi)存為2G, 而RSS列的數(shù)據(jù)加起來(lái),可能有5個(gè)G之多, 這是怎么回事了?
這是由于RSS列的值騙了咱們。
linux的內(nèi)存機(jī)制是這樣的:
在運(yùn)行一個(gè)程序時(shí), linux會(huì)調(diào)用該程序依賴的連接庫(kù), 如lib.xx.so。?首先看該連接庫(kù)是否被映射進(jìn)內(nèi)存中,若是沒有被映射,則將代碼段與數(shù)據(jù)段映射到內(nèi)存中,不然只是將其加入進(jìn)程的地址空間。
這樣,當(dāng)N個(gè)程序,依賴到lib.xx.so的時(shí)候, 實(shí)際上,內(nèi)存中只有一個(gè)lib.xx.so ,而不是N個(gè)。
而RSS在顯示一個(gè)程序占用的實(shí)際物理內(nèi)存時(shí), 將lib.xx.so也算了進(jìn)來(lái)。
好比, X程序, 自己占用內(nèi)存為5M, lib.xx.so 占用內(nèi)存2M,lib.xx.so被N個(gè)程序共享依賴。 則RSS顯示為,X程序運(yùn)行,占用內(nèi)存為7M。 實(shí)際上, X程序占用了5M空間。 多余的2m被討入到RSS中了。
當(dāng)你在用ps aux顯示內(nèi)存占用狀況時(shí), N個(gè)共享依賴lib.xx.so的N個(gè)程序,都把這2m空間,算在本身的RSS中了, 這樣RSS的sum值,就比實(shí)際物理內(nèi)存多了。
固然, linux的內(nèi)存使用機(jī)制很復(fù)雜, 不是一句兩句能說(shuō)清楚的。這里只是簡(jiǎn)單的說(shuō)明了一下, ps aux中的RSS值, 并不能真實(shí)反映物理內(nèi)存的使用狀況。
4. 若是查看更詳細(xì)的內(nèi)存使用狀況, 可用如下幾種方法, 或者幾種方法結(jié)合使用:
這幾種方法,都須要root帳戶的權(quán)限
(1).?pmap -d $pid
$pid 是正在運(yùn)行的程序的pid
(2). cat /proc/$pid/smaps
smaps的數(shù)據(jù)比較詳細(xì),可簡(jiǎn)單的概括一下,概括的命令以下:
cat /proc/$pid/smaps??| awk '/Size|Rss|Pss|Shared|Private|Referenced|Swap/{val_name=gensub(/([a-zA-Z_]*).*/,"\\1",1,$1); list[val_name]+=$2; }END{for(val in list)print val,list[val];}'
(3). cat /proc/$pid/maps
(4). cat /proc/$pid/statm
輸出解釋
第一列 ?size:任務(wù)虛擬地址空間大小第二列 ?Resident:正在使用的物理內(nèi)存大小第三列 ?Shared:共享頁(yè)數(shù)第四列 ?Trs:程序所擁有的可執(zhí)行虛擬內(nèi)存大小第五列 ?Lrs:被映像倒任務(wù)的虛擬內(nèi)存空間的庫(kù)的大小第六列 ?Drs:程序數(shù)據(jù)段和用戶態(tài)的棧的大小第七列 dt:臟頁(yè)數(shù)量
(5).?vmstat
這個(gè)命令聽說(shuō)也能夠提供一些參考信息,具體還未研究
5.做為phper,嘗試過(guò)使用php的函數(shù)memory_get_usage(), 該函數(shù)也不能獲得php當(dāng)前運(yùn)行的程序,實(shí)際的,真正占用的內(nèi)存數(shù)量。
若是真想獲得,php真正占用的內(nèi)存, 大概只能在, 程序運(yùn)行的開始,執(zhí)行一次memory_get_usage().
在程序運(yùn)行結(jié)束,執(zhí)行一次memory_get_usage()。 將二者的值相減,獲得的值, 應(yīng)該是一個(gè)相對(duì)比較準(zhǔn)確的,內(nèi)存占用數(shù)量了。
這個(gè)方法尚未測(cè)試, 考慮到, 獲得這個(gè)數(shù)量,也沒有實(shí)際意義, 加上平時(shí)又比較忙,懶得試了。
也許php還有一個(gè)方法, 是使用shm_* 系列函數(shù), 這也我也未深刻研究,詳見這篇文章(http://duckweeds.blog.sohu.com/166663796.html)
6.另外還有一些文章能夠參考,以下:
(1)一個(gè)C程序員, 眼中的Linux內(nèi)存使用詳解,寫的比較詳細(xì),比較細(xì)致,也比較專業(yè)。
(6)Capturing Process Memory Usage Under Linux,這篇文章彷佛是對(duì)一個(gè)產(chǎn)品的廣告,但里面對(duì)USS,PSS,RSS 這幾個(gè)概念有詳細(xì)的解釋
(8)?Linux Check Memory Usage,文章對(duì) free, vmstat,top ,gnome-system-monitor等命令有一些介紹
(9)Console Monitoring Tools for SUSE Linux,對(duì)top,free,uptime,pmap,smartctl,iostat,strace等命令有所介紹,而且介紹的比較詳細(xì),目前只是粗略的看了一下,有時(shí)間還要再看看。
(10)Solaris 9 Enhanced pmap,比較詳細(xì)的介紹了pmap的應(yīng)用,不過(guò)是基于Solaris 9的
總結(jié)
以上是生活随笔為你收集整理的linux 程序占内存,linux下,一个运行中的程序,究竟占用了多少内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Kubernetes 部署 Ingres
- 下一篇: fstream下的读写操作