2014年12月7日 星期日

free

在 linux console 下,可以透過 free 指令顯示記憶體的使用率,例如:

$ free
             total       used       free     shared    buffers     cached
Mem:       8191724    2173776    6017948          0     491088     463344
-/+ buffers/cache:    1219344    6972380
Swap:      8295420        548    8294872

預設的單位是 kilobytes,但是畫面上有那麼多的數字,我們該怎樣解讀才正確呢? 而且我們會常常發現,不管我加了多少記憶體,當系統開機時間久了以後,free memory 會一直減少,而 buffers 和 cached 好像一直增加,這到底是為什麼呢?

簡單的說,就是系統發現有空閒的記憶體時,會把這些記憶體挪來當作 buffers 和 cached 做使用,所以單純只看前面三個數字其實不是那麼精確,那麼,我們用另一個方式來看這個問題。
             total       used       free     shared    buffers     cached
Mem:             T          U          F          0         Bf         Cf
-/+ buffers/cache:          U2         F2
T = 實體記憶體總共的大小
U = 應用程式記憶體加上配給 buffers 與 cached 的記憶體大小 (包含未用的 buffers 與 cached)
F  = 剩下的記憶體大小 (完全閒置的記憶體大小)
Bf = 配給 buffers 但未用的記憶體大小
Cf = 配給 cache 但未用的記憶體大小
U2 = buffers 與 cached 被使用掉的記憶體大小,加上被應用程式用走的,也就是實際的使用量
F2 = 實際剩下的記憶體大小

其中 T = U + F = U2 + F2

而第二行那個 -/+ buffers/cached 的意思是說
第一個值 U2 = U - ( Bf + Cf)
第二個值 F2 = F + ( Bf + Cf)

buffer 與 cached 的區別:
buffer 是準備要寫入硬碟的資料
cached 是從硬碟讀出來的資料,存著以備之後會用到

一般情況下,Linux kernel 會盡可能多地利用 RAM 的空閑空間作為 cached/buffers以最大幅度地提高系統性能。當系統中運行的應用程序占用的 RAM 增加時,則將 cached/buffers 所占用的空間釋放出來,讓渡給應用程序使用。

所以要觀察 free memory 的大小,其實直接讀取 F2 這個值就可以了,簡單快速方便。

這個例子中就是 6972380 kilobytes,大約是 6.9 gigabytes (事實上是 6.6 gigabytes)。

記憶體管理的概觀


當系統開機一段時間後,像是「top」這種傳統的 Unix 工具常常回報少的可憐的可用記憶體數值,在我寫這篇文章的系統中,就算我總共有 512 MB 的記憶體在我的系統裡,但約開機後三個小時,我只剩下 60 MB 的可用記憶體,那些記憶體到底跑到那裡去了?

用掉最多記憶體的地方是磁碟快取 (disk cache),目前它總共用了超過 290 MB 的記憶 (在 top 裡的「cached」項目中),快取記憶體 (cached memory) 基本上是空閒的,當有新/執行中的程式需要記憶體的話,它會快速的被取回來。

為什麼 Linux 使用這麼多的記憶體來當作磁碟快取 (disk cache) 呢?主要的原因便是:假如 RAM 沒有被使用的話,它便是閒放在那邊浪費著不用。如果把資料放在用 RAM 組成的磁碟上,它的存取速度比直接從硬碟上存取還要快上 1000 倍。假如在快取裡找不到該資料,當然還是得直接從磁碟裡存取,但就如同上面說的,您將可以節省些微的存取時間。

參考資料

沒有留言:

張貼留言