1)緩存機制介紹
在Linux系統中,爲了提升文件系統性能,內核利用一部分物理內存分配出緩衝區,用於緩存系統操做和數據文件,當內核收到讀寫的請求時,內核先去緩存區找是否有請求的數據,有就直接返回,若是沒有則經過驅動程序直接操做磁盤。
緩存機制優勢:減小系統調用次數,下降CPU上下文切換和磁盤訪問頻率。
CPU上下文切換:CPU給每一個進程必定的服務時間,當時間片用完後,內核從正在運行的進程中收回處理器,同時把進程當前運行狀態保存下來,而後加載下一個任務,這個過程叫作上下文切換。實質上就是被終止運行進程與待運行進程的進程切換。node
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)-空閒內存
由此算出空閒內存是7112M,已用內存754M,這纔是真正的使用率,也可參考-/+ buffers/cache這行信息也是內存正確使用率。bash
3)緩存區分buffers和cached區別
內核在保證系統能正常使用物理內存和數據量讀寫狀況下來分配緩衝區大小。
buffers用來緩存metadata及pages,能夠理解爲系統緩存,例如,vi打開一個文件。
cached是用來給文件作緩存,能夠理解爲數據塊緩存,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 測試寫入一個文件,就會被緩存到緩衝區中,當下一次再執行這個測試命令時,寫入速度會明顯很快。ide
4)Swap用途
Swap意思是交換分區,一般咱們說的虛擬內存,是從硬盤中劃分出的一個分區。當物理內存不夠用的時候,內核就會釋放緩存區(buffers/cache)裏一些長時間不用的程序,而後將這些程序臨時放到Swap中,也就是說若是物理內存和緩存區內存不夠用的時候,纔會用到Swap。性能
swap清理:
swapoff -a && swapon -a
注意:這樣清理有個前提條件,空閒的內存必須比已經使用的swap空間大測試
5)釋放緩存區內存的方法
a)清理pagecache(頁面緩存)spa
# echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_caches=1code
b)清理dentries(目錄緩存)和inodes
orm
# 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
vfs_cache_pressure=100 這個是默認值,內核會嘗試從新聲明dentries和inodes,並採用一種相對於頁面緩存和交換緩存比較」合理」的比例。--------------------友情提示一下----------------------
上面操做在大多數狀況下都不會對系統形成傷害,只會有助於釋放不用的內存。
可是若是在執行這些操做時正在寫數據,那麼實際上在數據到達磁盤以前就將它從文件緩存中清除掉了,這可能會形成很很差的影響。那麼若是避免這種事情發生呢?
所以,這裏不得不提一下/proc/sys/vm/vfs_cache_pressure這個文件,告訴內核,當清理inoe/dentry緩存時應該用什麼樣的優先級。
減小vfs_cache_pressure的值,會致使內核傾向於保留dentry和inode緩存。
增長vfs_cache_pressure的值,(即超過100時),則會致使內核傾向於從新聲明dentries和inodes
總之,vfs_cache_pressure的值:
小於100的值不會致使緩存的大量減小
超過100的值則會告訴內核你但願以高優先級來清理緩存。
其實不管vfs_cache_pressure的值採用什麼值,內核清理緩存的速度都是比較低的。
若是將此值設置爲10000,系統將會將緩存減小到一個合理的水平。