Linux的磁碟快取和刷髒頁

大雄45發表於2023-02-11
導讀 無論您選擇哪種路線,您都應該始終收集硬資料來支援您的更改,並幫助您確定是正在改進還是使事情變得更糟。在這種情況下,您可以從許多不同的位置獲取資料,包括應用程式本身、/proc/vmstat、/proc/meminfo、iostat、vmstat 以及 /proc/sys/vm 中的許多內容。

我們討論了 客戶機上的記憶體如何用於作業系統本身(核心,緩衝區等),應用程式以及檔案快取。檔案快取是一項重要的效能改進,在大多數情況下,讀取快取是一個明顯的勝利,與直接使用 RAM 的應用程式相比,這是平衡的。寫入快取更棘手。Linux 核心將磁碟寫入暫存到快取中,並隨著時間的推移將它們非同步重新整理到磁碟。這在加速磁碟 I/O 方面有很好的效果,但存在風險。當資料未寫入磁碟時,丟失資料的可能性會增加。也有可能大量 I/O 也會使快取不堪重負。是否曾經一次將大量資料寫入磁碟,並在嘗試處理所有這些資料時看到系統上出現大量暫停?這些暫停是快取決定有太多資料要非同步寫入(作為非阻塞後臺操作,讓應用程式程式繼續)並切換到同步寫入(阻塞並使程式等待 I/O 提交到磁碟)的結果。當然,檔案系統還必須保留寫入順序,因此當它開始同步寫入時,它首先必須轉儲快取。因此長時間停頓。好訊息是,這些都是可控的選項,根據您的工作負載和資料,您可以決定如何設定它們。一起來看看:

$ 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 後臺程式啟動將其寫入磁碟之前,可以用“髒”頁(仍需要寫入磁碟的記憶體頁)填充的空閒記憶體和快取和的百分比。我的例子是 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 快取,因此將內容保留在作業系統頁面快取中是有風險的。讓我們嘗試更及時地將 I/O 傳送到陣列,並減少我們的本地作業系統(借用服務行業的一句話)“陷入困境”的可能性。為此,我們透過向 /etc/sysctl.conf 新增新數字並使用 “sysctl –p” 重新載入來降低vm.dirty_background_ratio和vm.dirty_ratio:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

這是虛擬機器以及基於 Linux 的虛擬機器管理程式的典型方法。我不建議將這些引數設定為零,因為某些後臺 I/O 可以將應用程式效能與磁碟陣列和 SAN 上短時間的高延遲(“峰值”)分離。方法 2:增加快取在某些情況下,顯著提高快取會對效能產生積極影響。在這些情況下,Linux 來賓上包含的資料並不重要並且可能會丟失,並且通常是應用程式重複或以可重複的突發方式寫入相同的檔案。從理論上講,透過允許記憶體中存在更多的髒頁,您將在快取中一遍又一遍地重寫相同的塊,並且只需要每隔一段時間對實際磁碟進行一次寫入。為此,我們提高了引數:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

有時人們還會增加 vm.dirty_expire_centisecs 引數以允許快取中更多時間。除了資料丟失的風險增加之外,如果快取已滿並需要轉儲,還面臨長時間 I/O 暫停的風險,因為在大型 VM 上,快取中會有大量資料。方法3:雙向在某些情況下,系統必須處理不頻繁的突發流量到慢速磁碟(整點頂部的批處理作業、午夜、寫入 Raspberry Pi 上的 SD 卡等)。在這種情況下,一種方法可能是允許將所有寫入 I/O 存放在快取中,以便後臺重新整理操作可以隨著時間的推移非同步處理它:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

在這裡,後臺程式在達到 5% 的上限時將立即開始寫入,但系統不會強制同步 I/O,直到它達到 80% 滿。從那裡,您只需調整系統RAM的大小,vm.dirty_ratio就可以消耗所有寫入的資料。同樣,磁碟上的資料一致性需要權衡,這轉化為資料風險。購買 UPS 並確保您可以在 UPS 斷電之前轉儲快取。:)無論您選擇哪種路線,您都應該始終收集硬資料來支援您的更改,並幫助您確定是正在改進還是使事情變得更糟。在這種情況下,您可以從許多不同的位置獲取資料,包括應用程式本身、/proc/vmstat、/proc/meminfo、iostat、vmstat 以及 /proc/sys/vm 中的許多內容。可以看到這個髒頁配置也是一種藝術,需要根據實際情況下調整,注意vm.dirty_background_ratio配置的比例是快取和空閒記憶體的比例,vm.dirty_ratio是總記憶體的比例。

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2934514/,如需轉載,請註明出處,否則將追究法律責任。

相關文章