天天看點

linux flush 保證 磁盤,Linux 磁盤I/O優化

Linux 檔案緩存是一項重要的性能改進,在大多數情況下,讀緩存在絕大多數情況下是有益無害的(程式可以直接從RAM中讀取資料)。寫緩存比較複雜,Linux核心将磁盤寫入緩存,過段時間再異步将它們重新整理到磁盤。這對加速磁盤I/O有很好的效果,但是當資料未寫入磁盤時,丢失資料的可能性會增加。

當然,也存在緩存被寫爆的情況,還可能出現一次性往磁盤寫入過多資料,以緻使系統卡頓。這些卡頓是因為系統認為,緩存太大用異步的方式來不及把它們都寫進磁盤,于是切換到同步的方式寫入。

這些都是可控制的選項,根據工作負載和資料,可以決定如何設定它們:

sysctl -a | grep dirty

$ sysctl -a | grep dirty

vm.dirty_background_bytes = 0

vm.dirty_background_ratio = 10

vm.dirty_bytes = 0

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 20

vm.dirty_writeback_centisecs = 500

vm.dirtytime_expire_seconds = 43200

或者

# sysctl -a | grep dirty

sysctl: reading key "net.ipv6.conf.all.stable_secret"

sysctl: reading key "net.ipv6.conf.default.stable_secret"

sysctl: reading key "net.ipv6.conf.eth0.stable_secret"

sysctl: reading key "net.ipv6.conf.eth1.stable_secret"

sysctl: reading key "net.ipv6.conf.lo.stable_secret"

vm.dirty_background_bytes = 0

vm.dirty_background_ratio = 10

vm.dirty_bytes = 0

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 30

vm.dirty_writeback_centisecs = 500

以上參數的源檔案位置為:

ls -l /proc/sys/vm/dirty_*

# ls -l /proc/sys/vm/dirty_*

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_background_bytes

-rw-r--r-- 1 root root 0 Sep 26 07:59 /proc/sys/vm/dirty_background_ratio

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_bytes

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_expire_centisecs

-rw-r--r-- 1 root root 0 Sep 26 07:59 /proc/sys/vm/dirty_ratio

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_writeback_centisecs

參數解析:

1、vm.dirty_background_ratio

記憶體可以填充髒資料的百分比。這些髒資料稍後會寫入磁盤,pdflush/flush/kdmflush這些背景程序會稍後清理髒資料。比如,我有32G記憶體,那麼有3.2G(10%的比例)的髒資料可以待着記憶體裡,超過3.2G的話就會有背景程序來清理。

2、vm.dirty_ratio

可以用髒資料填充的絕對最大系統記憶體量,當系統到達此點時,必須将所有髒資料送出到磁盤,同時所有新的I/O塊都會被阻塞,直到髒資料被寫入磁盤。這通常是長I/O卡頓的原因,但這也是保證記憶體中不會存在過量髒資料的保護機制。

3、vm.dirty_background_bytes和vm.dirty_bytes

另一種指定這些參數的方法。如果設定 xxx_bytes版本,則 xxx_ratio版本将變為0,反之亦然。

4、vm.dirty_expire_centisecs

指定髒資料能存活的時間。在這裡它的值是30秒。當 pdflush/flush/kdmflush 在運作的時候,他們會檢查是否有資料超過這個時限,如果有則會把它異步地寫到磁盤中。畢竟資料在記憶體裡待太久也會有丢失風險。

5、vm.dirty_writeback_centisecs

指定多長時間 pdflush/flush/kdmflush 這些程序會喚醒一次,然後檢查是否有緩存需要清理。

可以通過下面方式看記憶體中有多少髒資料:

cat /proc/vmstat | egrep "dirty|writeback"

$ cat /proc/vmstat | egrep "dirty|writeback"

nr_dirty 106

nr_writeback 0

nr_writeback_temp 0

nr_dirty_threshold 3934012

nr_dirty_background_threshold 1964604

說明:以上結果,顯示一共有106頁的髒資料

dirty_ratio 與 dirty_background_ratio 差別

檔案系統緩存dirty_ratio與dirty_background_ratio兩個參數差別

這兩天在調優資料庫性能的過程中,需要降低作業系統檔案Cache對資料庫性能的影響,故調研了一些降低檔案系統緩存大小的方法,其中一種是通過修改 /proc/sys/vm/dirty_background_ratio 以及 /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這個參數所設定的門檻值,此時作業系統會轉入同步地處理髒頁的過程,阻塞應用程序。

Linux 磁盤I/O優化

1、減少緩存

在很多情況下,有快速的磁盤子系統,它們有自己的大電池支援的NVRAM緩存,是以将東西儲存在系統頁面緩存中是有風險的。讓我們嘗試以更及時的方式向磁盤發送I/O,并減少本地作業系統(借用服務行業的話)“陷入困境”的機會。為了做到這一點,我們減小/etc/sysctl.conf中vm.dirty_background_ratio和vm.dirty_ratio的數值,并執行 sysctl -p指令:

vm.dirty_background_ratio = 5

vm.dirty_ratio = 10

這是基于Linux的虛拟機管理程式的典型方法。

不建議将這些參數設定為0,一些背景I/O可以很好地将應用程式性能與磁盤陣列在SAN(“峰值”)上的較短時間的較高延遲解耦。

2、增加緩存

在某些情況下,顯著提高緩存對性能有積極的影響。在這些情況下,Linux客戶機上包含的資料不是關鍵的,可能會丢失,而且應用程式通常會重複或以可重複的方式寫入相同的檔案。理論上,通過允許記憶體中存在更多髒頁,你将在緩存中一遍又一遍地重寫相同的塊,隻需要每隔一段時間向實際磁盤寫一次。為此,我們提出了以下參數:

vm.dirty_background_ratio = 50

vm.dirty_ratio = 80

有時候還會提高vm.dirty_expire_centisecs 這個參數的值,來允許髒資料更長時間地停留。除了增加資料丢失的風險之外,如果緩存已滿并需要同步,還會有長時間I/O卡頓的風險,因為在大型虛拟機緩存中有大量資料。

3、增減都用

有時候系統需要應對突如其來的高峰資料,它可能會拖慢磁盤。

比如說:每小時或者午夜進行批處理作業、在Raspberry Pi上寫SD卡等等。

這種情況下,可以允許大量的寫I/O存儲在緩存中,這樣背景重新整理操作就可以慢慢異步處理它:

vm.dirty_background_ratio = 5

vm.dirty_ratio = 80

這個時候,系統背景程序在髒資料達到5%時就開始異步清理,但在80%之前系統不會強制同步寫磁盤。在此基礎上,你隻需要調整RAM和vm.dirty_ratio大小以便能緩存所有的寫資料。當然,磁盤上的資料一緻性也存在一定風險。

總結

無論你選擇哪種方式,都應該始終收集資料來支援你的更改,并幫助你确定是在改進還是變得更糟。

可以從應用程式,/proc/vmstat, /proc/meminfo, iostat, vmstat 以及 /proc/sys/vm 裡面獲得大量有用資訊。