我有一台 HPE ProLiant DL360 Gen9 服务器,规格如下:
- CPU:Intel Xeon 2 CPU E5-2687W v3 @ 3.10GHz,25MB L3 缓存,每颗 10 个核心
- 内存:8x 32GB PC4-17000 DDR4 2133MHz CAS-15 1.2V SDRAM DIMM(共 256 GB)
(完整服务器规格这里)
服务器正在CentOS 7.2
使用内核运行3.10.0-327.36.3.el7.x86_64
。
我使用以下条目在服务器上安装了 tmpfs ramdisk /etc/fstab
:
tmpfs /ramdisk tmpfs noauto,user 0 0
为了测试写入此 ramdisk,我运行以下命令:
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/秒(根据这内存数据速率描述),我对写入 tmpfs ramdisk 时相当低的速率感到惊讶。有人能解释这种差异吗,并建议另一种更快的内存文件写入方法吗?
谢谢。
更新
我禁用了vm.swappiness
,但没有任何好处(1712 MiB/秒)。
我也尝试增加块大小(bs=256k count=468750
),但同样没有太大效果(2087 MiB/秒)。
答案1
当您使用内存文件系统时,除了将数据放入 RAM 之外,还有很多事情要做。您仍然必须处理与文件相关的数据结构,包括跟踪内存中所有分配的位置。写入这些信息也需要时间(特别是,对于您正在进行的测试,您的文件大小会在每次写入时更新,这会立即使内存中数据发生变化的位置数量翻倍)。
此外,分配内存是极其很慢。事实上,它是大多数不涉及 I/O 的系统上最慢的事情之一,唯一明显更慢的事情是创建新线程或进程。诸如此类的工具会ramspeed
在启动时预先分配它们将使用的所有内存,以便测试实际的内存性能。相比之下,tmpfs 不知道您要创建的文件有多大,因此它必须按需分配所有内容,并且以不大于块大小的块进行分配dd
(我认为它的上限是 64k,但我不确定)。因此,您在每个块中分配内存以存储该块会产生开销。