Linuxカーネルが通常メモリを割り当てることができるよりも速くRAMブロックデバイスを割り当てます。

Linuxカーネルが通常メモリを割り当てることができるよりも速くRAMブロックデバイスを割り当てます。

背景

100gbpsネットワーク接続を使用して新しく作成されたLinuxボックス(AWS EC2)に最大速度(12.5GB / s)またはそれに近い速度で約150GBをダウンロードしようとしています。ネットワーク側はうまく機能します。しかし、ボックスに192 GBのRAMがあるにもかかわらず、ボックス内のすべてのデータを十分にすばやく保存できる場所を見つけるのに苦労しました。

これまでの最も成功した試みは、brdカーネルモジュールを使用して十分に大きなRAMブロックデバイスを割り当て、そのデバイスに並列に書き込むことでした。これは、ブロックデバイスが完全に記録されると、希望の速度(直接ioを使用)で機能します。dd if=/dev/zero ...

残念ながら、brdデバイスが新しく作成されると、約2 GB / sの書き込み速度しか許可されません。

私の考えでは、これはbrd「通常の」カーネル管理メモリに接続されているためです。したがって、各新しいブロックが初めて使用されるとき、カーネルは実際にそれを割り当てる必要がありますが、これは2 GB / sより高速ではありません。

これまでに試したことはすべて同じ問題があります。 、、、、tmpfsおよびその他すべての項目は、一般的なカーネルメモリ割り当てシステムにRAMストレージフックを提供するようですramfsbrd

質問

Linuxでブロックデバイスを作成する方法はありますか?本物一般的なカーネルメモリ管理を経ずにメモリを管理しますか?

ブート時に一定量のメモリを割り当ててディスクのように処理するカーネルモジュールがあるかもしれないと思いました。このメモリはカーネルでは通常のメモリとは見なされないため、他の目的に使用するのに問題はありません。

brdまたは、カーネルにRAMディスク(または同様のもの)をすばやく完全に初期化させる方法はありますか?ディスクの最後のブロックに個別に書き込もうとしましたが、当然役に立ちませんでした。

RAM以外の代替

理論的には、NVMe SSDのRAIDは必要な書き込み速度を達成できますが、I/O全体がこのように高くなるのを防ぐ一種のボトルネックがある可能性があるようです。 8つのNVMe SSDでRAID 0を試しましたが、mdadm成功しませんでした。部分的にはブロックサイズの問題のためだと思います。直接IOを使用してカーネルキャッシュをバイパスする(必要なようです)、使用できる唯一のブロックサイズは4096です。 SSD自体を効果的に利用するには明らかに小さすぎます。ここに代わるものがあれば大変感謝します。

コメント

2GB / sが多いように聞こえ、そのデータをダウンロードするのに数分しかかかりませんが、EC2インスタンスがまったくない状態でロードされた150GB EC2インスタンスに1分以内に移動する必要があります。理論的には、これは完全に可能でなければなりません。ネットワークスタックと物理RAMは完全にデータをすばやく転送できます。

ありがとうございます!

ベストアンサー1

tmpfsファイルシステムで64個のジョブを並列に実行し、7.8秒で1.6GBファイル64個(合計100GB)をコピーできました。これは100Gbit / sに非常に近いです。

したがって、並列に実行する場合(メタコード):

curl byte 1G..2G | write_to file.out position 1G..2G 

ẁrite_toを実装するために使用できますmmap

たぶん、別のファイルに書き込んだり、ループデバイスを使用したり、リニアモードでRAIDを使用したりできます。 https://raid.wiki.kernel.org/index.php/RAID_setup#Linear_mode

両端を制御する場合、ソースを150個の1GBファイルに設定することで、リニアモードでループデバイスとRAIDとして使用できます。その後、それを並列にコピーして線形RAIDをリセットする必要があります。

おすすめ記事