Linux PageCache的幾個選項


有關Cache

文件緩存是提升性能的重要手段。毋庸置疑,讀緩存(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 這些進程會起來一次。

In more simpler words:

vm.dirty_background_ratio is the percentage of system memory which when dirty then system can start writing data to the disks.

vm.dirty_ratio is percentage of system memory which when dirty, the process doing writes would block and write out dirty pages to the disks.

 

可以通過下面方式看內存中有多少臟數據:

[root@host ~]# cat /proc/vmstat | egrep "dirty|writeback"
nr_dirty 69
nr_writeback 0
nr_writeback_temp 0

這說明了,我有69頁的臟數據要寫到磁盤里。

 


情景1:減少Cache

你可以針對要做的事情,來制定一個合適的值。
在一些情況下,我們有快速的磁盤子系統,它們有自帶的帶備用電池的NVRAM caches,這時候把數據放在操作系統層面就顯得相對高風險了。所以我們希望系統更及時地往磁盤寫數據。
可以在/etc/sysctl.conf中加入下面兩行,並執行"sysctl -p"

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

這是虛擬機的典型應用。不建議將它設置成0,畢竟有點后台IO可以提升一些程序的性能。


情景2:增加Cache

在一些場景中增加Cache是有好處的。例如,數據不重要丟了也沒關系,而且有程序重復地讀寫一個文件。允許更多的cache,你可以更多地在內存上進行讀寫,提高速度。

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

有時候還會提高vm.dirty_expire_centisecs 這個參數的值,來允許臟數據更長時間地停留。


情景3:增減兼有

有時候系統需要應對突如其來的高峰數據,它可能會拖慢磁盤。(比如說,每個小時開始時進行的批量操作等)
這個時候需要容許更多的臟數據存到內存,讓后台進程慢慢地通過異步方式將數據寫到磁盤當中。

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

這個時候,后台進行在臟數據達到5%時就開始異步清理,但在80%之前系統不會強制同步寫磁盤。這樣可以使IO變得更加平滑。


從/proc/vmstat, /proc/meminfo, /proc/sys/vm中可以獲得更多資訊來作出調整。

 

轉自:https://feichashao.com/dirty_ratio_and_dirty_background_ratio/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM