Linux下的快取機制free及清理buffer/cache/swap的方法梳理

不一樣的天空w發表於2017-10-17

官網解析

https://www.kernel.org/doc/Documentation/sysctl/vm.txt?spm=a2c6h.13066369.0.0.87bdc164Q4VjlB&file=vm.txt

Linux的Cache Memory(快取記憶體)機制

https://www.cnblogs.com/newjiang/p/9541223.html

(1)快取機制

為了提高檔案系統效能,核心利用一部分實體記憶體分配出緩衝區,用於快取系統操作和資料檔案,當核心收到讀寫的請求時,核心先去快取區找是否有請求的資料,有就直接返回,如果沒有則透過驅動程式直接操作磁碟。

快取機制優點:減少系統呼叫次數,降低CPU上下文切換和磁碟訪問頻率。

CPU上下文切換:CPU給每個程式一定的服務時間,當時間片用完後,核心從正在執行的程式中收回處理器,同時把程式當前執行狀態儲存下來,然後載入下一個任務,這個過程叫做上下文切換。實質上就是被終止執行程式與待執行程式的程式切換。

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

[root@localhost ~]# free -m

total used free shared buffers cached

Mem: 7866 7725 141 19 74 6897

-/+ buffers/cache : 752 7113

Swap : 16382 32 16350

可以看到記憶體總共8G,已使用7725M,剩餘141M,不少的人都是這麼看的,這樣並不能作為實際的使用率。因為有了快取機制,具體該怎麼算呢?
空閒記憶體=free(141)+buffers(74)+cached(6897)
已用記憶體=total(7866)-空閒記憶體
由此算出 空閒記憶體 7112 M,已用記憶體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)直接改變核心執行引數
Linux釋放記憶體的命令:
sync
echo 1 > /proc/sys/vm/drop_caches

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

釋放完記憶體後改回去讓系統重新自動分配記憶體。
echo 0 >/proc/sys/vm/drop_caches

free -m #看記憶體是否已經釋放掉了。

如果我們需要釋放所有快取,就輸入下面的命令:
echo 3 > /proc/sys/vm/drop_caches

b)也可以使用sysctl重置核心執行引數

sysctl -w vm.drop_caches=3

注意: 這兩個方式都是臨時生效 永久生效需新增sysctl.conf檔案中 ,一般寫成指令碼手動清理,建議不要清理。
修改/etc/sysctl.conf 新增如下選項後就不會記憶體持續增加
vm.dirty_ratio = 1
vm.dirty_background_ratio=1
vm.dirty_writeback_centisecs=2
vm.dirty_expire_centisecs=3
vm.drop_caches=3
vm.swappiness =100
vm.vfs_cache_pressure=163
vm.overcommit_memory=2
vm.lowmem_reserve_ratio=32 32 8
kern.maxvnodes=3

上面的設定比較粗暴,使cache的作用基本無法發揮。需要根據機器的狀況進行適當的調節尋找最佳的折衷。

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

相關文章