linux系統中的Cache和Buffer

xz43發表於2012-04-16
停掉資料庫伺服器上的Oacle服務,結果發現16G的記憶體,還有8G沒有釋放,檢視了一下佔記憶體的程式,也沒發現什麼程式佔了很多記憶體,這才想起linux系統本身的快取機制來,如下,先稍微瞭解一下這方面的知識,再看怎麼處理了。
Linux運用一個功能廣泛的緩衝和快取框架來提高系統的速度。緩衝和快取利用一部分系統實體記憶體,確保最重要、最常使用的塊裝置資料在操作時可直接從主記憶體獲取,而無需從低速裝置讀取。實體記憶體還用於儲存從快裝置讀取的資料,使得隨後對該資料的訪問可直接在實體記憶體進行,而無需從外部裝置再次取用。考慮系統中多種因素然後延遲寫回在總體上改進了系統的效能。前面分析的部分,例如記憶體管理的slab快取是一個記憶體到記憶體的快取,其目地不是加速對低速裝置的操作,而是對現有資源進行更簡單、更高效的使用。檔案系統的Dentry快取也用於減少對低速塊裝置的訪問,但他無法推廣到通用場合,因為他是專門用於處理單一資料型別的。
核心為塊裝置提供了兩種通用的快取方案:1) 頁快取,針對以頁為單位的所有操作,並考慮了特定體系結構上的頁長度。一個主要的例子是記憶體對映技術。因為其他型別的檔案訪問也是基於核心中的這一技術實現的。所以頁快取實際上負責了塊裝置的大部分快取工作。2) 塊快取,以塊為操作單位。在進行I/O操作時,存取的單位是裝置的各個塊,而不是整個記憶體頁。儘管頁長度對所有檔案系統都是相同的,但塊長度取決於特定的檔案系統或其設定。
因而,塊快取必須能夠處理不同長度的塊。目前用於塊傳輸的標準資料結構已經演變為struct bio.用這種方式進行塊傳輸更為高效,因為他可以合併同一請求中後續的塊,加速處理的進行。在許多場合下,頁快取和塊快取是聯合使用的。例如,一個快取的頁在寫操作期間可以劃分為不同的緩衝區,這樣可以在更細的力度下,識別出頁被修改的部分。好處在於,在將資料寫回時,只需要回寫被修改的部分,無需將這個頁面傳輸回底層的塊裝置。
在Linux下檢視記憶體我們一般用command free
# free
                          total          used          free     shared    buffers     cached
Mem:       4044932    2403896    1641036          0     187564     811884
-/+ buffers/cache:     1404448     2640484
Swap:      2031608          0            2031608
下面是對這些數值的解釋:
第二行(mem):
total:實體記憶體總的大小;
used:已使用多少;
free:可用有多少;
Shared:多個程式共享的記憶體總額;
Buffers/cached:磁碟快取的大小;
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。
區別:
第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。
這兩個的區別在於使用的角度來看,第一行是從OS的角度來看,因為對於OS,buffers/cached 都是屬於被使用,所以他的可用記憶體是1641036KB,已用記憶體是2403896KB,其中包括核心(OS)使用+Application(X, oracle,etc)使用的+buffers+cached。
第三行所指的是從應用程式角度來看,對於應用程式來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高檔案讀取的效能,當應用程式需在用到記憶體的時候,buffer/cached會很快地被回收。所以從應用程式的角度來說,可用記憶體=系統free memory+buffers+cached.
如上例:
2640484=1641036+187564+811884
接下來解釋什麼時候記憶體會被交換,以及按什麼方交換。當可用記憶體少於額定值的時候,就會開會進行交換。
如何看額定值(RHEL4.0):
#cat /proc/meminfo
交換將透過三個途徑來減少系統中使用的物理頁面的個數: 
1.減少緩衝與頁面cache的大小,
2.將系統V型別的記憶體頁面交換出去, 
3.換出或者丟棄頁面。(Application 佔用的記憶體頁,也就是實體記憶體不足)。
事實上,少量地使用swap是不會影響到系統效能的。
下面是buffers與cached的區別。
buffers是指用來給塊裝置做的緩衝大小,他只記錄檔案系統的metadata以及 tracking in-flight pages.
cached是用來給檔案做緩衝。
那就是說:buffers是用來儲存,目錄裡面有什麼內容,許可權等等。
而cached直接用來記憶我們開啟的檔案,如果你想知道他是不是真的生效,你可以試一下,先後執行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。
 
那麼怎麼手動釋放掉這些記憶體呢?
/proc是一個虛擬檔案系統,我們可以透過對它的讀寫操作做為與kernel實體間進行通訊的一種手段.也就是說可以透過修改/proc中的檔案,來對當前kernel的行為做出調整.那麼我們可以透過調整/proc/sys/vm /drop_caches來釋放記憶體.操作如下:
[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,預設為0
[root@server test]# sync
手動執行sync命令(描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行 sync 命令以確保檔案系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫對映檔案)
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設為3
# free -m
                      total       used       free     shared    buffers     cached
Mem:          3950       1338       2611          0          1               34
-/+ buffers/cache:       1302     2647
Swap:         1983          0           1983
再來執行free命令,發現現在的used為1338MB,free為2611MB,buffers為1MB,cached為34MB,有效的釋放了buffer和cache。
 
有關/proc/sys/vm/drop_caches的用法在下面進行了說明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing  to  this  file  causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory  to  become
free.
To  free  pagecache,  use  echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to   free   pagecache,   dentries  and  inodes,  use  echo  3  >
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation  and  dirty  objects
are not freeable, the user should run sync(8) first.
=======================================================

 

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

相關文章