1)快取機制介紹
在linux系統中,為了提高檔案系統效能,核心利用一部分物理記憶體分配出緩衝區,用於快取系統操作和資料檔案,當核心收到讀寫的請求時,核心先去快取區找是否有請求的資料,有就直接返回,如果沒有則通過驅動程式直接操作磁碟。
快取機制優點:減少系統呼叫次數,降低cpu上下文切換和磁碟訪問頻率。
cpu上下文切換:cpu給每個程序一定的服務時間,當時間片用完後,核心從正在執行的程序中收回處理器,同時把程序當前執行狀態儲存下來,然後載入下乙個任務,這個過程叫做上下文切換。實質上就是被終止執行程序與待執行程序的程序切換。
2)檢視快取區及記憶體使用情況
1
2
3
4
5
[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)-空閒記憶體
由此算出空閒記憶體是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(頁面快取)
1
# echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=1
b)清理dentries(目錄快取)和inodes
1
# echo 2 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=2
c)清理pagecache、dentries和inodes
1
# 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)物件和它們占用的記憶體
1
# sync
--------------------友情提示一下----------------------
上面操作在大多數情況下都不會對系統造成傷害,只會有助於釋放不用的記憶體。
但是如果在執行這些操作時正在寫資料,那麼實際上在資料到達磁碟之前就將它從檔案快取中清除掉了,這可能會造成很不好的影響。那麼如果避免這種事情發生呢?
因此,這裡不得不提一下/proc/sys/vm/vfs_cache_pressure這個檔案,告訴核心,當清理inoe/dentry快取時應該用什麼樣的優先順序。
1
2
3
4
5
6
7
8
9
10
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:釋放所有快取
釋放完記憶體後改回去讓系統重新自動分配記憶體。
echo 0 >/proc/sys/vm/drop_caches
其他參考:
Linux系統清除快取
1 釋放記憶體的命令 echo 3 proc sys vm drop cachesdrop caches的值可以是0 3之間的數字,代表不同的含義 0 不釋放 系統預設值 1 釋放頁快取 2 釋放dentries和inodes 3 釋放所有快取 free m 看記憶體是否已經釋放掉了。total 總...
Linux系統清除快取
1 釋放記憶體的命令 echo 3 proc sys vm drop cachesdrop caches的值可以是0 3之間的數字,代表不同的含義 0 不釋放 系統預設值 1 釋放頁快取 2 釋放dentries和inodes 3 釋放所有快取 free m 看記憶體是否已經釋放掉了。total 總...
linux快取清除
page cache主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當程序對檔案有read write操作的時候。如果你仔細想想的話,作為可以對映檔案到記憶體的系統呼叫 mmap是不是很自然的也應該用到page cache?在當前的系統實現裡,page cache也被作為其它檔案型別的快取裝置...