dirty_background_ration 与 /proc/sys/vm/dirty_ratio
wappiness的值的大小對如何使用swap分區是有著很大的聯系的。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把內存上的數據及時的搬運到swap空間里面。linux的基本默認設置為60,具體如下:
[root@timeserver ~]# cat /proc/sys/vm/swappiness
60
你的內存在使用到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
重新加載
[root@localhot~]# sysctl -p
在linux中,可以通過修改swappiness內核參數,降低系統對swap的使用,從而提高系統的性能。
?
在調優數據庫?和應用 性能的過程中需要降低操作系統文件Cache對數據庫性能的影響,故調研了一些降低文件系統緩存大小的方法,其中一種是通過修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio兩個參數的大小來實現。看了不少相關博文的介紹,不過一直弄不清楚這兩個參數的區別在哪里,后來看了下面的一篇英文博客才大致了解了它們的不同。
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 dirtyvm.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 = 5vm.dirty_ratio = 10
?
這是虛擬機以及基于Linux的虛擬機管理程序的典型方法。?我不建議將這些參數設置為零,因為一些后臺I / O可以很好地將應用程序性能與磁盤陣列和SAN上的短時間延遲(“尖峰”)分離。
方法2:增加緩存
有些情況下,提高緩存會對性能產生積極影響。這些情況是Linux guest虛擬機中包含的數據并不重要且可能丟失的情況,通常是應用程序反復寫入或以可重復的突發形式寫入相同文件的情況。理論上,通過允許更多臟頁存在于內存中,您將在緩存中反復重寫相同的塊,并且只需要經常對實際磁盤進行一次寫入。為此,我們提出參數:
vm.dirty_background_ratio = 50vm.dirty_ratio = 80
?
有時人們也會增加vm.dirty_expire_centisecs參數以允許更多時間在緩存中。除了數據丟失風險增加之外,如果緩存已滿并且需要降級,您還會面臨長時間I / O暫停的風險,因為在大型VM上,緩存中會有大量數據。
方法3:兩種方式
還有一些情況下,系統必須處理不頻繁的突發流量以減慢磁盤(一小時之前的批處理作業,午夜,寫入Raspberry Pi上的SD卡等)。在這種情況下,一種方法可能是允許所有寫入I / O都存放在緩存中,以便后臺刷新操作可以隨時間異步處理它:
vm.dirty_background_ratio = 5vm.dirty_ratio = 80
?
這里后臺進程將在達到5%上限時立即開始寫入,但系統不會強制同步I / O直到達到80%滿。從那里你可以調整系統RAM和vm.dirty_ratio的大小,以便能夠使用所有寫入的數據。同樣,在磁盤上存在數據一致性的權衡,這轉化為數據風險。購買UPS并確保在UPS電量耗盡之前可以降級緩存。:)
轉載于:https://www.cnblogs.com/fengjian2016/p/10330242.html
總結
以上是生活随笔為你收集整理的dirty_background_ration 与 /proc/sys/vm/dirty_ratio的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python爬虫从入门到放弃(十二)之
- 下一篇: js、jquery、h5、css等简记