Linux

寫回記憶體(“臟”)似乎被限制在節流開始的預期門檻值以下。它受到什麼限制?

  • October 14, 2021

在之前的問答中,我展示了一個關於dirty_ratio的實驗。

寫回記憶體(dirty)似乎被限制在甚至小於dirty_background_ratio。它受到什麼限制?這個限制是如何計算的?

我想我通過糾正我對臟比率計算的理解解決了這個問題。但是我重複了剛才的實驗,回寫記憶體被限制在比我之前看到的低。我無法解決這個問題,可能是什麼限制了它?

我有vm.dirty*sysctl 的預設值。 dirty_background_ratio是 10,dirty_ratio是 20。“比率”是指臟頁記憶體(也稱為回寫記憶體)的大小,以MemFree+的百分比表示Cached。他們不是百分比MemTotal- 這是我在上述問題中的困惑。

這些比率意味著達到 10% 會導致後台回寫開始,而 20% 是回寫記憶體的最大大小。此外,我了解回寫記憶體受“無 I/O 臟節流”的限制。當回寫高速記憶體上升到 15% 以上時,生成臟頁的程序(例如使用 write() )將被“限制”。也就是說,核心導致程序在 write() 呼叫中休眠。所以核心可以通過控制睡眠的長度來控制回寫記憶體的大小。有關參考,請參閱我上一個問題的答案。

但我觀察到的“比率”似乎明顯低於 15% 的限制門檻值。一定有一些我錯過的因素!為什麼會這樣?

在我之前的測試中,我看到了大約 15-17.5% 的值。

我的核心是 Linux 4.18.16-200.fc28.x86_64

測試如下:我跑了dd if=/dev/zero of=~/test bs=1M status=progress。同時,我監測了達到的髒污率。dd我在 15GB 後中斷了命令。

$ while true; do grep -E '^(Dirty:|Writeback:|MemFree:|Cached:)' /proc/meminfo | tr '\n' ' '; echo; sleep 1; done
...
MemFree:          139852 kB Cached:          3443460 kB Dirty:            300240 kB Writeback:        135280 kB
MemFree:          145932 kB Cached:          3437220 kB Dirty:            319588 kB Writeback:        112080 kB
MemFree:          134324 kB Cached:          3448776 kB Dirty:            237612 kB Writeback:        160528 kB
MemFree:          134012 kB Cached:          3449004 kB Dirty:            169064 kB Writeback:        143256 kB
MemFree:          133760 kB Cached:          3449024 kB Dirty:            105484 kB Writeback:        119968 kB
MemFree:          133584 kB Cached:          3449032 kB Dirty:             49068 kB Writeback:        104412 kB
MemFree:          134712 kB Cached:          3449116 kB Dirty:                80 kB Writeback:         78740 kB
MemFree:          135448 kB Cached:          3449116 kB Dirty:                 8 kB Writeback:             0 kB

例如,引用輸出中的第一行:

avail = 139852 + 3443460 = 3583312
dirty = 300240 + 135280 = 435520
ratio = 435520 / 3583312 = 0.122...

我發現了一件事限制了它,但還不足以看到這些結果。我一直在嘗試設置/sys/class/bdi/*max_ratio。問題中的測試結果來自以 max_ratio = 1 執行。

用 重複上述測試max_ratio = 100,我可以獲得更高的髒比,例如 0.142:

MemFree:   122936 kB Cached:   3012244 kB Dirty:     333224 kB Writeback: 13532 kB

寫入測試需要相當長的時間才能可靠地觀察到這一點,例如 8GB。此測試大約需要 100 秒。我正在使用旋轉硬碟。

我嘗試用​​ 4GB 進行測試,我只看到了 0.129 的髒比:

MemFree:   118388 kB Cached:   2982720 kB Dirty:     249020 kB Writeback: 151556 kB

正如我所說,這讓我感到驚訝。我有一個2013 年的專家消息來源,說dd應該有“自由執行”來生成臟頁,直到系統達到 0.15 的髒頁率。它明確地談論max_ratio.

“比率”是指臟頁記憶體(也稱為回寫記憶體)的大小,以MemFree+的百分比表示Cached。它們不是 MemTotal 的百分比——這讓我在上述問題中感到困惑。

不,這個描述仍然不准確。

Cached包括所有文件tmpfs,以及其他Shmem分配。它們被計算在內是因為它們是使用頁面記憶體實現的。但是,它們不是任何持久儲存的記憶體。它們不能被丟棄。 tmpfs頁面可以交換,但可交換頁面不包括在計算中。

我有 500-600MB 的Shmem. 當我再次嘗試查看跟踪點時,這大約是正確的數量,以解釋為什麼limit/ 0.20 低於我的預期(請參閱對上一個問題的回答)。

Cached排除Buffers,這在某些設置中可能是驚人的大數量

我認為我應該仔細查看我的核心版本的global_dirtyable_pages()的實現,並使用/proc/vmstat. 或者也許專注於使用跟踪點。

引用自:https://unix.stackexchange.com/questions/482595