在linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在乙個rhel6的系統上,free命令的顯示內容大概是這樣乙個狀態:
這裡的預設顯示單位是kb,我的伺服器是128g記憶體,所以數字顯得比較大。這個命令幾乎是每乙個使用過linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(我是說比例越少)。一般情況下,對此命令輸出的理解可以分這幾個層次:
不了解。這樣的人的第一反應是:天啊,記憶體用了好多,70個多g,可是我幾乎沒有執行什麼大程式啊?為什麼會這樣?linux好佔記憶體!
自以為很了解。這樣的人一般評估過會說:嗯,根據我專業的眼光看的出來,記憶體才用了17g左右,還有很多剩餘記憶體可用。buffers/cache占用的較多,說明系統中有程序曾經讀寫過檔案,但是不要緊,這部分記憶體是當空閒來用的。
真的很了解。這種人的反應反而讓人感覺最不懂linux,他們的反應是:free顯示的是這樣,好吧我知道了。神馬?你問我這些記憶體夠不夠,我當然不知道啦!我特麼怎麼知道你程式怎麼寫的?
根據目前網路上技術文件的內容,我相信絕大多數了解一點linux的人應該處在第二種層次。大家普遍認為,buffers和cached所占用的記憶體空間是可以在記憶體壓力較大的時候被釋放當做空閒空間用的。但真的是這樣麼?在論證這個題目之前,我們先簡要介紹一下buffers和cached是什麼意思:
buffer和cache是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。在linux的記憶體管理中,這裡的buffer指linux記憶體的:buffer cache。這裡的cache指linux記憶體中的:page cache。翻譯成中文可以叫做緩衝區快取和頁面快取。在歷史上,它們乙個(buffer)被用來當成對io裝置寫的快取,而另乙個(cache)被用來當作對io裝置的讀快取,這裡的io裝置,主要指的是塊裝置檔案和檔案系統上的普通檔案。但是現在,它們的意義已經不一樣了。在當前的核心中,page cache顧名思義就是針對記憶體頁的快取,說白了就是,如果有記憶體是以page進行分配管理的,都可以使用page cache作為其快取來管理使用。當然,不是所有的記憶體都是以頁(page)進行管理的,也有很多是針對塊(block)進行管理的,這部分記憶體使用如果要用到cache功能,則都集中到buffer cache中來使用。(從這個角度出發,是不是buffer cache改名叫做block cache更好?)然而,也不是所有塊(block)都有固定長度,系統上塊的長度主要是根據所使用的塊裝置決定的,而頁長度在x86上無論是32位還是64位都是4k。
明白了這兩套快取系統的區別,就可以理解它們究竟都可以用來做什麼了。
page cache主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當程序對檔案有read/write操作的時候。如果你仔細想想的話,作為可以對映檔案到記憶體的系統呼叫:mmap是不是很自然的也應該用到page cache?在當前的系統實現裡,page cache也被作為其它檔案型別的快取裝置來用,所以事實上page cache也負責了大部分的塊裝置檔案的快取工作。
什麼是buffer cache
buffer cache則主要是設計用來在系統對塊裝置進行讀寫的時候,對塊進行資料快取的系統來使用。這意味著某些對塊的操作會使用buffer cache進行快取,比如我們在格式化檔案系統的時候。一般情況下兩個快取系統是一起配合使用的,比如當我們對乙個檔案進行寫操作的時候,page cache的內容會被改變,而buffer cache則可以用來將page標記為不同的緩衝區,並記錄是哪乙個緩衝區被修改了。這樣,核心在後續執行髒資料的回寫(writeback)時,就不用將整個page寫回,而只需要寫回修改的部分即可。
linux核心會在記憶體將要耗盡的時候,觸發記憶體**的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做快取,只是在記憶體夠用的時候加快程序對檔案的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放cache,作為free空間分給相關程序使用。所以一般情況下,我們認為buffer/cache空間可以被釋放,這個理解是正確的。
但是這種清快取的工作也並不是沒有成本。理解cache是幹什麼的就可以明白清快取必須保證cache中的資料跟對應檔案中的資料一致,才能對cache進行釋放。所以伴隨著cache清除的行為的,一般都是系統io飆高。因為核心要對比cache中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能**。
在系統中除了記憶體將被耗盡的時候可以清快取以外,我們還可以使用下面這個檔案來人工觸發快取清除的操作:
[root@tencent64 ~]# cat /proc/sys/vm/drop_caches方法是:1
echo 1 > /proc/sys/vm/drop_caches當然,這個檔案可以設定的值分別為1、2、3。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。優化後截圖如下:echo 2 > /proc/sys/vm/drop_caches:表示清除**slab分配器中的物件(包括目錄項快取和inode快取)。slab分配器是核心中管理記憶體的一種機制,其中很多快取資料實現都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的快取物件。
Linux中Cache記憶體占用過高解決辦法
在linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在乙個rhel6的系統上,free命令的顯示內容大概是這樣乙個狀態 這裡的預設顯示單位是kb,我的伺服器是128g記憶體,所以數字顯得比較大。這個命令幾乎是每乙個使用過linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越...
linux記憶體中buffer和 cached的比較
經常遇到一些剛接觸linux的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux 都將...
linux 記憶體中Buffer和Cache的區別
具體怎麼理解?通過實驗發現,比較寫資料到檔案和寫資料到磁碟 比較從檔案中讀取資料和從磁碟中讀資料 實驗資料參考 簡單理解 buffer 是對磁碟資料的快取,而 cache 是檔案資料的快取。同學 geek 5258f8 的解答 理論上,乙個檔案讀首先到block buffer,然後到page cac...