【LINUX】free 命令結果完全剖析

xysoul_雲龍發表於2016-03-23

以下是筆者在虛擬機器上執行的debian系統的free情況。該虛擬機器記憶體只有128M,同時分配了256M的SWAP交換區。

   

               total used free shared buffers cached

Mem: 124788 113432 11356 0 15308 75568

-/+ buffers/cache: 22556 102232

Swap: 245752 20 245732

   

第一行 (可以理解為從作業系統的角度來看記憶體分配)

   

total

總實體記憶體大小。

used

已分配的大小,注意,對作業系統來說任何被使用的記憶體都是used。

free

未被分配的實體記憶體大小。

shared

共享記憶體大小,主要用於程式間通訊,例如Oracle會使用上GB的共享記憶體。

buffers

主要用於塊裝置資料緩衝,例如記錄檔案系統的metadata(目錄、許可權等等資訊)。

cached

主要用於檔案內容緩衝

   

# 這裡補充一下關於檔案系統的常識 ^_^

# 檔案系統實際上可以粗略的劃分為兩個部分:

# (1)metadata:即通常說的後設資料,包括目錄結構、檔案的名字、大小、修改時間、許可權等等資訊。

# (2)filedata:即檔案中真正儲存的內容。

# 由於計算機中各個部件之間的速度相差很大,通常情況下CPU的cache最快,其次是記憶體,最慢的自然就是硬碟等外部裝置了。

# 而越慢的裝置越廉價,所以硬碟就被用來儲存大量資料(有一天記憶體不要錢了大家就不用在被buffer、cache這個東東折磨了 <( ̄︶ ̄)>)。

# 所以,檔案系統就被放在了硬碟上(不可避免的悲劇~~)。但是由於硬碟速度實在太慢了,為了改善IO效能,最終就誕生了"快取"這一概念。

# "快取"實際上就是在記憶體中劃分一塊區域作為硬碟和程式之間的緩衝區域,寫程式把資料寫到這裡然後就幹其他事情去了,讀程式需要時先在這裡找,找不到再去找硬碟,這樣就大大提高了讀寫效率,同時縮短了IO等待時間,否則你在linux上執行man iptables 這樣的命令的時候每次都會等N久。。。

# 這裡還有一個"實體記憶體"和"虛擬記憶體"的概念,這個概念比較難講,大家去google一些大牛的帖子看吧,涉及的東西太多了。。。。

   

所以,這裡,buffer實際上是用來儲存了檔案系統的後設資料(這樣我們每次ls就會很快了 ^_^),而cache則快取了近期讀寫過的檔案的內容(第一次讀檔案會很慢,以後就會很快,就是因為有cache的存在),把這個理解了free命令就理解了大半了。

   

繼續講。。。

   

第二行 (可以理解為從應用程式的角度來看記憶體分配)

   

-/+ buffers/cached: 22556 102232

這裡的 -/+ 實際上分別指的是 - buffers/cached 和 + buffers/cached 兩個部分。

   

- buffers/cached

= used(第一行) - buffers - cached

實際上是程式當前"真實使用"的"實體記憶體"的大小。

+ buffers/cached

= buffers + cached

兩個加起來可以理解為"暫時借給"系統作為"緩衝區"使用的記憶體大小。

   

大家做一下簡單的加減法就清楚了:

從應用多角度來說,實際上系統還可以分配給他的記憶體有這麼多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)

而系統所擁有的總的實體記憶體大小 113432 = 22556( - buffers/cached) + 102232 (+ buffers/cached)

   

所以,第一行的資料實際上是從作業系統角度來看的。

對於作業系統來說已分配的記憶體表示已經被某些資料所佔據了,但是具體這些數資料是用來做什麼的他不會去理會。

實際上正如前面所說,這部分實體記憶體被拿來做"快取"了。

   

但是,是不是應用就不能使用了呢?

當然不是!!!!

不然我也不用寫了,大家都懂了。。。

   

前面說到buffers和cached這部分記憶體是"借給"作業系統使用的,之所以說是"借的",這裡主要原因還在於"虛擬記憶體"與"實體記憶體"的區別。

對於應用來說,我申請了1000KB的記憶體,作業系統同意了,給程式一個地址,告訴他你要的記憶體在這裡,然後程式就拿著這個地址去用了。

但是實際上大多數時候程式不會立刻將這些記憶體使用掉,而是一點一點的使用,所以,在沒有使用之前,系統就能將這一部分實體記憶體拿去做其他事情已提升整個系統的效能,比如說這裡的"快取"。

當然,這樣理解"虛擬記憶體"是非常片面的,實際情況比這要複雜得多,比如說這還涉及到程式的執行空間、程式碼的編譯、連結、載入等等,必須結合起來才能解釋清楚為什麼需要虛擬記憶體,實際上"虛擬記憶體"是一個抽象的概念的實現,大大簡化了作業系統和應用的設計複雜度。

雖然要講的太多太多,但是,今天這樣理解"虛擬記憶體"在這裡也夠用了。 ^_^

在這裡作業系統就相當於"借"了一部分記憶體出去以提高系統的IO效能。

   

對於"虛擬記憶體"和"實體記憶體"可以透過ps aux命令簡單看一下:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1471 0.0 0.3 2152 428 ? S 15:55 0:00 /usr/bin/daemon /etc/init.d/mpt-statusd check_mpt

root 1474 0.0 0.4 1748 556 ? S 15:55 0:00 /bin/sh /etc/init.d/mpt-statusd check_mpt

   

VSZ這一列顯示的就是對應程式所分配的"虛擬記憶體"大小,而RSS則是程式實際使用的記憶體,VSZ實際是比RSS要大的,說明程式沒有使用到他所申請的那麼多記憶體,如果分配出去了肯定是閒的蛋疼。。。你的機器也不能像現在這樣一邊跑QQ一邊看網頁。。。開個chrome就完蛋了。。

   

細心的同學會發現,上面講的這個"借"的過程和銀行的業務很相似,大家把手裡的現錢存到銀行去,銀行給我們一張卡,卡上有個卡號,銀行說"憑這個卡和密碼你就可以隨時來取錢了"。然後我們就放心的把錢存在銀行裡,等需要錢的時候就拿著卡去取錢,而銀行這時候也能拿著我們的錢去投資修橋補路。

唯一的區別可能就是銀行有利息,這裡麼有~~~~~

   

扯遠了,回到主題上。

   

好,既然我們說這個記憶體是"借"來的,那當然有程式會拿著地址過來要記憶體的時候(就跟取錢一樣)。

這時候作業系統就會從第一行的free這裡去找空閒記憶體分給程式用。

但是大家肯定發現了,大部分的記憶體是被buffers和cached佔用了,萬一來個需求大的記憶體的時候怎麼辦?

答案很簡單嘛,把放出去的"貸款"收回來唄~~~~

那就從buffers和cached中釋放記憶體,同時將所釋放空間中的資料回寫到硬碟上,防止資料丟失。

   

再插一句,要是buffers和cached也沒了怎麼辦?那"銀行"就只有從其他地方"借錢"來還了~~~

這次"借"就是從硬碟借了,也就是我們所說的分配SWAP空間,將一部分記憶體頁面換到SWAP空間中。

當然實際的處理過程系統不會等到buffers和cached回收完才使用SWAP空間的,比你想象的要輕易得多,因為有時候縮小"快取"的效能代價比使用SWAP空間更高,Linux系統還是很smart的~~~

   

回來繼續說。

那什麼時候系統會開始回收buffers和cached部分的記憶體呢?

這裡要看一下資料:

root@debian01:~# cat /proc/meminfo

MemTotal: 124788 kB

MemFree: 11596 kB

Buffers: 15332 kB

Cached: 75568 kB

SwapCached: 20 kB

Active: 54884 kB

Inactive: 45564 kB

Active(anon): 2124 kB

Inactive(anon): 7560 kB

Active(file): 52760 kB

Inactive(file): 38004 kB

Unevictable: 0 kB

Mlocked: 0 kB

HighTotal: 0 kB

HighFree: 0 kB

LowTotal: 124788 kB

LowFree: 11596 kB

SwapTotal: 245752 kB

SwapFree: 245732 kB

Dirty: 0 kB

Writeback: 0 kB

AnonPages: 9544 kB

Mapped: 5884 kB

Shmem: 136 kB

Slab: 8784 kB

SReclaimable: 4940 kB

SUnreclaim: 3844 kB

KernelStack: 528 kB

PageTables: 456 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 308144 kB

Committed_AS: 43272 kB

VmallocTotal: 897016 kB

VmallocUsed: 6344 kB

VmallocChunk: 879908 kB

HardwareCorrupted: 0 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 4096 kB

DirectMap4k: 16384 kB

DirectMap4M: 114688 kB

   

meminfo的資料比較多,這裡就不細講了,我們只關注一個資料。
LowFree: 11596 kB

實際上當free部分的記憶體小於這個值的時候,系統就會考慮是否需要回收"快取"部分的實體記憶體,當然這不是絕對的,這可以作為一個參考閥值。

   刪除線這段話有問題,正在研究

OK,最後一部分。

   

說了這麼多,那麼到底有沒有辦法強制釋放呢??

當然有啊!!!銀行欠你錢你會不去要???

   

話說辦法其實很簡單,在控制檯執行以下命令即可:

echo 3 > /proc/sys/vm/drop_caches

這裡的"3"表示釋放所有buffers和cached中能釋放的部分。

   

root@debian01:~# echo 3 > /proc/sys/vm/drop_caches

root@debian01:~# free

          total used free shared buffers cached

Mem: 124788 26764 98024 0 148 6144

-/+ buffers/cache: 20472 104316

Swap: 245752 20 245732

   

手工釋放以後大家可以測試一下,執行幾次類似以下這些命令,會明顯發現又漲上去了。。。

ls -la /dev/

find / -name *.sh

man iptables

   

root@debian01:~# free

             total used free shared buffers cached

Mem: 124788 87368 37420 0 30692 25512

-/+ buffers/cache: 31164 93624

Swap: 245752 20 245732

end,轉載只為記錄

原文地址:http://blog.chinaunix.net/uid-15007890-id-3067490.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2062850/,如需轉載,請註明出處,否則將追究法律責任。

相關文章