web-dev-qa-db-ja.com

Linuxtmpfsの書き込み速度がRAM速度より遅い

HPE ProLiant DL360Gen9サーバーを使用しています。仕様は次のとおりです。

  • CPU:Intel Xeon 2 CPU E5-2687W v3 @ 3.10GHz、25MB L3キャッシュ、各10コア
  • RAM:8x 32GB PC4-17000 DDR4 2133MHz CAS-15 1.2V SDRAM DIMM(合計256 GB)

(完全なサーバー仕様 ここ

サーバーはカーネルCentOS 7.23.10.0-327.36.3.el7.x86_64を実行しています。

/etc/fstabの次のエントリを使用して、tmpfsramdiskをサーバーにマウントしました。

tmpfs  /ramdisk  tmpfs  noauto,user  0 0

このRAMディスクへの書き込みをテストするには、次のコマンドを実行します。

time sh -c "dd if=/dev/zero of=/ramdisk/120GB_testfile bs=4k count=30000000 && sync"

58.857秒で122,880,000,000バイトを書き込んだと報告されています。これは、1991 MiB /秒の書き込み速度です。

このメモリの書き込み速度が17GB /秒であることを考えると( this メモリデータレートの説明によると)、tmpfsramdiskに書き込むときの速度がかなり遅いことに驚いています。誰かが格差を説明し、より高速なメモリ内のファイルに書き込む別の方法を提案できますか?

ありがとう。

[〜#〜]更新[〜#〜]

vm.swappinessを無効にしましたが、何のメリットもありません(1712MiB /秒)。

ブロックサイズも大きくしてみましたが(bs=256k count=468750)、あまり効果はありませんでした(2087MiB /秒)。

1
atreyu

インメモリファイルシステムを使用している場合は、データをRAMに配置するだけでなく、さらに多くのことが行われています。メモリ内のすべての場所を追跡するなど、ファイルに関連付けられたデータ構造を処理する必要があります。この情報の書き込みにも時間がかかります(特に、実行しているテストでは、書き込みのたびにファイルサイズが更新されるため、メモリ内でデータが変更される場所の数がすぐに2倍になります)。

また、メモリの割り当ては非常に遅いです。実際、これはI/Oを伴わないほとんどのシステムで実行できる最も遅いことの1つであり、非常に遅いのは新しいスレッドまたはプロセスの作成だけです。 ramspeedのようなツールは、起動時に使用するすべてのメモリを事前に割り当てて、実際のメモリパフォーマンスをテストできるようにします。それに比べて、tmpfsは作成するファイルの大きさがわからないため、すべてをオンデマンドで割り当てる必要があり、ddブロックサイズ以下のチャンクで割り当てます(私はそれを考えています) 64kで上限がありますが、よくわかりません)。このため、すべてのブロックに、そのブロックを格納するためのメモリを割り当てるためのオーバーヘッドがあります。

3