私は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
しかし/dev
のdu
は804K
を返します。
それは問題ですか?その/dev
サイズを克服できますか?
LinuxでRAMディスクを作成する最良の方法は、tmpfsです。これはramに存在するファイルシステムなので、ext2は必要ありません。以下を使用して、16Gbサイズのtmpfsを作成できます。
mount -o size=16G -t tmpfs none /mnt/tmpfs
LinuxはRAMの使用においてvery効率的です。 tmpfs
による高速化がほとんど見られないことに少し驚いています。メモリに読み込む(そしてプロセスを遅くする)ことができる最大の部分はツール(コンパイラ、アセンブラ、リンカ)であり、長いmake
では起動時にメモリにロードされ、決して離れない。残っているのはソースの読み取りです(メモリに厳しく制限されない限り、結果の書き込みによって速度が低下することはありません)。繰り返しになりますが、comonヘッダーファイルはそのまま残り、ユーザーのソースだけが読み取りを必要とします。そして、それが数メガバイト以上になることはまずありません。大きなRAMdiskを作成すると(またはtmpfs
を多く使用しても)、処理速度が非常に遅くなります(ビルドメモリを制限することにより、RAMdiskまたはtmpfs
上のファイルできませんそこから直接使用されます)。
問題は、ramdiskの最大サイズ、具体的にはramdiskドライバーを介してアクセスできるメモリのサイズがコンパイル時に構成され、ブート時に上書きできるが、カーネルがメモリに読み込まれると固定されたままになることです。デフォルト値はおそらくメガバイトで測定されます。ドライバーが読み込まれたときにRAMディスクのメモリが正しく予約されていることを正しく思い出せば、すべてのRAMディスクは同じサイズで、デフォルトでは16個のRAMディスクがあります。ですから、16GのRAMディスクサイズを望んでもいません:-)
他の回答で述べたように、tmpfsは使用したいものです。さらに、OS全体をramdisk/tmpfsに置いても、多くのことは得られません。 builddirをtmpfsにコピーして、コンパイルするだけです。すべての一時的な結果がtmpfs内の場所thatsにも書き込まれるようにする必要がある場合があります。
tmpfs
およびramfs
の他に、_/dev/ram0
_ブロックデバイスがあります。最近のUbuntuバージョンでは、このデバイスはデフォルトでは存在しませんが、_modprobe brd
_を使用して作成できます。
このアプローチは実際の_ext4
_ファイルシステムを作成し、指定した制限を超えることがないため、より予測可能です。しかし、設定にはより多くのステップが必要であり、RAMの使用効率は低くなります。
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
との比較tmpfs
とramfs
は、ブロックデバイスを使用するよりも効率的ですが、いくつかの欠点があります。
tmpfs
はディスクにスワップできます。これはより効率的ですが、純粋なRAM disk:
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、ただし書き込みではありません。
tmpfs
とramfs
は、実際の_ext4
_ファイルシステムとは異なる動作をする場合があります。 RAM=でブロックデバイスを作成し、_ext4
_で初期化することでこれを回避できます。
より詳細な比較の場合: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
カーネルパラメータをいじる必要なしに、ブート後に大きな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/
おそらく、複数の異なる層を通過するパフォーマンスのペナルティが少しあります...しかし少なくともそれは機能します。
OP RAM=の量はMBで表されます。そのため、ここに入力する必要があるのは16384だけです。それで、あなたは仕事に取り掛かります。
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
はramfs
と同じように機能しますが、スワップスペースがある場合はそれを使用できる点が異なります。つまり他にRAM=が必要な場合は、最近使用されていないアルゴリズムがtmpfsからデータブロックを選択し、それらをディスクにスワップする場合があります。
ほとんどの人はtmpfs
を使い続けます。これにより、合計サイズを制限することもでき、正しく使用されているスペースが表示されます。 df
コマンド内。なぜこの違いがあるのかわかりません。 tmpfs
のサイズ制限により、RAM全体が誤っていっぱいになり、基本的にシステムが強制終了されます。デフォルトではRAMの半分になります。
上記は、ケースに合わせて調整された簡略化です。あなたの場合のファイルへの書き込みは、ディスクを待つ必要はありません。ただし、書き込みが行われる場合があります。優れたブログ投稿 バッファリングされた書き込みが時々停止する理由 を参照してください。最も驚くべきケースは、「安定したページ書き込み」と呼ばれる最近のLinuxへの変更です。