[轉帖]剖析free命令

济南小老虎發表於2024-06-20
https://perthcharles.github.io/2015/09/28/wiki-tool-free/


Linux中有許多的檢視系統狀態的命令,但是如果沒有一些相關的背景知識就很容易
造成誤解。free命令就是一個明顯的例子。本系列wiki就結合一些好的資料並
結合自身理解來嘗試剖析一些常用又常被誤解的Linux命令。


本文最要參考這篇好文,英文無壓力的建議再讀讀原文。


從一則free使用例項說開

# free
             total       used       free     shared    buffers     cached
Mem:      16426628   16372464      54164          0      35408   10861984
-/+ buffers/cache:    5475072   10951556
Swap:     32764556    7985476   24779080

第一行和第三行字面意思都好立即,第二行往往很多人不理解。主要是看不懂”-/+ buffers/cache”
到底是什麼鬼。
也正是很多人不理解第二行,往往看到類似上面的free結果後,就認為系統已經沒有空閒記憶體給新程序使用了。
下面給出一個計算公式,基本一看就能懂了。

line1[used] - (line1[buffers] + line1[cached]) = line2[used]
line1[total] - line2[used] = line2[free]

根據例項驗證一下

16372464 - (35408 + 10861984) = 5475072
16426628 - 5475072 = 10951556

那麼當有人問起,看到這樣一個free結果時,系統還有多少可用的空閒記憶體呢(free RAM available) ?
我們的回答應該是line2[free]而不是line1[free]。下面會詳細解釋。


buffers和cached到底是什麼

buffers是被一個特定程序使用的用於臨時存放資料的記憶體空間,這些內容不會被其他程序訪問。
這篇文章用了頻寬的概念來
類比,非常貼切。
當你試圖透過網路傳送大量的突發資料時,如果網路卡的頻寬(capacity)僅支援傳送一部分時,
它會將剩下的資料存在buffers中,用於後續傳送。

而cached用於存放頻繁訪問的一些資料,目的是做到更快的資料訪問。
比如多個程序需要讀同一個檔案,此時記憶體可能就分配一片cached區域,用於作為CPU到磁碟
之間的cache。

buffers和cached的區別:
a. buffers是供單個程序使用的,而cached可供多個程序使用
b. buffers是一次性的,而cached是可以反覆使用的
buffers和cached的共同之處就在於它們都是臨時性的儲存,如果後續有程序需要使用
這些記憶體空間,Linux會釋放(free)這些臨時性佔用的記憶體。


swap分割槽

swap分割槽的目的是將一些不被頻繁訪問的記憶體資料放到磁碟,但是當需要時又能儘快的恢復到記憶體中去


參考資料

Understanding free command in Linux/Unix
Linux ate my ram! Don’t Panic! Your ram is fine!
Experiments and fun with the Linux disk cache

相關文章