cat /proc/meminfo 各字段详解
一、cat /proc/meminfo 各字段詳解
/ $ cat /proc/meminfo MemTotal: 877368 kB :所有可用RAM大小(即物理內(nèi)存減去一些預(yù)留位和內(nèi)核的二進(jìn)制代碼大小)(HighTotal + LowTotal),系統(tǒng)從加電開始到引導(dǎo)完成,BIOS等要保留一些內(nèi)存,內(nèi)核要保留一些內(nèi)存,最后剩下可供系統(tǒng)支配的內(nèi)存就是MemTotal。這個(gè)值在系統(tǒng)運(yùn)行期間一般是固定不變的。 MemFree: 22516 kB :LowFree與HighFree的總和,被系統(tǒng)留著未使用的內(nèi)存,MemFree是說的系統(tǒng)層面 MemAvailable: 470244 kB :應(yīng)用程序可用內(nèi)存數(shù)。系統(tǒng)中有些內(nèi)存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的內(nèi)存,這部分可回收的內(nèi)存加上MemFree才是系統(tǒng)可用的內(nèi)存,即:MemAvailable≈MemFree+Buffers+Cached,它是內(nèi)核使用特定的算法計(jì)算出來的,是一個(gè)估計(jì),MemAvailable是說的應(yīng)用程序?qū)用?Buffers: 1772 kB :用來給文件做緩沖大小 Cached: 459224 kB :被高速緩沖存儲(chǔ)器(cache memory)用的內(nèi)存的大小(等于 diskcache minus SwapCache ) SwapCached: 16 kB :被高速緩沖存儲(chǔ)器(cache memory)用的交換空間的大小,已經(jīng)被交換出來的內(nèi)存,但仍然被存放在swapfile中。用來在需要的時(shí)候很快的被替換而不需要再次打開I/O端口 Active: 333148 kB :在活躍使用中的緩沖或高速緩沖存儲(chǔ)器頁面文件的大小,除非非常必要否則不會(huì)被移作他用. (Active(anon) + Active(file)) Inactive: 330384 kB :在不經(jīng)常使用中的緩沖或高速緩沖存儲(chǔ)器頁面文件的大小,可能被用于其他途徑. (Inactive(anon) + Inactive(file)) Active(anon): 104368 kB :活躍的與文件無關(guān)的內(nèi)存(比如進(jìn)程的堆棧,用malloc申請(qǐng)的內(nèi)存)(anonymous pages),anonymous pages在發(fā)生換頁時(shí),是對(duì)交換區(qū)進(jìn)行讀/寫操作 Inactive(anon): 104508 kB :非活躍的與文件無關(guān)的內(nèi)存(比如進(jìn)程的堆棧,用malloc申請(qǐng)的內(nèi)存) Active(file): 228780 kB :活躍的與文件關(guān)聯(lián)的內(nèi)存(比如程序文件、數(shù)據(jù)文件所對(duì)應(yīng)的內(nèi)存頁)(file-backed pages) File-backed pages在發(fā)生換頁(page-in或page-out)時(shí),是從它對(duì)應(yīng)的文件讀入或?qū)懗?Inactive(file): 225876 kB :非活躍的與文件關(guān)聯(lián)的內(nèi)存(比如程序文件、數(shù)據(jù)文件所對(duì)應(yīng)的內(nèi)存頁) Unevictable: 6708 kB : Mlocked: 1428 kB : HighTotal: 261888 kB :高位內(nèi)存總大小(Highmem是指所有內(nèi)存高于860MB的物理內(nèi)存,Highmem區(qū)域供用戶程序使用,或用于頁面緩存。該區(qū)域不是直接映射到內(nèi)核空間。內(nèi)核必須使用不同的手法使用該段內(nèi)存) HighFree: 5680 kB :未被使用的高位內(nèi)存大小 LowTotal: 615480 kB :低位內(nèi)存總大小,低位可以達(dá)到高位內(nèi)存一樣的作用,而且它還能夠被內(nèi)核用來記錄一些自己的數(shù)據(jù)結(jié)構(gòu) LowFree: 16836 kB :未被使用的低位大小 SwapTotal: 614396 kB :交換空間的總大小 SwapFree: 611044 kB :未被使用交換空間的大小 Dirty: 40 kB :等待被寫回到磁盤的內(nèi)存大小 Writeback: 0 kB :正在被寫回到磁盤的內(nèi)存大小 AnonPages: 209224 kB :未映射頁的內(nèi)存大小 Mapped: 280668 kB :設(shè)備和文件等映射的大小 Shmem: 1084 kB : Slab: 59840 kB :內(nèi)核數(shù)據(jù)結(jié)構(gòu)緩存的大小,可以減少申請(qǐng)和釋放內(nèi)存帶來的消耗 SReclaimable: 34196 kB :可收回Slab的大小 SUnreclaim: 25644 kB :不可收回Slab的大小(SUnreclaim+SReclaimable=Slab) KernelStack: 7504 kB :常駐內(nèi)存,每一個(gè)用戶線程都會(huì)分配一個(gè)kernel stack(內(nèi)核棧) PageTables: 15508 kB :管理內(nèi)存分頁頁面的索引表的大小 NFS_Unstable: 0 kB :不穩(wěn)定頁表的大小 Bounce: 0 kB : WritebackTmp: 0 kB : CommitLimit: 1053080 kB :根據(jù)超額分配比率('vm.overcommit_ratio'),這是當(dāng)前在系統(tǒng)上分配可用的內(nèi)存總量,這個(gè)限制只是在模式2('vm.overcommit_memory')時(shí)啟用。CommitLimit用以下公式計(jì)算:CommitLimit =('vm.overcommit_ratio'*物理內(nèi)存)+交換例如,在具有1G物理RAM和7G swap的系統(tǒng)上,當(dāng)`vm.overcommit_ratio` = 30時(shí) CommitLimit =7.3G Committed_AS: 16368536 kB :目前在系統(tǒng)上分配的內(nèi)存量。是所有進(jìn)程申請(qǐng)的內(nèi)存的總和,即時(shí)所有申請(qǐng)的內(nèi)存沒有被完全使用,例如一個(gè)進(jìn)程申請(qǐng)了1G內(nèi)存,僅僅使用了300M,但是這1G內(nèi)存的申請(qǐng)已經(jīng)被 "committed"給了VM虛擬機(jī),進(jìn)程可以在任何時(shí)間使用。如果限制在模式2('vm.overcommit_memory')時(shí)啟用,分配超出CommitLimit內(nèi)存將不被允許 VmallocTotal: 245760 kB :可以vmalloc虛擬內(nèi)存大小 VmallocUsed: 0 kB :vmalloc已使用的虛擬內(nèi)存大小 VmallocChunk: 0 kB :最大的連續(xù)未被使用的vmalloc區(qū)域1、Inactive(anon) 和 Inactive(file),分別表示anonymous pages和mapped pages。
用戶進(jìn)程的內(nèi)存頁分為兩種:與文件關(guān)聯(lián)的內(nèi)存(比如程序文件、數(shù)據(jù)文件所對(duì)應(yīng)的內(nèi)存頁)和與文件無關(guān)的內(nèi)存(比如進(jìn)程的堆棧,用malloc申請(qǐng)的內(nèi)存),前者稱為file pages或mapped pages,后者稱為anonymous pages;其中LRU lists包括如下幾種,在/proc/meminfo中都有對(duì)應(yīng)的統(tǒng)計(jì)值:
LRU_INACTIVE_ANON ?– ?對(duì)應(yīng) Inactive(anon)
LRU_ACTIVE_ANON ?– ?對(duì)應(yīng) Active(anon)
LRU_INACTIVE_FILE ?– ?對(duì)應(yīng) Inactive(file)
LRU_ACTIVE_FILE ?– ?對(duì)應(yīng) Active(file)
LRU_UNEVICTABLE ?– ?對(duì)應(yīng)?Unevictable
Inactive list里的是長時(shí)間未被訪問過的內(nèi)存頁,Active list里的是最近被訪問過的內(nèi)存頁,LRU算法利用Inactive list和Active list可以判斷哪些內(nèi)存頁可以被優(yōu)先回收。
2、MemAvailable
應(yīng)用程序可用內(nèi)存數(shù)。系統(tǒng)中有些內(nèi)存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的內(nèi)存,這部分可回收的內(nèi)存加上MemFree才是系統(tǒng)可用的內(nèi)存,即:MemAvailable≈MemFree+Buffers+Cached,它是內(nèi)核使用特定的算法計(jì)算出來的,是一個(gè)估計(jì)值。
3、VmallocUsed
通過vmalloc分配的內(nèi)存都統(tǒng)計(jì)在/proc/meminfo的 VmallocUsed 值中,但是要注意這個(gè)值不止包括了分配的物理內(nèi)存,還統(tǒng)計(jì)了VM_IOREMAP、VM_MAP等操作的值,譬如VM_IOREMAP是把IO地址映射到內(nèi)核空間、并未消耗物理內(nèi)存,所以我們要把它們排除在外。從物理內(nèi)存分配的角度,我們只關(guān)心VM_ALLOC操作,這可以從/proc/vmallocinfo中的vmalloc記錄看到。
4、KernelStack:
Kernel stack(內(nèi)核棧)是常駐內(nèi)存的,既不包括在LRU lists里,也不包括在進(jìn)程的RSS/PSS內(nèi)存里,所以我們認(rèn)為它是kernel消耗的內(nèi)存。統(tǒng)計(jì)值是/proc/meminfo的KernelStack。64bit 系統(tǒng)的 task_struct size 是16KB, ?32bit的系統(tǒng)task_struct size為 8KB,每一個(gè)用戶線程都會(huì)分配一個(gè)kernel stack(內(nèi)核棧),內(nèi)核棧雖然屬于線程,但用戶態(tài)的代碼不能訪問,只有通過系統(tǒng)調(diào)用(syscall)、自陷(trap)或異常(exception)進(jìn)入內(nèi)核態(tài)的時(shí)候才會(huì)用到,也就是說內(nèi)核棧是給kernel code使用的。
?
內(nèi)存黑洞:
進(jìn)程通過將memoryinfo中的內(nèi)存大小相加起來,發(fā)現(xiàn)總是比真實(shí)內(nèi)存小,那是因?yàn)橛袃?nèi)存黑洞的存在,我們知道,Kernel的動(dòng)態(tài)內(nèi)存分配通過以下幾種接口:
alloc_pages/__get_free_page: 以頁為單位分配
vmalloc: 以字節(jié)為單位分配虛擬地址連續(xù)的內(nèi)存塊
slab allocator
vmalloc和slab分配的內(nèi)存都會(huì)被記錄在meminfo中,但通過alloc_pages/__get_free_page分配的內(nèi)存,沒有在/proc/meminfo中統(tǒng)計(jì),不知道有多少,就像個(gè)黑洞。
參考博客《android cat /proc/meminfo 字段分析》
總結(jié)
以上是生活随笔為你收集整理的cat /proc/meminfo 各字段详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 安装配置NFS网络文件系统
- 下一篇: 学习busybox源码与移植