Linux 釋放cache化緩存


Linux 釋放cache化緩存

 free -g查看空余內存以及已使用內存

原文  https://blog.csdn.net/tomspcc/article/details/78131468


機械硬盤的讀寫速率大多在 70M/s 左右,如果把經常讀寫的文件放在內存中,這會大幅提高文件的讀寫速率,提高系統的效率。尤其是訪問量大的網站,這樣解決了磁盤IO的問題
不過現在都是固態硬盤,常見的讀寫速率是 0.5G/s ~ 1 G/s ~ 3.5G/s 或者更高,不過這速度在內存的速度上還是很遜色的,據說DDR3,內存數據帶寬就=12.8GB/s

對於個人使用的小內存VPS,cache內存持久占用過高,還是影響速度的

swap分區的作用:
Linux內核為了提高讀寫效率與速率,會將文件在內存中進行緩存,這部分內存就是Cache Memory(緩存內存)。即使你的程序運行結束后,Cache Memory也不會自動釋放。這就會導致你在Linux系統中程序頻繁讀寫文件后,你會發現可用物理內存變少。當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什么操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap分區中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行Swap交換。所以swap分區不被占用或者占用很少,說明現在系統內存夠用,運行還算良好,不會影響系統運行。
首先,當物理內存不足以支撐系統和應用程序(進程)的運作時,這個Swap交換分區可以用作臨時存放使用率不高的內存分頁,把騰出的內存交給急需的應用程序(進程)使用。有點類似機房的UPS系統,雖然正常情況下不需要使用,但是異常情況下, Swap交換分區還是會發揮其關鍵作用。
其次,即使你的服務器擁有足夠多的物理內存,也有一些程序會在它們初始化時殘留的極少再用到的內存分頁內容轉移到 swap 空間,以此讓出物理內存空間。對於有發生內存泄漏幾率的應用程序(進程),Swap交換分區更是重要,因為誰也不想看到由於物理內存不足導致系統崩潰。
最后,現在很多個人用戶在使用Linux,有些甚至是PC的虛擬機上跑Linux系統,此時可能常用到休眠(Hibernate),這種情況下也是推薦划分Swap交換分區的。
其實少量使用Swap交換空間是不會影響性能,只有當RAM資源出現瓶頸或者內存泄露,進程異常時導致頻繁、大量使用交換分區才會導致嚴重性能問題。另外使用Swap交換分區頻繁,還會引起kswapd0進程(虛擬內存管理中, 負責換頁的)耗用大量CPU資源,導致CPU飆升。

buffers和cache的區別:
為了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換),還采取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,后者針對文件inode的讀寫。這些Cache有效縮短了I/O系統調用(比如read,write,getdents)的時間。
磁盤的操作有邏輯級(文件系統)和物理級(磁盤塊),這兩種Cache就是分別緩存邏輯和物理級數據的。
Page cache實際上是針對文件系統的,是文件的緩存,在文件層面上的數據會緩存到page cache。文件的邏輯層需要映射到實際的物理磁盤,這種映射關系由文件系統來完成。當page cache的數據需要刷新時,page cache中的數據交給buffer cache,因為Buffer Cache就是緩存磁盤塊的。但是這種處理在2.6版本的內核之后就變的很簡單了,沒有真正意義上的cache操作。
Buffer cache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤進行操作的數據會緩存到buffer cache中,例如,文件系統的元數據都會緩存到buffer cache中。

Buffer:緩沖區,一個用於存儲速率不同步的設備或優先級不同的設備之間傳輸數據的區域。通過緩沖區,可以使進程之間的相互等待變少,從而使從速率慢的設備讀入數據時,速率快的設備的操作進程不發生間斷。
緩沖(buffers)是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。linux有一個守護進程定 期清空緩沖內容(即寫如磁盤),也可以通過sync命令手動清空緩沖。
簡單說來,page cache用來緩存文件數據,buffer cache用來緩存磁盤數據。在有文件系統的情況下,對文件操作,那么數據會緩存到page cache,如果直接采用dd等工具對磁盤進行讀寫,那么數據會緩存到buffer cache。
所以我們看linux,只要不用swap的交換空間,就不用擔心自己的內存太少.如果常常swap用很多,可能你就要考慮加物理內存了.這也是linux看內存是否夠用的標准.

Cache: 高速緩存,是位於CPU與主內存間的一種容量較小但速率很高的存儲器。由於CPU的速率遠高於主內存,CPU直接從內存中存取數據要等待一定時間周 期,Cache中保存着CPU剛用過或循環使用的一部分數據,當CPU再次使用該部分數據時可從Cache中直接調用,這樣就減少了CPU的等待時間,提 高了系統的效率。Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache集成在CPU內部,L2 Cache早期一般是焊在主板上,現在也都集成在CPU內部,常見的容量有256KB或512KB L2 Cache。
如果 cache 的值很大,說明cache住的文件數很多。如果頻繁訪問到的文件都能被cache住,那么磁盤的讀IO bi會非常小。
緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排,直至從中刪除。

手工釋放內存區緩存(本來cache就是為了提升系統性能,緩解磁盤的壓力,是linux區別於windows的優勢所在,如果真有必要可手工釋放一下,也不要永久的的讓cache作用無法發揮)
# sync; echo 1 > /proc/sys/vm/drop_caches  #釋放 pagecache
# sync; echo 2 > /proc/sys/vm/drop_caches    #釋放  dentries 和 inodes:
# sync; echo 3 > /proc/sys/vm/drop_caches  #釋放 pagecache,dentries 和 inodes:
# sync; echo 0 > /proc/sys/vm/drop_caches  #默認0為不釋放,讓系統自己調節

操作前要使用sync,強制將內存中內容寫入硬盤,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件。這一步是確保第二步的安全性。防止數據或操作丟失。

linux內核2.6的版本執行上述的操作都沒問題的,但是到了內核3系列,就不能執行echo 0 >/proc/sys/vm/drop_caches的操作了,這是一個坑,重啟才能改回去

# echo 0 >/proc/sys/vm/drop_caches
-bash: echo: write error: Invalid argument
# sysctl -a|grep vm.drop_caches  #內核中有這個參數
vm.drop_caches = 3
# sysctl -w vm.drop_caches=0  #也寫不進去,這個在內核2.6系列上面可以的,這也是手工釋放內存緩存的另一種形式(sysctl -w vm.drop_caches=3)
error: "Invalid argument" setting key "vm.drop_caches"
# sysctl -w vm.drop_caches=1  #執行其他的是沒問題的,但是就是執行0的插入不可以,要重啟服務器。
vm.drop_caches = 1

swap清理:  swapoff -a && swapon -a
注意:這樣清理有個前提條件,空閑的內存必須比已經使用的swap空間大。

上述只是暫時生效,但是系統重啟后,系統還是按照自己默認的方法去使用緩存,有的網友會寫定時任務腳本晚上去釋放一下內存cache,還有一種暴力的永久生效的方法,使cache的作用基本無法發揮。

修改/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
kernel.maxvnodes = 3

#下面是相關解釋:
/proc/sys/vm/dirty_ratio
這個參數控制文件系統的文件系統寫緩沖區的大小,單位是百分比,表示系統內存的百分比,表示當寫緩沖使用到系統內存多少的時候,開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上缺省是 10。設1加速程序速率

/proc/sys/vm/dirty_background_ratio
這個參數控制文件系統的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統內存的百分比,意思是當寫緩沖使用到系統內存多少的時候,pdflush開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上缺省是 5

/proc/sys/vm/dirty_writeback_centisecs
這個參數控制內核的臟數據刷新進程pdflush的運行間隔。單位是 1/100 秒。缺省數值是500,也就是 5 秒。如果你的系統是持續地寫入動作,那么實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操

 

/proc/sys/vm/dirty_expire_centisecs

這個參數聲明Linux內核寫緩沖區里面的數據多“舊”了之后,pdflush進程就開始考慮寫到磁盤中去。單位是 1/100秒。缺省是 30000,也就是 30秒的數據就算舊了,將會刷新磁盤。對於特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。建議設置為 1500,也就是15秒算舊。

/proc/sys/vm/drop_caches
釋放已經使用的cache

/proc/sys/vm/page-cluster
該文件表示在寫一次到swap區的時候寫入的頁面數量,0表示1頁,1表示2頁,2表示4頁。

/proc/sys/vm/swapiness
該文件表示系統進行交換行為的程度,數值(0-100)越高,越可能發生磁盤交換。

/proc/sys/vm/vfs_cache_pressure

該文件表示內核回收用於directory和inode cache內存的傾向


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM