Linux 命令(37) free 命令

2021-08-15 13:49:46 字數 4909 閱讀 2084

free 命令用於顯示系統記憶體使用情況,包括物理記憶體(physical memory)、虛擬記憶體(swap memory)、共享記憶體(shared memory)以及核心使用的緩衝(buffers)與快取(cached)大小。在 linux 系統監控的工具中,free 命令經常被用到。

free 命令的所有輸出值都是從 /proc/meminfo 中讀取的。

free [-b | -k | -m] [-o] [-s delay ] [-t] [-l] [-v]
-b:以byte為單位顯示記憶體使用情況;

-k:以kb為單位顯示記憶體使用情況;

-m:以mb為單位顯示記憶體使用情況;

-g:以gb為單位顯示記憶體使用情況;

-o:不顯示緩衝區調節列;

-s [間隔秒數]:以指定間隔時間持續觀察記憶體使用狀況;

-t:顯示記憶體總和列;

-l:顯示詳細的低記憶體和高記憶體統計;

-v:顯示版本資訊。

(1)使用 gb 為單位顯示記憶體使用情況。

[root@test ~]#free -g

total used free shared buffers cached

mem: 62 61 0 0 2 56

-/+ buffers/cache: 2 59

swap: 1 0 1

第一行為各列的名稱,其釋義如下:

total:物理記憶體總大小;

used:物理記憶體已使用大小;

free:物理記憶體空閒大小;

shared:系統中分配的共享記憶體大小,此列已經 deprecated,數值一般為 0。當然在一些系統上也可能不是0,主要取決於free命令是怎麼實現的。如果為0,要想檢視系統分配的共享記憶體大小,請檢視 /proc/meminfo的 shmem 一項;

buffers:系統分配的buffer大小;

cached:系統分配的cache大小。包含了共享記憶體和tmpfs記憶體檔案系統占用的記憶體。這兩部分記憶體之和可通過/proc/meminfo的shmem欄位直接獲取。

其中 total = used + free,理論空閒記憶體大小 free2=free1+buffers+cached=58gb,其中 free2 表示 free 列第二行的取值。實際上,cached 中的共享記憶體大小和 tmpfs 記憶體檔案系統大小也是實際被使用的記憶體,所以真正可用記憶體大小 real free=free1+buffers+cached-shmem。shmem 大小具體參見 /proc/meminfo 的 shmem 欄位的取值。

第二行表示減去與增加 buffers 和 cache 大小,分別對應物理記憶體的理論已使用和理論空閒大小。理論空閒記憶體大小的計算方法如上文所述,理論已使用大小 used2=used1-(buffers+cache)=3。為什麼不是顯示的 2呢,因為這裡存在四捨五入,導致顯示有一定誤差,使用 mb 為單位來顯示,數值就能對的上了。

第三行 swap 表示交換分割槽(即虛擬記憶體)的大小。如果 swap 記憶體有被使用,則說明系統記憶體不夠使用,需要進行擴容。

(2)顯示 high memory 使用情況。

[root@test ~]#free -gl

total used free shared buffers cached

mem: 62 61 0 0 2 56

low: 62 61 0

high: 0 0 0

-/+ buffers/cache: 2 59

swap: 1 0 1

使用-l選項可以檢視高低記憶體使用情況,發現低記憶體與 mem 的使用情況相同,高記憶體全部為零,為什麼會這樣呢?先看一下什麼是 high memory 和 low memory。

32 位的 cpu,最大定址範圍為 2^32 - 1 也就是 4g 的線性位址空間。linux 簡化了分段機制,使得虛擬位址與線性位址總是一致的。linux 一般把這個 4g 的位址空間劃分為兩個部分:其中 0~3g 為使用者程式位址空間,虛位址 0x00000000 到 0xbfffffff,供各個程序使用;3g~4g為核心的位址空間,虛擬位址 0xc0000000 到 0xffffffff,供核心使用。

linux 核心採用了最簡單的對映方式來對映物理記憶體,即把實體地址+page_offset按照線性關係直接對映到核心空間。page_offset 大小為 0xc0000000。但是 linux 核心並沒有把整個 1g 空間用於線性對映,而只映**最多 896m 物理記憶體,預留了最高端的 128m 虛擬位址空間給 io 裝置和其他用途。所以,當系統物理記憶體較大時,超過 896m 的記憶體區域,核心就無法通過線性對映直接訪問了。這部分記憶體被稱作 high memory。相應的可以對映的低端物理記憶體稱為 low memory。

那 kernel 就永遠無法訪問到超過 896m 的記憶體了嗎?不是的,kernel 已經預留了 128m 虛擬位址,我們可以用這個位址來動態地對映到 high memory,從而訪問 high memory。所以預留的 128m 除了對映 io 裝置外,還有乙個重要的功能是提供了一種動態訪問 high memory 的一種手段(kmap 主要就是幹這個的,當然還有 vmalloc)。

結論:

(1)high memory 針對的是物理記憶體,不是虛擬記憶體。

(2)high memory 也是被核心管理的(有對應的page結構),只是沒有對映到核心虛擬位址空間。當核心需要分配high memory時,通過kmap等從預留的位址空間中動態分配乙個位址,然後對映到high memory,從而訪問這個物理頁。high memory 對映到核心位址空間一般是暫時性的對映,不是永久對映。

(3)high memory 和 low memory一樣,都是參與核心的物理記憶體分配,都可以被對映到核心位址空間,也都可以被對映到使用者位址空間。

(4)物理記憶體<896m時,沒有 high memory,因為所有的記憶體都被kernel直接映**。

(5)64位系統下不會有 high memory,因為64位虛擬位址空間非常大(分給kernel的也很大),完全能夠直接對映全部物理記憶體。

因為測試的機器是 64 位機器,所以不存在 high memory,故全部為零。

(1)buffers(緩衝)

buffer是用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。緩衝(buffers)是為磁碟的讀寫設計的,把分散的寫操作集中進行,減少磁碟碎片和硬碟的反覆尋道,從而提高系統效能。

buffers 存放即將寫到磁碟(塊裝置)的資料,緩衝滿了一次性寫入,減少對磁碟的寫操作(記憶體 -> 磁碟)。

(2)cached(快取)

cache 經常被用在磁碟的 i/o 請求上,如果有多個程序都要訪問某個檔案,於是該檔案便被做成 cache 以方便下次被訪問,這樣可提供系統效能。

快取是把讀取過的資料儲存起來,重新讀取時若命中(找到需要的資料)就不要去讀硬碟了,若沒有命中就讀硬碟。其中的資料會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往後排,直至從中刪除。

cached 存放從磁碟讀出的資料,快取起來,減少對磁碟的讀操作(磁碟 -> 記憶體)。

buffers 和 cached,兩者都是 ram 中的資料。簡單來說,buffers 快取即將要被寫入磁碟的資料,cached 快取從磁碟中讀取的資料。

buffers 主要用於快取檔案系統中的元資料資訊(dentries、inodes),cached 主要用於快取檔案系統中的pages 資訊,必要時 buffers、cached 所佔記憶體可被**用於其他程式。

設定以下值可以將檔案系統快取的 clean pages、dentries、inodes 移出記憶體,騰出可用記憶體:

[plain] view plain copy

to free pagecache:

echo 1 > /proc/sys/vm/drop_caches

to free dentries and inodes:

echo 2 > /proc/sys/vm/drop_caches

to free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

以上操作並非具有破壞性,因為他們並不會將 dirty caches 釋放掉,為了獲得更多的可用記憶體,使用者可以先執行 sync 操作將 dirty caches 寫回磁碟,使之變為 clean caches(cache中的內容還是保留在記憶體中),然後再設定 drop_caches。

這裡釋放完成後,發現 cached 數值仍然不為 0,原因是 free 命令計算的 cached 包含了共享記憶體的大小,共享記憶體需要使用ipcrm [ -m key | -m id ]命令來釋放。buffers 的數值也不為 0,因為系統時刻在執行著,釋放完後,buffers 又被分配出去。

[1] free manual

[2] free命令.linux命令大全

[3] linux free命令:buffer 與 cache 區別

[4] linux核心的high memory概念詳解

[5] linux上的free命令詳解

[6] 由free命令想到的

[7] linux記憶體總結

每天乙個linux命令(37) free 命令

free命令可以顯示linux系統中空閒的 已用的物理記憶體及swap記憶體,及被核心使用的buffer。在linux系統監控的工具中,free命令是最經常使用的命令之一。1 命令格式 free 引數 2 命令功能 free 命令顯示系統使用和空閒的記憶體情況,包括物理記憶體 互動區記憶體 swap...

Linux命令之free命令

free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。free 選項 b 以byte為單位顯示記憶體使用情況 k 以kb為單位顯示記憶體使用情況 m 以mb為單位顯示記憶體使用情況 o 不顯示緩衝區調節列 s 間隔秒數 持續觀察記憶體使用狀況 t 顯示記憶體總...

linux命令總結free命令

free 命令是乙個顯示系統中空閒和已用記憶體大小的工具。free 命令的輸出和 top 命令相似。大多數linux發行版已經含有 free 命令。想要執行,只需在控制台輸入free 即可。不帶選項執行會顯示乙個以kb為單位的預設輸出。root finish scripts free total u...