1. 程式人生 > 其它 >Linux系統清除快取【整理】

Linux系統清除快取【整理】

總結:

1.登入root使用者

2.執行:sync命令

3.執行:echo 3 > /proc/sys/vm/drop_caches

1)快取機制介紹
在Linux系統中,為了提高檔案系統性能,核心利用一部分實體記憶體分配出緩衝區,用於快取系統操作和資料檔案,當核心收到讀寫的請求時,核心先去快取區找是否有請求的資料,有就直接返回,如果沒有則通過驅動程式直接操作磁碟。
快取機制優點:減少系統呼叫次數,降低CPU上下文切換和磁碟訪問頻率。
CPU上下文切換:CPU給每個程序一定的服務時間,當時間片用完後,核心從正在執行的程序中收回處理器,同時把程序當前執行狀態儲存下來,然後載入下一個任務,這個過程叫做上下文切換。實質上就是被終止執行程序與待執行程序的程序切換。

2)檢視快取區及記憶體使用情況

              total        used        free      shared  buff/cache   available

Mem:          64252        2924         258        3233       61069       57654

Swap:          8191         144        8047

從上面的命令結果顯示中可以看出:記憶體總共8G,已使用7725M,剩餘141M,不少的人都是這麼看的。
但其實這樣並不能作為實際的使用率。因為有了快取機制,具體演算法如下:
空閒記憶體=free(141)+buffers(74)+cached(6897)
已用記憶體=total(7866)-空閒記憶體
由此算出空閒記憶體是7112M,已用記憶體754M,這才是真正的使用率,也可參考-/+ buffers/cache這行資訊也是記憶體正確使用率。

3)快取區分buffers和cached區別
核心在保證系統能正常使用實體記憶體和資料量讀寫情況下來分配緩衝區大小。
buffers用來快取metadata及pages,可以理解為系統快取,例如,vi開啟一個檔案。
cached是用來給檔案做快取,可以理解為資料塊快取,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 測試寫入一個檔案,就會被快取到緩衝區中,當下一次再執行這個測試命令時,寫入速度會明顯很快。

4)Swap用途
Swap意思是交換分割槽,通常我們說的虛擬記憶體,是從硬碟中劃分出的一個分割槽。當實體記憶體不夠用的時候,核心就會釋放快取區(buffers/cache)裡一些長時間不用的程式,然後將這些程式臨時放到Swap中,也就是說如果實體記憶體和快取區記憶體不夠用的時候,才會用到Swap。
swap清理:
swapoff -a && swapon -a
注意:這樣清理有個前提條件,空閒的記憶體必須比已經使用的swap空間大

5)釋放快取區記憶體的方法
a)清理pagecache(頁面快取)

# echo 1 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=1

 b)清理dentries(目錄快取)和inodes

# echo 2 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=2

 c)清理pagecache、dentries和inodes

# echo 3 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=3

  上面三種方式都是臨時釋放快取的方法,要想永久釋放快取,需要在/etc/sysctl.conf檔案中配置:vm.drop_caches=1/2/3,然後sysctl -p生效即可!

另外,可以使用sync命令來清理檔案系統快取,還會清理殭屍(zombie)物件和它們佔用的記憶體

# sync

清理之後,我們 可以看一下這個檔案發生了什麼變化:

# cat /proc/sys/vm/drop_caches
3

--------------------友情提示一下----------------------
上面操作在大多數情況下都不會對系統造成傷害,只會有助於釋放不用的記憶體。
但是如果在執行這些操作時正在寫資料,那麼實際上在資料到達磁碟之前就將它從檔案快取中清除掉了,這可能會造成很不好的影響。那麼如果避免這種事情發生呢?
因此,這裡不得不提一下/proc/sys/vm/vfs_cache_pressure這個檔案,告訴核心,當清理inoe/dentry快取時應該用什麼樣的優先順序。

vfs_cache_pressure=100    這個是預設值,核心會嘗試重新宣告dentries和inodes,並採用一種相對於頁面快取和交換快取比較”合理”的比例。
減少vfs_cache_pressure的值,會導致核心傾向於保留dentry和inode快取。
增加vfs_cache_pressure的值,(即超過100時),則會導致核心傾向於重新宣告dentries和inodes
 
總之,vfs_cache_pressure的值:
小於100的值不會導致快取的大量減少
超過100的值則會告訴核心你希望以高優先順序來清理快取。
 
其實無論vfs_cache_pressure的值採用什麼值,核心清理快取的速度都是比較低的。
如果將此值設定為10000,系統將會將快取減少到一個合理的水平。

釋放記憶體前先使用sync命令做同步,以確保檔案系統的完整性,將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫對映檔案。否則在釋放快取的過程中,可能會丟失未儲存的檔案。

/proc是一個虛擬檔案系統,可以通過對它的讀寫操作作為與kernel實體間進行通訊的一種手段。也就是說可以通過修改/proc中的檔案,來對當前kernel的行為做出調整。也就是說我們可以通過調整/proc/sys/vm/drop_caches來釋放記憶體。

drop_caches的值可以是0-3之間的數字,代表不同的含義:
0:不釋放(系統預設值)
1:釋放頁快取
2:釋放dentries和inodes
3:釋放所有快取

我們使用命令 cat /proc/sys/vm/drop_caches能看到其預設值是0,但為什麼執行echo 1 > /proc/sys/vm/drop_caches命令後,執行echo 0 > /proc/sys/vm/drop_caches會報錯?:“bash: echo: write error: Invalid argument”。
個人理解:“0”只是初始值(虛擬值),而設定成“1”或“2”或“3”,只是去執行清理相應快取的一個動作,而不是狀態,所以沒必要再將/proc/sys/vm/drop_caches設定為0。另外,Linux的drop_caches只給了使用者三個選項1,2,3;所以當賦值0的時候系統報“無效論證”,因為0只能給系統用,只能重啟系統能恢復成預設值0。