檔案快取是提公升效能的重要手段。毋庸置疑,讀快取(read caching)在絕大多數情況下是有益無害的(程式可以直接從ram中讀取資料),而寫快取(write caching)則相對複雜。linux核心將寫磁碟的操作分解成了,先寫快取,每隔一段時間再非同步地將快取寫入磁碟。這提公升了io讀寫的速度,但存在一定風險。資料沒有及時寫入磁碟,所以存在資料丟失的風險。
同樣,也存在cache被寫爆的情況。還可能出現一次性往磁碟寫入過多資料,以致使系統卡頓。之所以卡頓,是因為系統認為,快取太大用非同步的方式來不及把它們都寫進磁碟,於是切換到同步的方式寫入。(非同步,即寫入的同時程序能正常執行;同步,即寫完之前其他程序不能工作)。
好訊息是,你可以根據實際情況,對寫快取進行配置。
可以看一下這些引數:
[root@host ~]# sysctl -a | grep dirty
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.dirty_background_ratio是記憶體可以填充「髒資料」的百分比。這些「髒資料」在稍後是會寫入磁碟的,pdflush/flush/kdmflush這些後台程序會稍後清理髒資料。舉乙個例子,我有32g記憶體,那麼有3.2g的記憶體可以待著記憶體裡,超過3.2g的話就會有後來程序來清理它。
vm.dirty_ratio是絕對的髒資料限制,記憶體裡的髒資料百分比不能超過這個值。如果髒資料超過這個數量,新的io請求將會被阻擋,直到髒資料被寫進磁碟。這是造成io卡頓的重要原因,但這也是保證記憶體中不會存在過量髒資料的保護機制。
vm.dirty_expire_centisecs指定髒資料能存活的時間。在這裡它的值是30秒。當 pdflush/flush/kdmflush 進行起來時,它會檢查是否有資料超過這個時限,如果有則會把它非同步地寫到磁碟中。畢竟資料在記憶體裡待太久也會有丟失風險。
vm.dirty_writeback_centisecs指定多長時間 pdflush/flush/kdmflush 這些程序會起來一次。
可以通過下面方式看記憶體中有多少髒資料:
[root@host ~]# cat /proc/vmstat | egrep "dirty|writeback"
nr_dirty 69
nr_writeback 0
nr_writeback_temp 0
這說明了,我有69頁的髒資料要寫到磁碟裡。
你可以針對要做的事情,來制定乙個合適的值。
在一些情況下,我們有快速的磁碟子系統,它們有自帶的帶備用電池的nvram caches,這時候把資料放在作業系統層面就顯得相對高風險了。所以我們希望系統更及時地往磁碟寫資料。
可以在/etc/sysctl.conf中加入下面兩行,並執行"sysctl -p"
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
這是虛擬機器的典型應用。不建議將它設定成0,畢竟有點後台io可以提公升一些程式的效能。
在一些場景中增加cache是有好處的。例如,資料不重要丟了也沒關係,而且有程式重複地讀寫乙個檔案。允許更多的cache,你可以更多地在記憶體上進行讀寫,提高速度。
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
有時候還會提高vm.dirty_expire_centisecs 這個引數的值,來允許髒資料更長時間地停留。
有時候系統需要應對突如其來的高峰資料,它可能會拖慢磁碟。(比如說,每個小時開始時進行的批量操作等)
這個時候需要容許更多的髒資料存到記憶體,讓後台程序慢慢地通過非同步方式將資料寫到磁碟當中。
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
這個時候,後台進行在髒資料達到5%時就開始非同步清理,但在80%之前系統不會強制同步寫磁碟。這樣可以使io變得更加平滑。 Linux cache介紹及控制
有關cache 檔案快取是提公升效能的重要手段。毋庸置疑,讀快取 read caching 在絕大多數情況下是有益無害的 程式可以直接從ram中讀取資料 而寫快取 write caching 則相對複雜。linux核心將寫磁碟的操作分解成了,先寫快取,每隔一段時間再非同步地將快取寫入磁碟。這提公升了...
控制語句的介紹
流程控制語句是用來控制程式中各語句執行順序的語句,流程控制語句是整個程式的核心。它在程式中起到的作用是控制程式中各語句執行的順序。控制語句中呢可以分為三類,實際是兩類。第一類是順序結構 第二類是選擇結構 第三類是迴圈結構。1.順序結構 代表 先執行a,在執行b 的邏輯。它就是乙個天然的順序它就是給你...
SpringShiro許可權控制介紹
apache shiro是乙個功能強大 靈活的,開源的安全框架。它可以乾淨利落地處理身份驗證 授權 企業會話管理和加密。apache shiro的首要目標是易於使用和理解。安全通常很複雜,甚至讓人感到很痛苦,但是shiro卻不是這樣子的。乙個好的安全框架應該遮蔽複雜性,向外暴露簡單 直觀的api,來...