LinuxでRAMディスクを作成する


70

私は62 GBのRAMを搭載したマシンと、わずか7 GBのトランクを持っているので、RAMディスクを作成してそこでコンパイルすると思いました。私はLinuxの専門家ではありません。インターネットでRAMディスクを作成する手順を見つけました。

mkfs -q /dev/ram1 8192

しかし、16GBのRAMディスクを割り当てるために、8192を16777216に変更しました。

次のエラーが表示されました。

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

その時点で私は怖がって、保釈されました。

sudo dmidecode --type 17 | grep Size

ショー

8x8192MB + 2048MB = 67584 MB

しかし、du上に/dev与え804Kます。

それは問題ですか?その/devサイズを克服できますか?


15
tmpfsを試しましたか?RAM内のファイルシステムであり、ext2は不要です。mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

うまくいきました!ありがとう!しかし、これまでのところ、あまり高速化されていません。構築に使用しているツールは、通常のディスクを使用していると思います。RAMディスクにはもっと多くのものを入れます。
フランク

3
ツール自体をRAMディスクに配置しても、カーネルはRAMにツールをキャッシュするため、大きな違いはありません。
t-8ch

1
@goldilocksこれは逸話的な証拠ですが、JavaプロジェクトをMavenでコンパイルする場合、ramdiskを使用すると大幅に高速化されます。しかし、これは読み取り時間よりもシーク時間の方が大きいと思います。
SpellingD

1
/ dev / shmは、実際に/ / shmに実行することができます使用すること。それはほとんど常にそこにあります。
カミーユグドゥスヌ14

回答:


78

LinuxでRAMディスクを作成する最良の方法は、tmpfsです。ramにあるファイルシステムなので、ext2は必要ありません。16Gbサイズのtmpfsを作成するには:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
私のシステムでは、/ mntに何もない状態で、次のように表示されます:ls:/ mnt / tmpfsにアクセスできません:そのようなファイルまたはディレクトリはありませんmount:マウントポイント/ mnt / tmpfsは存在しません。それは心配することですか?mkdir / mnt / tmpfsだけで目的が達成されない場合(通常のディスクにtmpfsを作成することで、炎を出さないでください、私はここ初心者です)。
フランク

9
ターゲットとしてマウントポイント(ディレクトリ)が必要なので、このディレクトリを作成した後(任意のディレクトリを使用でき、既存のコンテンツはシャドウされます)、答えからのコマンドでマウントできます。
t-8ch

1
tmpfsスワップを使用する場合がありますが、これはおそらく純粋なRAMディスクには必要ありません。
palswim

2
@RomanSusi tmpfsはファイルタイプです(-tの後に渡されます)。「なし」は、TMPFS存在しないバッキングデバイス(「ディスク」)されていない
T-8点

1
サイズの指定はオプションであることに注意してください。デフォルトはRAMの半分です。高いサイズを指定してもオーバーヘッドはありません。上限を設定するだけで、誤ってすべてのRAMを使用してシステムを強制終了することを防止できます。
sourcejedi

20

LinuxはRAMの使用において非常に効率的です。でスピードアップがあっtmpfsたとしても少ししか見えないということはほとんど驚きではありません。メモリに読み込む(したがってプロセスの速度を落とすことができる)最大の部分はツール(コンパイラ、アセンブラ、リンカ)であり、長い間make、起動時にメモリに読み込まれ、決して離れることはありません。残っているのはソースの読み込みです(結果の書き出しは、メモリに深刻な制約がない限り遅くなりません)。繰り返しますが、comonヘッダーファイルはそのまま残り、ユーザーのソースのみが読み取りを必要とします。そして、それが数メガバイト以上になる可能性は低いです。大きなRAMディスク(またはであっても多くの使用を作成するtmpfs制約ビルドメモリを作ることによって(非常によく遅いもの)をダウンすることができ、上のRAMディスク上のファイルまたはがtmpfs できません そこから直接使用できます)。


1
何!そこから直接使用できないのはどうしてですか?
カザーク

これらはRAMにありますが、直接使用できる形式ではありません。
フォンブランド

2
本当に!どうして?(私の遅さをご
容赦ください

8
@Kazark、メモリ内の実行可能ファイルを処理するために、特別なデータ構造が使用されます。RAMディスクとすることとしてtmpfs実行可能ファイルを保存するために一般的に使用していない(RAMディスクは耐え難いほど遅いフロッピーディスクなどの古き良き時代からの名残です、tmpfsstricty一時的なデータのためである)、誰もが必要な醜いハックを追加するのに十分なことが重要であると考えていません。
フォンブランド

7
Railsコードをtmpfs(RAM)ファイルシステムから実行しようとしましたが、まったく違いは見られませんでした。顕著な違いを期待していましたが、Linuxの素晴らしさに失望しました。
カジャミンハジュディン

6

問題は、ramdiskの最大サイズ、より具体的にはramdiskドライバーを介してアクセスできるメモリのサイズがコンパイル時に設定され、ブート時に上書きされることがありますが、カーネルがメモリにロードされると固定のままになることです。デフォルト値は、おそらくメガバイト単位で測定されます。ドライバーのロード時にRAMディスクのメモリが予約されていることを正しく思い出せば、すべてのRAMディスクは同じサイズであり、デフォルトで16のRAMディスクがあります。だからあなたは16GのRAMディスクサイズを望んでいません:-)

他の回答で述べたように、tmpfsは使用したいものです。さらに、OS全体をramdisk / tmpfsに入れることで多くのことを勝ち取ることはありません。builddirをtmpfsにコピーして、コンパイルします。すべての一時的な結果がtmpfs内の場所にも書き込まれるようにする必要があります。


実際にメモリを使用するのは、何かを書き込むまでです。起動時間の制限は単なる制限です。1つ埋めた後でも、メモリを解放できますblockdev --flushbufs
-psusi

@psusi:それについての詳細を教えてください。Documentation/blockdev/ramdisk.txtカーネルディスクなどで、RAMディスクメモリによって要求された後は、決して再要求されないことを述べたステートメントのみを見つけることができます。そして、私の答え:そのファイルはまた、メモリが消費されるにつれてramdiskが大きくなるため、一度にすべてが割り当てられるわけではないということです。
バナンイン

どんな情報?コマンドを実行すると、RAMが解放されます(まだマウントされていない場合)。
-psusi

コマンドがあなたが言うことをすることをどのように知っていますか?そのマニュアルページではそれが確認されておらず、カーネルソースツリーのドキュメントがあなたの情報と矛盾していると理解することができます。
バナンイン

6
私はソースコードを読み、それを試して検証しました。
-psusi

3

ブート後に大きなRAMディスクを作成し、カーネルパラメータをいじらないで、これは機能するようです。tmpfsを使用し、ファイルを作成し、ループ経由でマウントし、ファイルシステム経由でマウントします。

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

おそらく、複数の異なるレイヤーを通過するパフォーマンスのペナルティのビット...しかし、少なくともそれは動作します。


3

tmpfsおよびramfsに加えて、別のオプションは/dev/ram0ブロックデバイスです。最近のUbuntuバージョンでは、このデバイスはデフォルトでは存在しませんが、を介して作成できますmodprobe brd

このアプローチは、実際のext4ファイルシステムを作成し、指定した制限を決して超えないため、より予測可能です。ただし、セットアップにはより多くの手順が必要であり、RAMの使用効率は低下します。

brdカーネルモジュール(/ dev / ram0)を使用する

4GB RAMディスクを作成して初期化するには:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

このrd_nrパラメーターは、作成するRAMディスクの数を指定します(デフォルトでは、16を作成します(例:/dev/ram0から/dev/ram15))。rd_sizeパラメータは中サイズでキロバイト。この$(( ... ))構文を使用すると、シェルで算術演算を実行できます。

RAMディスクの割り当てを解除するには、RAMディスクをアンマウントしてbrdカーネルモジュールを削除します。

umount /ramdisk
modprobe -r brd

内部にブロックデバイスを作成する ramfs

または、次の内部にブロックデバイスを作成できますramfs

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

このtruncateコマンドは、指定されたサイズの空のファイルを作成し、オンデマンドで初期化(メモリを消費)します。

RAMディスクの割り当てを解除するには、RAMディスクをアンマウントしてディスクイメージを削除します。

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

比較tmpfsramfs

けれどもtmpfsramfs以下、ブロックデバイスを使用するよりも効率的であるが、それらの欠点のいくつかです。

tmpfsディスクにスワップする場合があります。これはより効率的ですが、純粋なRAMディスクが必要な場合があります。

  • 作業しているファイルは機密です(暗号化されたパーティションのファイルなど)。
  • パフォーマンステストを行っており、ディスクI / Oを要因にしたくない(SSDの書き込み時間は大幅に異なる可能性があります)。
  • 大きなファイルを開梱していて、SSDを使い果たしたくない場合。

ramfs設定は簡単で、ファイルを削除すると領域を再利用し、RAMをより効率的に使用します(システムはファイルがRAMにあることを認識しているため、ファイルをバッファリングしません)。しかし、独自の欠点と驚きがあります。

  • dfユーティリティは、領域の使用状況を報告しません。

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • サイズ制限パラメーターはありません。RAMディスクに入れすぎると、システムがハングします。

  • スパースファイルは、予想以上にスパースになることがあります。今朝、VMイメージ(150G、ただしディスクで49Gを使用)をramfs(128G のRAMがある)にコピーしました。うまくいきました。しかし、宛先からramfs宛先にコピーすると、システムが応答しなくなりました。cpユーティリティは、明らかに穴を埋め、読み取りではなく書き込みに。

両方tmpfsramfs実際のext4ファイルシステムとは異なる動作をする場合があります。これをext4回避するには、RAMにブロックデバイスを作成して初期化します。

より詳細な比較:https : //www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP RAMの量はMBで表されます。したがって、そこに入力する必要があるのは16384だけです。


1
いや。「fs-sizeにサフィックスがない場合、2のべき乗のキロバイトとして解釈されます。」-男mkfs.ext2
sourcejedi

1

ramfsファイルシステムをマウントし、プロジェクトをそこにコピーして、そこから作業できます。これにより、入力ファイルがRAMに読み込まれ、非常に遅いディスクドライブから再読み込みされなくなります。しかし、あなたが発見したように、これは一般的に有用な戦略ではありません。すでにまったく同じメリットが得られます。

Ramfsは、Linuxのディスクキャッシュメカニズム(ページキャッシュとdentryキャッシュ)を動的にサイズ変更可能なRAMベースのファイルシステムとしてエクスポートする非常にシンプルなファイルシステムです。

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

入力ファイルが最初に読み取られるときに、RAMにキャッシュされていることを既に信頼できます。出力ファイルもキャッシュされるため、ディスクに書き込まれるのを待つ必要はありません。

キャッシュできる量、キャッシュに保持される時間などに人為的な制限はありません。RAMがいっぱいになると、キャッシュのドロップが開始されます。最初にドロップされるキャッシュは、恐ろしく精巧なアルゴリズムによって選択されます。最初の近似は、最近使用されていないものとして記述されています。OSファイルキャッシュ用にLinuxカーネルで使用されるページ置換アルゴリズムを参照してください

テキストエディタがfsync()ファイルをディスクに明示的に保存することに注意してください。

を含むプログラムのテストを実行する場合fsync()、これらをファイルシステムで実行ramfsすると速度が向上する場合があります。もう1つの戦略はfsync()eatmydata/ で無効にしてみることnosync.soです。

他のオペレーティングシステムには、RAMディスクを使用してバイパスできる特定の制限がある場合があります。一方の端には、不足任意の RAMディスクが上に人気があった理由は、ファイルのキャッシュがあるDOS

tmpfs

tmpfsramfsスワップスペースを使用できる場合を除いて、と同じように機能します。つまり、何か他の目的でRAMが必要な場合、最近使用されていないアルゴリズムがtmpfsからデータブロックを選択し、それらをディスクにスワップします。

ほとんどの人はに固執しtmpfsます。これにより、合計サイズを制限でき、dfコマンドなどで正しく使用されているスペースが表示されるためです。なぜこの違いが存在するのか分かりません。のサイズ制限tmpfsにより、誤ってRAM全体がいっぱいになり、基本的にシステムが停止するのを防ぎます。デフォルトはRAMの半分です。

書き込みが遅くなる他の理由

上記は、あなたのケースに合わせた簡略化です。あなたの場合のファイルへの書き込みは、ディスクを待つ必要はありません。ただし、書き込みのいくつかのケースがあります。優れたブログ投稿をご覧ください。なぜバッファされた書き込みが時々停止するのか。最も驚くべきケースは、「安定したページ書き込み」と呼ばれるLinuxへの最近の変更です。

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