真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

云服務(wù)器:使用top,ps等命令查看進(jìn)程的內(nèi)存使用情況

在linux下,使用top,ps等命令查看進(jìn)程的內(nèi)存使用情況時(shí),經(jīng)??吹絍IRT,RES,SHR等,他們都代表什么意思呢?不同的大小對(duì)進(jìn)程有什么影響呢?這篇文章將來(lái)聊一聊這個(gè)問(wèn)題。閱讀本篇前建議先閱讀Linux內(nèi)存管理,了解一些Linux下內(nèi)存的基本概念,如什么是anonymous和file backed映射等。

創(chuàng)新互聯(lián)專(zhuān)注于當(dāng)涂網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供當(dāng)涂營(yíng)銷(xiāo)型網(wǎng)站建設(shè),當(dāng)涂網(wǎng)站制作、當(dāng)涂網(wǎng)頁(yè)設(shè)計(jì)、當(dāng)涂網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造當(dāng)涂網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供當(dāng)涂網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

查看進(jìn)程所使用的內(nèi)存

在進(jìn)程的眼里,所有的內(nèi)存都是虛擬內(nèi)存,但是這些虛擬內(nèi)存所對(duì)應(yīng)的物理內(nèi)存是多少呢?正如我們?cè)贚inux內(nèi)存管理中所介紹的那樣,并不是每塊虛擬內(nèi)存都有對(duì)應(yīng)的物理內(nèi)存,可能對(duì)應(yīng)的數(shù)據(jù)在磁盤(pán)上的一個(gè)文件中,或者交換空間上的一塊區(qū)域里。一個(gè)進(jìn)程真正的物理內(nèi)存使用情況只有內(nèi)核知道,我們只能通過(guò)內(nèi)核開(kāi)放的一些接口來(lái)獲取這些統(tǒng)計(jì)數(shù)據(jù)。

top

先看看top的輸出(top用到的數(shù)據(jù)來(lái)自于/proc/[pid]/statm),這里只是摘錄了幾條數(shù)據(jù):

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

RES:系統(tǒng)為虛擬內(nèi)存分配的物理內(nèi)存大小,包括file backed和anonymous內(nèi)存,其中anonymous包含了進(jìn)程自己分配和使用的內(nèi)存,以及和別的進(jìn)程通過(guò)mmap共享的內(nèi)存;而file backed的內(nèi)存就是指加載可執(zhí)行文件和動(dòng)態(tài)庫(kù)所占的內(nèi)存,以及通過(guò)private方式調(diào)用mmap映射文件所使用的內(nèi)存(當(dāng)在內(nèi)存中修改了這部分?jǐn)?shù)據(jù)且沒(méi)有寫(xiě)回文件,那么這部分內(nèi)存就變成了anonymous),這部分內(nèi)存也可能跟別的進(jìn)程共享。

SHR:RES的一部分,表示和別的進(jìn)程共享的內(nèi)存,包括通過(guò)mmap共享的內(nèi)存和file backed的內(nèi)存。當(dāng)通過(guò)prive方式調(diào)用mmap映射一個(gè)文件時(shí),如果沒(méi)有修改文件的內(nèi)容,那么那部分內(nèi)容就是SHR的,一旦修改了文件內(nèi)容且沒(méi)有寫(xiě)回文件,那么這部分內(nèi)存就是anonymous且非SHR的。

%MEM:等于RES/total*100%,這里total指總的物理內(nèi)存大小。

注意:由于SHR可能會(huì)被多個(gè)進(jìn)程所共享,所以系統(tǒng)中所有進(jìn)程的RES加起來(lái)可能會(huì)超過(guò)總的物理內(nèi)存數(shù)量,由于同樣的原因,所有進(jìn)程的%MEM總和可能超過(guò)100%。

從上面的分析可以看出,VIRT的參考意義不大,它只能反應(yīng)出程序的大小,而RES也不能完全的代表一個(gè)進(jìn)程真正占用的內(nèi)存空間,因?yàn)樗锩孢€包含了SHR的部分,比如三個(gè)bash進(jìn)程共享了一個(gè)libc動(dòng)態(tài)庫(kù),那么libc所占用的內(nèi)存算誰(shuí)的呢?三個(gè)進(jìn)程平分嗎?如果啟動(dòng)一個(gè)bash占用了4M的RES,其中3M是libc占用的,由于三個(gè)進(jìn)程都共享那3M的libc,那么啟動(dòng)3個(gè)bash實(shí)際占用的內(nèi)存將是3*(4-3)+3=6M,但是如果單純的按照RES來(lái)算的話(huà),三個(gè)進(jìn)程就用了12M的空間。所以理解RES和SHR這兩個(gè)數(shù)據(jù)的含義對(duì)我們?cè)谠u(píng)估一臺(tái)服務(wù)器能跑多少個(gè)進(jìn)程時(shí)尤其重要,不要一看到apache的進(jìn)程占用了20M,就認(rèn)為系統(tǒng)能跑的apache進(jìn)程數(shù)就是總的物理內(nèi)存數(shù)除以20M,其實(shí)這20M里面有可能有很大一部分是SHR的。

注意:top命令輸出中的RES和pmap輸出中的RSS是一個(gè)東西。

pmap

上面top命令只是給出了一個(gè)進(jìn)程大概占用了多少的內(nèi)存,而pmap能更詳細(xì)的給出內(nèi)存都是被誰(shuí)占用了。pmap命令輸出的內(nèi)容來(lái)自于/proc/[pid]/maps和/proc/[pid]/smaps這兩個(gè)文件,第一個(gè)文件包含了每段的一個(gè)大概描述,而后一個(gè)文件包含了更詳細(xì)的信息。

這里用pmap看看當(dāng)前bash的內(nèi)存使用情況,:

這里第一列是內(nèi)存的起始地址,第二列是mapping的地址大小,第三列是這段內(nèi)存的訪(fǎng)問(wèn)權(quán)限,最后一列是mapping到的文件。這里的地址都是虛擬地址,大小也是虛擬地址大小。

這里的輸出有很多的[ anon ]行,表示在磁盤(pán)上沒(méi)有對(duì)應(yīng)的文件,這些一般都是可執(zhí)行文件或者動(dòng)態(tài)庫(kù)里的bss段。當(dāng)然有對(duì)應(yīng)文件的mapping也有可能是anonymous,比如文件的數(shù)據(jù)段。關(guān)于程序的數(shù)據(jù)段和bss段的介紹請(qǐng)參考elf的相關(guān)資料。

上面可以看到bash、libc-2.23.so等文件出現(xiàn)了多行,但每行的權(quán)限不一樣,這是因?yàn)槊總€(gè)動(dòng)態(tài)庫(kù)或者可執(zhí)行文件里面都分很多段,有只能讀和執(zhí)行的代碼段,有能讀寫(xiě)的數(shù)據(jù)段,還有比如這一行“00007f1fa153b000 16K rw--- [ anon ]”,就是它上面一行l(wèi)ibc-2.23.so的bss段。

[ stack ]表示進(jìn)程用到的??臻g,而heap在這里看不到,因?yàn)閜map默認(rèn)情況下不單獨(dú)標(biāo)記heap出來(lái),由于heap是anonymous,所以從這里的大小可以推測(cè)出來(lái),heap就是“0000000000be4000 1544K rw--- [ anon ]”。

其實(shí)從上面的結(jié)果根本看不出實(shí)際上每段占用了多少物理內(nèi)存,要想看到RSS,需要使用-X參數(shù),下面看看更詳細(xì)的輸出:

權(quán)限字段多了一個(gè)s和p的標(biāo)記,s表示是和別人共享的內(nèi)存空間,讀寫(xiě)會(huì)影響到其他進(jìn)程,而p表示這是自己私有的內(nèi)存空間,讀寫(xiě)這部分內(nèi)存不會(huì)對(duì)其他進(jìn)程造成影響。

輸出標(biāo)示出了[heap]段,并且也說(shuō)明了后面幾個(gè)[anon]代表的什么意思(vvar,vdso,vsyscall都是映射到內(nèi)核的特殊段),mapping字段為空的都是上一行mapping文件里面的bss段(可是gconv-modules.cache后面有兩行anonymous mapping,可能跟共享內(nèi)存有關(guān)系,沒(méi)有深究)。

Anonymous列標(biāo)示出了哪些是并且有多少是Anonymous方式映射的物理內(nèi)存,其大小小于等于RSS

RSS列表示實(shí)際占用的物理內(nèi)存大小

top命令輸出的SHR內(nèi)存

最后來(lái)看看top命令輸出的SHR到底由pmap的哪些輸出構(gòu)成

從上面的輸出可看出SHR ≈ RES - writeable/private,其中writeable/private主要包含stack和heap以及可執(zhí)行文件和動(dòng)態(tài)庫(kù)的data和bss段,而stack+heap=1544+132=1675,這已經(jīng)占了絕大部分,從而data和bss段之類(lèi)的基本上可以忽略了,所以一般情況下,SHR ≈ RES - [heap] - [stack],由于stack一般都比較小,上面的等式可以進(jìn)一步約等于:SHR ≈ RES - [heap]。

總結(jié)

top命令能看到一個(gè)進(jìn)程占用的虛擬內(nèi)存空間、物理內(nèi)存空間以及和別的進(jìn)程共享的物理內(nèi)存空間,這里共享的空間包括通過(guò)mmap共享的內(nèi)存以及共享的可執(zhí)行文件以及動(dòng)態(tài)庫(kù)。而mmap命令能看到更詳細(xì)的信息,比如可執(zhí)行文件和它所鏈接的動(dòng)態(tài)庫(kù)大小,以及物理內(nèi)存都是被哪些段給占用了。

進(jìn)程占用的虛擬地址空間大小跟程序的規(guī)模有關(guān),除了stack和heap段,其他段的大小基本上都是固定的,并且在程序鏈接的時(shí)候就已經(jīng)確定了,所以基本上只要關(guān)注stack和heap段就可以了,由于stack相對(duì)heap來(lái)說(shuō)很小,所以只要沒(méi)什么stack異常,只需要關(guān)注heap。

在實(shí)際的工作過(guò)程中,其實(shí)我們更關(guān)心的是RSS用了多少,都被誰(shuí)用了,簡(jiǎn)單點(diǎn)說(shuō),如果我們沒(méi)有同時(shí)啟動(dòng)多個(gè)進(jìn)程(同一個(gè)程序),RSS就是一個(gè)很好的實(shí)際物理內(nèi)存使用參考值,但如果是像apache那樣同時(shí)跑很多個(gè)進(jìn)程,那么RSS減去SHR所占用的空間就是一個(gè)很好的實(shí)際物理內(nèi)存占用參考值,當(dāng)然這都是大概估算值。

要想精確評(píng)估一個(gè)進(jìn)程到底占了多少內(nèi)存,還是很難的,需要對(duì)進(jìn)程的每個(gè)段有深入的理解,尤其是SHR部分都有哪些進(jìn)程在一起共享,不過(guò)現(xiàn)在服務(wù)器上的內(nèi)存都是以G為單位的,所以一般情況下大概的估算一下加上合理的測(cè)試就能滿(mǎn)足我們的需求了。

如需購(gòu)買(mǎi)云服務(wù)器,推薦創(chuàng)新互聯(lián)云:https://www.cdcxhl.com/cloud/
網(wǎng)頁(yè)標(biāo)題:云服務(wù)器:使用top,ps等命令查看進(jìn)程的內(nèi)存使用情況
URL鏈接:http://weahome.cn/article/cjhiie.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部