私のPCには64GB DDR4 3200MHzメモリがインストールされています。これを実行すると、sysbench
次のような結果が得られます。
# sysbench memory --memory-block-size=1M --memory-total-size=10G run
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
Running memory speed test with the following options:
block size: 1024KiB
total size: 10240MiB
operation: write
scope: global
Initializing worker threads...
Threads started!
Total operations: 10240 (26329.53 per second)
10240.00 MiB transferred (26329.53 MiB/sec)
General statistics:
total time: 0.3876s
total number of events: 10240
Latency (ms):
min: 0.04
avg: 0.04
max: 0.08
95th percentile: 0.04
sum: 386.04
Threads fairness:
events (avg/stddev): 10240.0000/0.00
execution time (avg/stddev): 0.3860/0.00
最大26GB / sの速度で動作することがわかりました。今まではそんなに良くなった。しかし、インストールramfs
し、同様のテストを試みたときに数字が大幅に低下しました。
# mount -t ramfs -o size=11G ramfs /mnt/ramfs/
# dd if=/dev/zero of=/mnt/ramfs/zero.img bs=1G count=10 conv=fdatasync
10+0 records in
10+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 3.51899 s, 3.1 GB/s
私の書き込み速度は約3GB / sにすぎません。ファイルシステムに若干のオーバーヘッドがあることはわかっていますが、26GB/s から 3GB/s に移動すると非常に大きなオーバーヘッドになります。
アップデート1 - 別のテスト:
# time head -c 11G /dev/zero > /mnt/ramfs/zero.img
real 0m3.046s
user 0m0.225s
sys 0m2.808s
私は何が間違っていましたか? RAMFSのパフォーマンスを向上させる方法はありますか? RAMFSがRAM自体よりはるかに遅いのはなぜですか?
答え1
8という要素はそれほど大きくはありませんが、驚くべきことではありません。ベンチマークは最初にメモリを割り当ててからアクセスします。これにはファイルシステムロジックはなく、もちろんそのメモリを実際にマッピングするにはページフォールトが必要ですが、sysbenchはHugetlbを使用してオーバーヘッドなどを最小限に抑えます。
ramfsに書き込むことは、実際にはメモリのベンチマークではなく、大きなテーブルのエントリをすばやく変更し、空きメモリページを見つけるカーネルの能力に関するものです。