書き込みストレージキャッシュ(「ダーティー」)は、制限が開始される予想しきい値を下回るように制限されているようです。その限界は何ですか?

書き込みストレージキャッシュ(「ダーティー」)は、制限が開始される予想しきい値を下回るように制限されているようです。その限界は何ですか?

以前のQ&Aでdirty_ratioの実験を示したことがあります。

書き込みストレージキャッシュ(「ダーティ」)はdirty_Background_ratioよりはるかに小さいものに制限されているようです。その限界は何ですか?この制限はどのように計算されますか?

汚い料金計算の理解を正し、問題を解決したと思います。しかし、私は実験を繰り返しましたが、書き換えキャッシュは以前に見たものよりも低く調整されました。この問題を解決できませんでした。問題を制限するものは何ですか?

sysctlのデフォルト値がありますvm.dirty*dirty_background_ratio10、20dirty_ratioです。 「比率」は、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。同時に達成された汚れの割合を監視しました。dd15GB以降にコマンドを中断しました。

$ 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

ベストアンサー1

MemFree「比率」は、+のパーセントで表されるダーティページキャッシュ(つまり、書き換えキャッシュ)のサイズを表しますCached。これは MemTotal のパーセンテージではありません。上記の質問で、私が混乱していた部分がここにあります。

いいえ、その説明はまだ正確ではありません。

Cachedtmpfs、およびその他のディストリビューションShmemのすべてのファイルが含まれています。ページキャッシュを使用して実装されているため計算されます。ただし、これは永続ストレージのキャッシュではありません。ただ捨てることはできません。 tmpfsページは交換できますが、交換可能ページは計算に含まれません。

私はそのうち500-600MBを持っていますShmem。トレースポイントをもう一度見ようとした場合(以前の質問に対する回答を参照)、これはおおよそ適切な量であり、/ limit0.20が予想よりも低い理由を説明します。

また、Cached除外するBuffersことができます。一部の設定では驚くほど大量に発生します

実装を詳しく見なければならないと思いました。global_dirtyable_pages()私のカーネルバージョンでは/proc/vmstat

おすすめ記事