web-dev-qa-db-ja.com

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

私は62GBのRAMを搭載したマシンと7GBのトランクを持っているので、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

しかし/devdu804Kを返します。

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

73
Frank

LinuxでRAMディスクを作成する最良の方法は、tmpfsです。これはramに存在するファイルシステムなので、ext2は必要ありません。以下を使用して、16Gbサイズのtmpfsを作成できます。

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

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

20
vonbrand

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

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

6
Bananguin

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ディスクの割り当てを解除するには、それをマウント解除し、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ディスクの割り当てを解除するには、アンマウントしてディスクイメージを削除します。

_umount /ramdisk
rm /ramdisk-storage/ramdisk.img
_

tmpfsおよびramfsとの比較

tmpfsramfsは、ブロックデバイスを使用するよりも効率的ですが、いくつかの欠点があります。

tmpfsはディスクにスワップできます。これはより効率的ですが、純粋なRAM disk:

  • 作業しているファイルは機密情報です(暗号化されたパーティションのファイルなど)。
  • パフォーマンステストを行っており、ディスク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を持っています)にコピーしました。それはうまくいきました。しかし、コピーしたときfromramfsから宛先へ、システムが応答しなくなりました。cpユーティリティはread、ただし書き込みではありません。

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

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

5
Joey Adams

カーネルパラメータをいじる必要なしに、ブート後に大きな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
user39725

OP RAM=の量はMBで表されます。そのため、ここに入力する必要があるのは16384だけです。それで、あなたは仕事に取り掛かります。

1
CyberWolf64

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

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

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

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

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

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

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

他のいくつかのオペレーティングシステムには、ramdiskを使用してバイパスできる特定の制限がある場合があります。一端では、anyファイルキャッシングの欠如が、ラムディスクが [〜#〜] dos [〜#〜] で人気だった理由です。

tmpfs

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

ほとんどの人はtmpfsを使い続けます。これにより、合計サイズを制限することもでき、正しく使用されているスペースが表示されます。 dfコマンド内。なぜこの違いがあるのか​​わかりません。 tmpfsのサイズ制限により、RAM全体が誤っていっぱいになり、基本的にシステムが強制終了されます。デフォルトではRAMの半分になります。

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

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

1
sourcejedi