web-dev-qa-db-ja.com

キャッシュとバッファ用にRAM

私は通常、デスクトップ上で多くのプログラムと仮想マシンを実行しています。 CPUはボトルネックではなく、メモリです。 (メモリを追加購入することは、自分のコンピュータではないため、解決策ではありません。)

compcache で実験を開始しましたが、メモリの圧縮で正常に機能します。 swappiness 100で使用量を増やすことができます。しかし、実際の(非圧縮)と、メモリがいっぱいになり始め、Linuxはキャッシュとバッファを空にし始めてから、プログラム間の切り替えが非常に遅くなるため、大規模なスワップを行います。

バッファとキャッシュ用にメモリを予約する方法を見つけることができなかったので、別の方法を探し始め、cgroupを見つけました。

Cgroupsでは、ルートリソースのメモリ制限を設定できないため、すべてのプロセスをメモリが制限されたグループに移動しようとしましたが、どういうわけか機能していないようです。

バッファとキャッシュ用にメモリを予約し、早い段階でcompcacheへのスワップを開始する方法を教えてください。

6
Stone

キャッシュとバッファ用にメモリを予約する場合:echo 10>/proc/sys/vm/vfs_cache_pressure(100がデフォルト値の場合)。次に、各アプリで使用される最大RAMを制限できます:echo 8192>/proc/sys/vm/max_map_count。 swapiness = 30および高い/ proc/sys/vm/dirty_writeback_centisecs値と/ proc/sys/vm/dirty_expire_centisecs値(両方:1250)をお勧めします。また、ファイルシステムを微調整するのにも役立ちます。

echo 8192 > /sys/block/mmcblk0/queue/max_sectors_kb
echo 8192 > /sys/block/mmcblk1/queue/max_sectors_kb
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle
echo 0 > /sys/block/mmcblk1/queue/iosched/slice_idle
echo 160 > /sys/block/mmcblk0/queue/iosched/quantum
echo 160 > /sys/block/mmcblk1/queue/iosched/quantum
echo 800 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
echo 800 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
echo 180 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
echo 180 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty 
echo 1 > /sys/block/mmcblk1/queue/iosched/back_seek_penalty

これらの値は私の携帯電話と私のラップトップからのものであり、それは本当に安定して動作し、物事をかなり速くします。私の携帯電話はメモリに制限がありますが、この調整は大いに役立ちます。私のモバイルでもcgroupが有効になっています。これにより、ユーザーが端末(デスクトップではなく)から実行している各アプリにカスタムcgroupが追加されるため、4kワンダーパッチをお勧めしますが、cgroupでメモリを制限する方法がわかりません。

5
Gigamegs

バッファとキャッシュ用にメモリを直接予約することはできません。カーネルはこのために他の用途に使用されていないメモリを使用し、非常に古い未使用のページをスワップアウトしてスペースを増やすことがあるため、キャッシュ/バッファ用にメモリを予約する方法はRAMの量を制限することです。 _アプリケーション(仮想マシンを含む)が使用しています。

一般的な問題の1つは、VMに必要以上のメモリを割り当てて、VMのOSにディスクキャッシュ用のスペースを確保することです。仮想ディスクのキャッシュサポートをオンにすることで、これを行う必要をなくすことができます(これを行う方法は、仮想化ソリューションによって異なりますが、明記していません)。これにより、ホストは、キャッシュにグローバルに使用されるメモリの量を決定できます。これにより、各VMに割り当てられるメモリの量を、他の方法よりも少ないI/Oパフォーマンスの低下で減らすことができます。ただし、警告の言葉:これを行うと、ホストマシンのシャットダウンが汚れている場合(停電など)、仮想ディスク上のファイルシステムが破損する危険性が高まります。

1
David Spillett

メモリが限られている場合は、カーネルへのメモリ使用量を指示しようとしないでください。カーネルはおそらく、cgroupsやcompcacheで実行できるよりも優れた仕事をすでに行っています。

メモリを増やすことができない場合の唯一の実際の解決策は、RAMの使用を制限することです。スワップスペースを増やすと、問題は「解決」する可能性がありますが、プロセス間で長時間のスワップが発生します。 RAM使用量をVMで減らすと、状況を改善できます。

記事を参照してください Linuxのメモリフットプリントを削減してください 。 2007年からですが、それでも役に立ちます。

独自のカーネルをコンパイルして、不要なすべてのサービスとオプションをオフにすることもできます。たとえば、この記事を参照してください: カーネルサイズチューニングガイド

代わりに、この記事のように、Linuxのスモールメモリバージョンに移行することもできます: 8つの最高の小さなLinuxディストリビューション

しかし、少なくとも多くの遅いスワッピングがなければ、メモリが不足しているコンピュータで大量のメモリを使用できるような奇跡的な解決策はないことを繰り返します。使用パターンを最適化する必要があります。カーネルの最適化は少し役立つかもしれませんが、限界があります。

1
harrymc

ターミナルに移動し、rootモードに移動してから、nano /etc/sysctl.confを実行し、下部でこれをコピーします。

vm.swappiness = 60

vm.overcommit_ratio = 100

vm.min_free_kbytes = 1000000

これは私が使用している現在の構成です。12GBのRAMのうち10GBに制限されているため、2つのボトムラインは1GBに相当します。したがって、10%を予約し、必要に応じて調整します。

0
theman5142