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


74

私は4GBのRAMを備えたかなり古いサーバーを使用しており、1日を通してほぼ同じファイルを提供していますが、3GBのRAMが「無料」である間にハードドライブから提供しています。

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

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

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

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

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

何か案は?

編集:

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

1
私もこれらの線に沿って何かを探しています。一般的なファイルシステムのディスクブロックキャッシュが答えだとは思わない。ディスクブロックXを常にキャッシュする必要があるとします。何かがそれにアクセスし、カーネルがそれをキャッシュします。これまでのところは良好ですが、次のプロセスではブロックYが必要なので、カーネルはブロックXを破棄し、代わりにYをキャッシュします。Xを必要とする次のプロセスは、Xがディスクから外れるのを待つ必要があります。それは私が避けたいものです。私は希望(と私はオリジナルポスターがあまりにも後と思われるもの)はファイルが常に保証するファイルシステム上にライトスルーキャッシュをオーバーレイすることである

1
Linuxはすでに頻繁に使用するファイルをキャッシュしているはずだというコンセンサスがあるように思えるので、ここに記載されているアドバイスを使用して実際に改善できたかどうか疑問に思っています。キャッシュを手動で制御しようとすると、キャッシュをウォームアップするのに役立つかもしれませんが、使用パターン(「終日同じファイルを提供する」)では、既にウォームアップされたサーバーには役に立たないようです。たとえあったとしても。
ネイトCK 14年

あなたはハックを探しているわけではないと言いますが、Linuxはデフォルトですでにやりたいことをしています。次の等式:「同じファイルを終日提供する」+「特定のファイルを常にRAMから提供するようにファイルシステムに伝える」は、定義上「ハック」に等しい。実際にパフォーマンスの改善に気付きましたか?私の経験では、Linuxキャッシュはファイルシステムの読み取りのうちの1つです。
マイクS

2
明確にするために、Linuxはファイルをキャッシュしますが、メタデータは各リクエストのファイルごとに検証されます。回転する錆、小さなファイルがたくさんあるビジーなWebサーバーでは、IO競合が発生し、ドライブが早期に消耗する可能性があります。静的コンテンツとスクリプトは、/ dev / shmにrsyncするか、アプリの起動時にカスタムtmpfsマウントできます。私は数十年にわたってこれを行ってきましたが、私のドライブは時期尚早に消耗しません。また、私のサイトは、この方法で非常に高いバースト負荷に耐えます。これは、最も高価なエンタープライズハードウェアからコモディティハードウェアまで何でも役立ちます。
アーロン

回答:


57

vmtouchは仕事に適したツールのようです。

ハイライト:

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

vmtouchマニュアル

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

Example 5

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

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

EDIT2: として指摘コメントで、今そこにあるgitリポジトリ利用できます。


5
将来の視聴者のために、リンクされたページの指示に従うのではなく、vmtouch gitリポジトリを使用してみてください。そうすれば、メイクファイルを取得して更新をプルできます。
ランダムな

ファイルのサイズには制限があるようです(4GB)。他の選択肢はありますか?
アリックスアクセル

わかりました、ここに私の実際の使用例があります:古いSDカードを備えたRPi1、どこかでStuffをやっています。そこで旅行に出てカード(および場合によっては電源)を交換する前に、OSにカードをできるだけ触れないようにしてください。FSキャッシュは優れていますが、私の制御を超えています。/ binと/ sbinはすでにtmpfs上にあり、/ home / userを取得することには他の欠点もあります。vmtouchこのニッチによく合います。
ピスクヴォア

vmtouchはtmpfsとどう違うのですか?
エドワード・トーバルズ

26

これは、vmtouch Virtual 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

3
これは優れたユーティリティであり、OPが要求したとおりに機能します。彼がこれを答えとして受け入れるなら。
-laebshade

これがZFSで機能するかどうか知っていますか?
CMCDragonkai

1
@CMCDragonkai ZFSでは必要ないと思います... ARCと L2ARCを考えてください。
ewwhite

22

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


1
同意する。そして、あなたが特定のファイルがキャッシュされていることを確認したい場合は、cronジョブ行いcat、定期的に/ dev / nullにファイルを複数可
ジョシュ・

18

Linuxは、できるだけ多くのディスクIOをメモリにキャッシュします。これは、キャッシュおよびバッファメモリの統計です。おそらく、正しいものを保管するよりも良い仕事をするでしょう。

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

 # mount -t ramfs ram /mnt/ram 

または

 # mount -t tmpfs tmp /mnt/tmp

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


1
ご回答いただきありがとうございますが、これは明らかに避けたいものです。それ以外の場合は、コンピューターがRAMドライブを作成し、ファイルをコピーし、RAMドライブにシンボリックリンクするようにスクリプトを作成します。しかし、その後、私のデータは一貫していません。特定のファイルを「タグ付け」してメモリにキャッシュできるファイルシステムを望んでいました。しかし、多分私は少し楽観的です。
アンドリオイド2009

3
キャッシュするファイルにアクセスして「タグ付け」します。
ワンブル

9
最も一般的に使用されるファイルに自動的にタグ付けする方法があった場合のみ。
デビッドパシュリー

4
Blimey、皮肉はうまく行かない:)
デイビッド

2
はい、ありがとうございます。IOキャッシングの概念を理解しています。答えでも説明しました。あなたはそれが皮肉だという微妙なコメントを読んでいないようです。
デビッドパシュリー

18

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

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

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


1
どこかにそれをするプログラムがあると思った。+1
ブラッドギルバート

7

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

スワップピネス

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にキャッシュしておくと、プロセスが大幅に高速化されます。)


3

私はそれが実際に3 GBのRAM空きディスクからファイルを提供していることを非常に疑っています。Linuxファイルキャッシュは非常に優れています。

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


まさにあなたが、キャッシュされるものを制御したいだけです。
アンドリオイド2009



0

使用できるさまざまなramfsシステム(ramfs、tmpfsなど)がありますが、一般的にファイルが実際に頻繁に読み取られる場合は、ファイルシステムキャッシュに置かれます。ファイルのワーキングセットがフリーラムよりも大きい場合、ファイルは消去されます-ただし、ワーキングセットがフリーラムよりも大きい場合、すべてをラムディスクに収めることはできません。

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


0

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


0

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

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

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


1
/ var / lib / mysqlを見つけます| xargs fadvise -willneed(汚れていますが、データベースファイルへの高速アクセスを提供する必要があります;例として)
Andrioid 09

非常に良いハックが、そのようなハックは:(のfsyncがACID(原子性、一貫性、独立性、耐久性)を確保するために必要なのmysqlから待っているのfsyncの多くを無効にしません。
osgx

0

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

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

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

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



0

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

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



0

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

find BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

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


-1

特定のフォルダーとそのサブフォルダーにファイルをキャッシュしたい場合があります。このフォルダに移動して、次を実行します。

見つける 。-exec cp {} / dev / null \;

そして、それらのファイルはキャッシュされます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.