web-dev-qa-db-ja.com

Linux上のファイルのキャッシュ/プリロードRAM

私は4GBのRAMを備えたかなり古いサーバーを使用しており、ほぼ同じファイルを1日中処理していますが、3GBのRAMは "自由"。

ラムドライブを実行しようとしたことがある人なら誰でも、速度の点ですごいであることがわかります。このシステムのメモリ使用量は通常1GB/4GBを超えることはないので、何か良いものにその余分なメモリを使用する方法があるかどうか知りたいです。

  • RAMから特定のファイルを常に提供するようにファイルシステムに指示することは可能ですか?
  • RAMを使用してファイルの読み取り機能を向上させるために使用できる他の方法はありますか?

より具体的には、ここでは「ハック」を探していません。ラムドライブを作成してそこにファイルを手動でコピーする必要なく、RAMからファイルを提供するファイルシステムコールが必要です。または、少なくとも私のためにこれを行うスクリプト。

ここで可能なアプリケーションは次のとおりです。

  • たくさん読み込まれる静的ファイルを持つWebサーバー
  • 大きなライブラリを備えたアプリケーションサーバー
  • RAMが多すぎるデスクトップコンピュータ

何か案は?

編集:

  • この非常に有益な情報が見つかりました: Linuxページキャッシュとpdflush
  • Zanが指摘したように、メモリは実際には解放されていません。つまり、それはアプリケーションで使用されておらず、何をメモリにキャッシュするかを制御したいということです。
76
Andrioid

vmtouch は、ジョブに適したツールのようです。

ハイライト:

  • キャッシュされているディレクトリの量を問い合わせる
  • キャッシュされているファイルの量を照会します(どのページ、グラフィック表示も)
  • ファイルをキャッシュにロードする
  • キャッシュからファイルを削除
  • キャッシュ内のファイルをロックする
  • デーモンとして実行

vmtouchマニュアル

EDIT:質問で尋ねられた使用法は vmtouch Hompage の例5にリストされています

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2:コメントに noted として、現在 gitリポジトリ が利用可能です。

60
seeker

vmtouchVirtual Memory Toucherユーティリティ を使用してこれを実行することもできます。

このツールを使用すると、Linuxシステムのファイルシステムキャッシュを制御できます。 VMキャッシュサブシステムで特定のファイルまたはディレクトリを強制またはロックするか、それを使用してファイル/ディレクトリのどの部分がVM内に含まれているかを確認するために使用できます。

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

または...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds
26
ewwhite

物をファイルシステムのキャッシュに入れるための貧乏人のトリックは、単にそれを猫にしてそれを/ dev/nullにリダイレクトすることです。

23
cagenut

Linuxは、可能な限り多くのディスクをメモリにキャッシュしますIOメモリ内のキャッシュです。これが、キャッシュとバッファメモリの統計です。適切なものを保存するよりも、おそらくより良い仕事をします。

ただし、データをメモリに保存することを主張する場合は、tmpfsまたはramfsを使用してRAMドライブを作成できます。違いは、tmpfsはブロックデバイスが使用しているメモリのみを使用するため、ramfsは要求したすべてのメモリを割り当てるということです。私の記憶は少し錆びていますが、できるはずです:

 # mount -t ramfs ram /mnt/ram 

または

 # mount -t tmpfs tmp /mnt/tmp

次に、データをディレクトリにコピーします。明らかに、マシンの電源を切るか、そのパーティションをアンマウントすると、データは失われます。

18
David Pashley

2.6カーネルのスワッピングとページキャッシング機能についていくつかの詳細を読んだ後、「fcoretools」を見つけました。これは2つのツールで構成されます。

  • fincore:アプリケーションがコアメモリに保存したページ数を明らかにします
  • fadvise:コアメモリ(ページキャッシュ)を操作できます。

(他の誰かがこれを面白いと思った場合は、ここに投稿します)

18
Andrioid

他のツールを使用しなくてもかなり役立つ2つのカーネル設定があります。

swappiness

linuxカーネルにスワップをどの程度積極的に使用するかを指示します。ウィキペディアの記事を引用:

Swappinessは、システムページキャッシュからページをドロップするのではなく、ランタイムメモリをスワップアウトする間のバランスを変更するLinuxカーネルのプロパティです。 Swappinessは、0から100までの値に設定できます。低い値は、カーネルがスワップをできるだけ避けようとすることを意味し、高い値は代わりにカーネルが積極的にスワップ領域を使用しようとするようにします。デフォルト値は60であり、ほとんどのデスクトップシステムでは、100に設定すると全体的なパフォーマンスに影響を与える可能性がありますが、低い値(0でも)を設定すると対話性が向上します(応答の待ち時間が減少します)。

vfs_cache_pressure

vm.txt からの引用:

カーネルがディレクトリとiノードオブジェクトのキャッシュに使用されるメモリを再利用する傾向を制御します。

Vfs_cache_pressure = 100のデフォルト値では、カーネルはページキャッシュとスワップキャッシュの再利用に関して「公平な」レートでデントリーとiノードを再利用しようとします。 vfs_cache_pressureを減らすと、カーネルはdentryキャッシュとiノードキャッシュを保持することを優先します。 ...


swappinessを高く(100のように)設定すると、カーネルはスワップする必要のないものをすべて移動し、RAMをキャッシュファイル用に解放します。そしてvfs_cache_pressureを低く設定して(0ではなく50としましょう!)、アプリケーションデータをRAMに保持するのではなく、ファイルをキャッシュします。

(私は大規模なJavaプロジェクトで作業しており、実行するたびに、RAMを大量に消費し、ディスクキャッシュをフラッシュしたので、次回はプロジェクトはすべてコンパイルされて、ディスクからすべて読み込まれました。これら2つの設定を調整することで、ソースとコンパイル済み出力をRAMにキャッシュしておくことができ、プロセスを大幅に高速化できます。)

7
Petr Pudlák

3 GBのRAMが空いているディスクからファイルを実際に提供しているのではないかと、私は大いに疑問に思っています。 Linuxファイルキャッシングは非常に優れています。

ディスクIOが表示されている場合は、ログ設定を調べます。クラッシュ時に最新のログ情報が利用できることを保証するために、多くのログはバッファなしとして設定されます。高速である必要があるシステムでは、バッファ付きログIOを使用するか、リモートログサーバーを使用します。

3
Zan Lynx

ファイルをmmapsするだけで実行を継続するプログラムを使用できる場合があります。

3
Brad Gilbert

十分なメモリがある場合は、キャットするファイルをcatなどで読み込むだけです。 Linuxはそれを維持するのに良い仕事をします。

http://www.coker.com.au/memlockd/ はこれを行います

あなたは本当にそれを必要としませんが、Linuxはあなたが自分で使っているファイルをキャッシュするのにかなり良い仕事をします。

0
Justin

使用できるramfsシステムはさまざまです(たとえば、ramfs、tmpfs)。ただし、一般に、ファイルが実際に頻繁に読み取られている場合は、ファイルシステムキャッシュ内にあります。ファイルの作業セットが無料のRAMよりも大きい場合、ファイルはそのRAMから消去されます。ただし、作業セットが無料のRAMよりも大きい場合、すべてをRAMディスクに収めることはできません。

シェルで「free」コマンドの出力を確認します。「Cached」の下の最後の列の値は、ファイルシステムキャッシュに使用されている空きRAMの量です。

0
Daniel Lawson

正確には何が尋ねられたのではありませんが、私は使用します

bASE_DIRECTORY -type f -exec cat {}>/dev/null \;を見つけます。

スナップショットから作成されたAWSボリューム内のファイルの初期化をトリガーします。一部のファイルを読みたいだけの場合は、ddを使用するという公式の推奨事項よりも焦点が絞られています。

0
Federico

後者の質問については、プロセッサが並列にデータをフェッチできるように、RAMが異なるメモリチャネルに配置されていることを確認してください。

0
sybreon

これはアプリケーションレベルで解決する方が良いと思います。たとえば、おそらくこれに特化したWebサーバーがあるか、Apacheで mod_cache を検討します。 Webコンテンツをより速く提供するなど、特定の目標がある場合、このようなことから改善を得ることができると思います。

しかし、あなたの質問は本質的に一般的です。Linuxメモリーサブシステムは、RAMの最も一般的な使用法を提供するように設計されています。特定のタイプのパフォーマンスをターゲットにする場合は、/ proc/sys/vmですべてを検索することを検討してください。

Fcoretoolsパッケージは興味深いです。そのアプリケーションに関する記事に興味があります... このリンク は、アプリケーションで使用される実際のシステムコールについて話します。

0
Kyle Brandt

私はちょうどdd if/dev/yourrootpartition of =/dev/null\bs = 1Mcount = howmuchmemoryyouwanttofillを試しました

それはあなたが望むコントロールを私に与えませんが、少なくとも無駄なメモリを使用しようとします

0
Bogus Name

デスクトップコンピューター(ubuntuなど)は、起動時にメモリにプリロードファイル(少なくとも一般的な共有ライブラリ)を既に使用しています。これは、FF、OO、KDE、GNOME(evolution bloat-mailerを使用)などのさまざまなbloarwareの起動と起動時間を短縮するために使用されます。

ツールの名前はreadaheadhttp://packages.ubuntu.com/dapper/admin/readahead

対応するsyscallもあります:readahead(2)http://linux.die.net/man/2/readahead

プリロードデーモンのプロジェクトもあります: http://linux.die.net/man/8/preload

0
osgx

私はランダムな文字のfind/-name文字列を使用します

0
user50472