寫回記憶體(“臟”)似乎被限制在節流開始的預期門檻值以下。它受到什麼限制?
在之前的問答中,我展示了一個關於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
. 或者也許專注於使用跟踪點。