dirty_background_ration 與 /proc/sys/vm/dirty_ratio

wappiness的值的大小對如何使用swap分區是有着很大的聯繫的。swappiness=0的時候表示最大限度使用物理內存,而後纔是 swap空間,swappiness=100的時候表示積極的使用swap分區,而且把內存上的數據及時的搬運到swap空間裏面。linux的基本默認設置爲60,具體以下:php

[root@timeserver ~]# cat /proc/sys/vm/swappiness
60linux

你的內存在使用到100-60=40%的時候,就開始出現有交換分區的使用,內存的速度會比磁盤快不少,這樣會加大系統io,同時造的成大量頁的換進換出,嚴重影響系統的性能,因此咱們在操做系統層面,要儘量使用內存,對該參數進行調整。數據庫

 

臨時調整的方法以下,咱們調成10:
[root@timeserver ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@timeserver ~]# cat /proc/sys/vm/swappiness
10

緩存

須要在/etc/sysctl.conf修改,加上:
[root@timeserver ~]# cat /etc/sysctl.conf安全

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10服務器


從新加載app

[root@localhot~]# sysctl -p異步

在linux中,能夠經過修改swappiness內核參數,下降系統對swap的使用,從而提升系統的性能。性能

 

在調優數據庫 和應用 性能的過程當中須要下降操做系統文件Cache對數據庫性能的影響,故調研了一些下降文件系統緩存大小的方法,其中一種是經過修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio兩個參數的大小來實現。看了很多相關博文的介紹,不過一直弄不清楚這兩個參數的區別在哪裏,後來看了下面的一篇英文博客才大體瞭解了它們的不一樣。spa

vm.dirty_background_ratio:這個參數指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將必定緩存的髒頁異步地刷入外存;
 
vm.dirty_ratio:而這個參數則指定了當文件系統緩存髒頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存髒頁(由於此時髒頁數量已經比較多,爲了不數據丟失須要將必定髒頁刷入外存);在此過程當中不少應用進程可能會由於系統轉而處理文件IO而阻塞。
 
以前一直錯誤的一位dirty_ratio的觸發條件不可能達到,由於每次確定會先達到vm.dirty_background_ratio的條件,後來才知道本身理解錯了。確實是先達到vm.dirty_background_ratio的條件而後觸發flush進程進行異步的回寫操做,可是這一過程當中應用進程仍然能夠進行寫操做,若是多個應用進程寫入的量大於flush進程刷出的量那天然會達到vm.dirty_ratio這個參數所設定的坎,此時操做系統會轉入同步地處理髒頁的過程,阻塞應用進程
 
 
 

關於vm.swappiness 參數設定, 文件緩存是一項重要的性能改進,在大多數狀況下,讀緩存是一個明顯的勝利,與使用RAM的應用程序直接平衡。寫緩存比較棘手。Linux內核將磁盤寫入緩存,並隨着時間的推移異步將它們刷新到磁盤。這對加速磁盤I / O有很好的效果,但風險很大。當數據未寫入磁盤時,丟失數據的可能性會增長。

也有不少I / O也有可能壓倒緩存。曾經一次將大量數據寫入磁盤,而且在嘗試處理全部數據時看到系統出現大量暫停?這些暫停是緩存決定異步寫入太多數據的結果(做爲非阻塞後臺操做,讓應用程序進程繼續),並切換到同步寫入(阻塞並使進程等到I / O致力於磁盤)。固然,文件系統也必須保留寫入順序,所以當它開始同步寫入時,它首先必須降級緩存。所以長時間停頓。

好處是這些是可控制的選項,根據您的工做負載和數據,您能夠決定如何設置它們。讓咱們來看看:

$ 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 = 300

vm.dirty_background_ratio
 是能夠填充「髒」頁面的系統內存的百分比 - 仍然須要寫入磁盤的內存頁 - 在pdflush / flush / kdmflush後臺進程啓動以將其寫入磁盤以前。個人例子是10%,因此若是虛擬服務器有32 GB的內存,那麼3.2 GB的數據能夠在完成任務以前就位於RAM中。

vm.dirty_ratio 是在必須將全部內容提交到磁盤以前能夠用髒頁填充的絕對最大系統內存量。當系統到達此點時,全部新的I / O塊都會被阻塞,直到髒頁被寫入磁盤。這一般是長I / O暫停的來源,可是能夠防止太多數據在內存中被不安全地緩存。

vm.dirty_background_bytes 和  vm.dirty_bytes 是另外一種指定這些參數的方法。若是設置_bytes版本,則_ratio版本將變爲0,反之亦然。

vm.dirty_expire_centisecs 是在須要寫入以前緩存中的某些內容。在這種狀況下,它是30秒。當pdflush / flush / kdmflush進程啓動時,他們將檢查髒頁的年齡,若是它比這個值舊,它將被異步寫入磁盤。因爲在內存中保存髒頁不安全,所以也能夠防止數據丟失。

vm.dirty_writeback_centisecs 是pdflush / flush / kdmflush進程喚醒的頻率,並檢查是否須要完成工做。

您還能夠在/ proc / vmstat中查看頁面緩存的統計信息:

$ cat /proc/vmstat | egrep "dirty|writeback" 
nr_dirty 878
nr_writeback 0
nr_writeback_temp 0

 

在個人狀況下,我有878個髒頁等待寫入磁盤。

方法1:減小緩存

與計算機世界中的大多數事情同樣,您如何調整這些取決於您要作的事情。在許多狀況下,咱們的快速磁盤子系統都有本身的大電池備份NVRAM緩存,所以保留OS頁面緩存中的內容是有風險的。讓咱們嘗試以更及時的方式將I / O發送到陣列,並減小咱們本地操做系統的機會,借用服務行業中的短語,「 在雜草中」。爲此,咱們下降vm.dirty_background_ratio和vm .dirty_ratio經過向/etc/sysctl.conf添加新數字並使用「sysctl -p」從新加載:

vm.dirty_background_ratio = 5 
vm.dirty_ratio = 10

 

這是虛擬機以及基於Linux的虛擬機管理程序的典型方法。 我不建議將這些參數設置爲零,由於一些後臺I / O能夠很好地將應用程序性能與磁盤陣列和SAN上的短期延遲(「尖峯」)分離。

方法2:增長緩存

有些狀況下,提升緩存會對性能產生積極影響。這些狀況是Linux guest虛擬機中包含的數據並不重要且可能丟失的狀況,一般是應用程序反覆寫入或以可重複的突發形式寫入相同文件的狀況。理論上,經過容許更多髒頁存在於內存中,您將在緩存中反覆重寫相同的塊,而且只須要常常對實際磁盤進行一次寫入。爲此,咱們提出參數:

vm.dirty_background_ratio = 50 
vm.dirty_ratio = 80

 

有時人們也會增長vm.dirty_expire_centisecs參數以容許更多時間在緩存中。除了數據丟失風險增長以外,若是緩存已滿而且須要降級,您還會面臨長時間I / O暫停的風險,由於在大型VM上,緩存中會有大量數據。

方法3:兩種方式

還有一些狀況下,系統必須處理不頻繁的突發流量以減慢磁盤(一小時以前的批處理做業,午夜,寫入Raspberry Pi上的SD卡等)。在這種狀況下,一種方法多是容許全部寫入I / O都存放在緩存中,以便後臺刷新操做能夠隨時間異步處理它:

vm.dirty_background_ratio = 5 
vm.dirty_ratio = 80

 

這裏後臺進程將在達到5%上限時當即開始寫入,但系統不會強制同步I / O直到達到80%滿。從那裏你能夠調整系統RAM和vm.dirty_ratio的大小,以便可以使用全部寫入的數據。一樣,在磁盤上存在數據一致性的權衡,這轉化爲數據風險。購買UPS並確保在UPS電量耗盡以前能夠降級緩存。:)

相關文章
相關標籤/搜索