­

2021-2-27:Linux 下如何優化 Java MMAP 寫入

主要是調整 pdflush 相關參數。

在linux操作系統中,寫操作是異步的,即寫操作返回的時候數據並沒有真正寫到磁盤上,而是先寫到了系統cache里,隨後由pdflush內核線程將系統中的臟頁寫到磁盤上,在下面幾種情況下:

  1. 定時方式: 定時機制定時喚醒pdflush內核線程,周期為/proc/sys/vm/dirty_writeback_centisecs ,單位
    是(1/100)秒,每次周期性喚醒的pdflush線程並不是回寫所有的臟頁,而是只回寫變髒時間超過
    /proc/sys/vm/dirty_expire_centisecs(單位也是1/100秒)。
    注意:變髒的時間是以文件的inode節點變髒的時間為基準的,也就是說如果某個inode節點是10秒前變髒的,
    pdflush就認為這個inode對應的所有臟頁的變髒時間都是10秒前,即使可能部分頁面真正變髒的時間不到10秒,
    細節可以查看內核函數wb_kupdate()。

  2. 內存不足的時候: 這時並不將所有的dirty頁寫到磁盤,而是每次寫大概1024個頁面,直到空閑頁面滿足需求為止。

  3. 寫操作時發現臟頁超過一定比例: 當臟頁占系統內存的比例超過/proc/sys/vm/dirty_background_ratio 的時候,write系統調用會喚醒pdflush回寫dirty page,直到臟頁比例低於/proc/sys/vm/dirty_background_ratio,但write系統調用不會被阻塞,立即返回。當臟頁占系統內存的比例超過/proc/sys/vm/dirty_ratio的時候, write系統調用會被被阻塞,主動回寫dirty page,直到臟頁比例低於/proc/sys/vm/dirty_ratio,這一點在2.4內核中是沒有的。

  4. 用戶調用sync系統調用: 這是系統會喚醒pdflush直到所有的臟頁都已經寫到磁盤為止。

proc下的相關控制參數:

  • /proc/sys/vm/dirty_ratio: 這個參數控制一個進程在文件系統中的文件系統寫緩衝區的大小,單位是百分比,表示系統內存的百分比,表示當一個進程中寫緩衝使用到系統內存多少的時候,再有磁盤寫操作時開始向磁盤寫出數據。增大之會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值.一般缺省是 40。設置方法如下:echo 30 >/proc/sys/vm/dirty_ratio
  • /proc/sys/vm/dirty_background_ratio: 這個參數控制文件系統的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統總內存的百分比,意思是當磁盤的臟數據緩衝到系統內存多少的時候,pdflush開始把臟數據刷新到磁盤。增大會使用更多系統內存用於磁盤寫緩衝,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值.一般缺省是10。設置方法如下:echo 8 >/proc/sys/vm/dirty_background_ratio
  • /proc/sys/vm/dirty_writeback_centisecs: Pdflush寫後台進程每隔多久被喚醒並執行把臟數據寫出到硬盤。單位是 1/100 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。缺省數值是500,也就是 5 秒。設置方法如下:echo 200 >/proc/sys/vm/dirty_writeback_centisecs
  • /proc/sys/vm/dirty_expire_centisecs: 這個參數聲明Linux內核寫緩衝區裏面的臟數據多「舊」了之後,pdflush 進程就開始考慮寫到磁盤中去。單位是 1/100秒。對於特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。缺省是 30000,也就是 30 秒的數據就算舊了,將會刷新磁盤。建議設置為 1500,也就是15秒算舊。設置方法如下:echo 1500 >/proc/sys/vm/dirty_expire_centisecs

微信搜索「我的編程喵」關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer

image