有關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/