Linux 釋放cache化緩存

Linux 釋放cache化緩存


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


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

對於我的使用的小內存VPS,cache內存持久佔用太高,仍是影響速度的linux

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_centisecswindows

這個參數聲明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內存的傾向api

相關文章
相關標籤/搜索