[linux]Cache太高解決辦法


在Linux系統中,咱們常常用free命令來查看系統內存的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態:html

1.png

這裏的默認顯示單位是kb,個人服務器是128G內存,因此數字顯得比較大。這個命令幾乎是每個使用過Linux的人必會的命令,但越是這樣的命令,彷佛真正明白的人越少(我是說比例越少)。通常狀況下,對此命令輸出的理解能夠分這幾個層次:node

  1. 不瞭解。這樣的人的第一反應是:天啊,內存用了好多,70個多G,但是我幾乎沒有運行什麼大程序啊?爲何會這樣?Linux好佔內存!緩存

  2. 自覺得很瞭解。這樣的人通常評估過會說:嗯,根據我專業的眼光看的出來,內存才用了17G左右,還有不少剩餘內存可用。buffers/cache佔用的較多,說明系統中有進程曾經讀寫過文件,可是沒關係,這部份內存是當空閒來用的。bash

  3. 真的很瞭解。這種人的反應反而讓人感受最不懂Linux,他們的反應是:free顯示的是這樣,好吧我知道了。神馬?你問我這些內存夠不夠,我固然不知道啦!我特麼怎麼知道你程序怎麼寫的?服務器

根據目前網絡上技術文檔的內容,我相信絕大多數了解一點Linux的人應該處在第二種層次。你們廣泛認爲,buffers和cached所佔用的內存空間是能夠在內存壓力較大的時候被釋放當作空閒空間用的。但真的是這樣麼?在論證這個題目以前,咱們先簡要介紹一下buffers和cached是什麼意思:網絡

什麼是buffer/cache?

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。post

明白了這兩套緩存系統的區別,就能夠理解它們究竟均可以用來作什麼了。優化

什麼是page cache?

Page cache主要用來做爲文件系統上的文件數據的緩存來用,尤爲是針對當進程對文件有read/write操做的時候。若是你仔細想一想的話,做爲能夠映射文件到內存的系統調用:mmap是否是很天然的也應該用到page cache?在當前的系統實現裏,page cache也被做爲其它文件類型的緩存設備來用,因此事實上page cache也負責了大部分的塊設備文件的緩存工做。spa

什麼是buffer cache翻譯

Buffer cache則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。這意味着某些對塊的操做會使用buffer cache進行緩存,好比咱們在格式化文件系統的時候。通常狀況下兩個緩存系統是一塊兒配合使用的,好比當咱們對一個文件進行寫操做的時候,page cache的內容會被改變,而buffer cache則能夠用來將page標記爲不一樣的緩衝區,並記錄是哪個緩衝區被修改了。這樣,內核在後續執行髒數據的回寫(writeback)時,就不用將整個page寫回,而只須要寫回修改的部分便可。

如何回收cache?

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

固然,這個文件能夠設置的值分別爲一、二、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分配器中的緩存對象。

優化後截圖以下:

2.png

相關文章
相關標籤/搜索