Linux でバッファ キャッシュ サイズを制限する方法はありますか?

Linux でバッファ キャッシュ サイズを制限する方法はありますか?

I/O 操作中にプログラムが大量のメモリを消費しますが、これは I/O 操作を大量に実行することによる副作用です。direct_io を使用してプログラムを実行すると、メモリの問題は解消されますが、プログラムがジョブを完了するまでの時間は 4 倍以上になります。

バッファ キャッシュ (I/O 操作中に使用されるカーネル バッファ) の最大サイズを減らす方法はありますか? できればカーネル ソースを変更せずに行うと良いでしょう。

dirty_bytes などを減らすことを試みました/proc/sys/vm/。しかし、目立った違いはないようです。

更新:echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches プログラム実行中に使用すると、使用されるメモリの量が一時的に削減されます。

ページキャッシュ、dentry、iノードを常に解放するのではなく、何らかの方法で制限することはできますか? そうすれば、おそらく問題は解決するでしょう。

これまで気付かなかったのですが、問題はパーティション分割だけでなく、すべての I/O 操作で発生します。Linux は、利用可能なメモリがほぼ最大になり、空きメモリが 4 MB になるまで、I/O を通過するすべてのものをキャッシュしているようです。つまり、I/O 用にキャッシュできるメモリの量には、何らかの上限があるということです。しかし、それがどこにあるかわかりません。かなり切羽詰まっています。カーネル ソースのどこかで 2 で割ることができなければ、喜んでそうします。

2016 年 12 月 12 日更新: 修正は諦めましたが、あることが私の注意を引き、この問題を思い出しました。家には古くて故障した HDD があり、それを使って何かをしようとすると、ものすごい勢いでリソースを浪費します。

これは単に HDD が故障しただけという可能性はありますか? 問題の HDD は、私の問題が発生してから 1 か月以内に故障しました。この場合、答えは出ています。

答え1

あなたが尋ねたようにプログラム、あなたは使うことができますcグループ:

メモリ制限(たとえば 50 GB、CPU などの他の制限もサポートされています。例では CPU も記載されています)を持つ、group1 のような名前の cgroup を作成します。

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

次に、アプリがすでに実行されている場合は、アプリをこの cgroup に追加します。

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

または、この cgroup 内でアプリを実行します。

cgexec -g memory,cpu:group1 your_app_name

関連情報