1. 程式人生 > >linux free 命令下free/available區別

linux free 命令下free/available區別

例子

[[email protected]_16_17_centos bin]# free 
              total        used        free      shared  buff/cache   available
Mem:        1882892      785272      280428       40496      817192      852060
Swap:             0           0           0

先說明一些基本概念
第一列
Mem 記憶體的使用資訊
Swap 交換空間的使用資訊
第一行
total 系統總的可用實體記憶體大小
used

已被使用的實體記憶體大小
free 還有多少實體記憶體可用
shared 被共享使用的實體記憶體大小
buff/cache 被 buffer 和 cache 使用的實體記憶體大小
available 還可以被 應用程式 使用的實體記憶體大小

其中有兩個概念需要注意

free 與 available 的區別

free 是真正尚未被使用的實體記憶體數量。
available 是應用程式認為可用記憶體數量,available = free + buffer + cache (注:只是大概的計算方法)

Linux 為了提升讀寫效能,會消耗一部分記憶體資源快取磁碟資料,對於核心來說,buffer 和 cache 其實都屬於已經被使用的記憶體。但當應用程式申請記憶體時,如果 free 記憶體不夠,核心就會回收 buffer 和 cache 的記憶體來滿足應用程式的請求。這就是稍後要說明的 buffer 和 cache。

buff 和 cache 的區別

以下內容來自# buffer和cache怎麼讓你們解釋的那麼難理解?

從字面上和語義來看,buffer名為緩衝,cache名為快取。我們知道各種硬體存在製作工藝上的差別,所以當兩種硬體需要互動的時候,肯定會存在速度上的差異,而且只有互動雙方都完成才可以各自處理別的其他事務。假如現在有兩個需要互動的裝置A和B,A裝置用來互動的介面速率為1000M/s,B裝置用來互動的介面速率為500M/s,那他們彼此訪問的時候都會出現以下兩種情況:(以A來說)

一.A從B取一個1000M的檔案結果需要2s,本來需要1s就可以完成的工作,卻還需要額外等待1s,B裝置把剩餘的500M找出來,這等待B取出剩下500M的空閒時間內(1s)其他的事務還幹不了

二.A給B一個1000M的檔案結果也需要2s,本來需要也就1s就可以完成的工作,卻由於B,1s內只能拿500M,剩下的500M還得等下一個1sB來取,這等待下1s的時間還做不了其他事務。

那有什麼方法既可以讓A在‘取’或‘給’B的時候既能完成目標任務又不浪費那1s空閒等待時間去處理其他事務呢?我們知道產生這種結果主要是因為B跟不上A的節奏,但即使這樣A也得必須等B處理完本次事務才能幹其他活(單核cpu來說),除非你有三頭六臂。那有小夥伴可能會問了,能不能在A和B之間加一層區域比如說ab,讓ab既能跟上A的頻率也會照顧B的感受,沒錯我們確實可以這樣設計來磨合介面速率上的差異,你可以這樣想象,在區域ab提供了兩個互動介面一個是a介面另一個是b介面,a介面的速率接近A,b介面的速率最少等於B,然後我們把ab的a和A相連,ab的b和B相連,ab就像一座橋把A和B連結起來,並告知A和B通過他都能轉發給對方,檔案可以暫時儲存,最終拓撲大概如下:

示例

現在我們再來看上述兩種情況:

對於第一種情況A要B:當A從B取一個1000M的檔案,他把需求告訴了ab,接下來ab通過b和B進行檔案傳送,由於B本身的速率,傳送第一次ab並沒有什麼卵用,對A來說不僅浪費了時間還浪費了感情,ab這傢伙很快感受到了A的不滿,所以在第二次傳送的時候,ab揹著B偷偷快取了一個一模一樣的檔案,而且只要從B取東西,ab都會快取一個拷貝下來放在自己的大本營,如果下次A或者其他C來取B的東西,ab直接就給A或C一個貨真價實的贗品,然後把它通過a介面給了A或C,由於a的速率相對接近A的介面速率,所以A覺得不錯為他省了時間,最終和ab的a成了好基友,說白了此時的ab提供的就是一種快取能力,即cache,絕對的走私!因為C取的是A執行的結果。所以在這種工作模式下,怎麼取得的東西是最新的也是我們需要考慮的,一般就是清cache。例如cpu讀取記憶體資料,硬碟一般都提供一個記憶體作為快取來增加系統的讀取效能

對於第二種情況A給B:當A發給B一個1000M的檔案,因為A知道通過ab的a介面就可以轉交給B,而且通過a介面要比通過B介面傳送檔案需要等待的時間更短,所以1000M通過a介面給了ab ,站在A檢視上他認為已經把1000M的檔案給了B,但對於ab並不立即交給B,而是先快取下來,除非B執行sync命令,即使B馬上要,但由於b的介面速率最少大於B介面速率,所以也不會存在漏洞時間,但最終的結果是A節約了時間就可以幹其他的事務,說白了就是推卸責任,哈哈而ab此時提供的就是一種緩衝的能力,即buffer,它存在的目的適用於當速度快的往速度慢的輸出東西。例如記憶體的資料要寫到磁碟,cpu暫存器裡的資料寫到記憶體。

看了上面這個例子,那我們現在看一下在計算機領域,在處理磁碟IO讀寫的時候,cpu,memory,disk基於這種模型給出的一個例項。我們先來一幅圖:(我從別家當來的,我覺得,看N篇文件 不如瞄此一圖)

示例

page cache:檔案系統層級的快取,從磁盤裡讀取的內容是儲存到這裡,這樣程式讀取磁碟內容就會非常快,比如使用grep和find等命令查詢內容和檔案時,第一次會慢很多,再次執行就快好多倍,幾乎是瞬間。但如上所說,如果對檔案的更新不關心,就沒必要清cache,否則如果要實施同步,必須要把記憶體空間中的cache clean下

buffer cache:磁碟等塊裝置的緩衝,記憶體的這一部分是要寫入到磁盤裡的。這種情況需要注意,位於記憶體buffer中的資料不是即時寫入磁碟,而是系統空閒或者buffer達到一定大小統一寫到磁碟中,所以斷電易失,為了防止資料丟失所以我們最好正常關機或者多執行幾次sync命令,讓位於buffer上的資料立刻寫到磁盤裡。