我的 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
它表明它的工作速度高达 26 GB/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 实际上并不是内存的基准,而是内核快速更改大表中的条目并查找空闲内存页的能力的基准。