我有两个节点(每个节点有 3 个专用数据驱动器),它们显示出截然不同的写入速度。它们的“hdparm”输出看起来相同,并且它们的“hdparm -t -T”输出也相当,但在已安装的文件系统上运行“dd”命令会产生截然不同的写入速度。再次使用“dd”测试读取速度会产生类似的结果。
服务器和硬盘是完全相同的型号,都运行相同的软件包(我们使用 chef 将包推送到我们的集群上)。
我正在寻找一些可以检查的参数或其他可以运行的测试,以帮助我解决性能差异。它看起来是在 OS/FS 级别,但我不确定还要看什么。两个挂载的文件系统都是 EXT4,并且启用了 noatime 和 user_xattr。
快速服务器:
hdparm -t -T
输出:
/dev/sdb1:
Timing cached reads: 2138 MB in 2.00 seconds = 1070.08 MB/sec
Timing buffered disk reads: 232 MB in 3.02 seconds = 76.84 MB/sec
写出一个 4GB 的测试文件
$ dd bs=4K if=/dev/zero of=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 40.1102 s, 107 MB/s
0.20user 10.91system 0:40.14elapsed 27%CPU (0avgtext+0avgdata 3472maxresident)k
16inputs+8388608outputs (1major+263minor)pagefaults 0swaps
从磁盘读取该文件(并读取到 /dev/null)
$ dd bs=4K of=/dev/null if=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 53.3914 s, 80.4 MB/s
0.19user 5.80system 0:53.53elapsed 11%CPU (0avgtext+0avgdata 3488maxresident)k
8389872inputs+0outputs (2major+264minor)pagefaults 0swaps
慢节点:
hdparm -t -T
输出
/dev/sdc1:
Timing cached reads: 1982 MB in 2.00 seconds = 991.27 MB/sec
Timing buffered disk reads: 224 MB in 3.02 seconds = 74.16 MB/sec
$ dd bs=4K if=/dev/zero of=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 98.1583 s, 43.8 MB/s
0.35user 17.58system 1:38.17elapsed 18%CPU (0avgtext+0avgdata 3456maxresident)k
8inputs+8388608outputs (0major+263minor)pagefaults 0swaps
$ dd bs=4k of=/dev/null if=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 54.7789 s, 78.4 MB/s
0.25user 10.84system 0:54.92elapsed 20%CPU (0avgtext+0avgdata 3488maxresident)k
8389864inputs+0outputs (2major+263minor)pagefaults 0swaps
答案1
尝试
hdparm -i -I /dev/sda
对于两个驱动器和不同的输出,应该会向您显示是否存在不同的 dma 或前瞻设置。
根据您的发行版,应该有一个地方放置 hdparm 设置以确保它们相同。
我还会仔细检查电缆。可能只是一个驱动器坏了,你可能需要检查智能 ECC 速率等。
/usr/sbin/smartctl -A -H /dev/sda
/usr/sbin/smartctl -a /dev/sda
是我用来检查驱动器是否智能的方法。
答案2
可能是磁盘坏了。检查错误。(还要检查输出以查看它们是否真的相同:型号、固件、大小和扇区大小)
smartctl -a /dev/sdb smartctl -a /dev/sdc
如果出现错误,请运行一个简短的测试(需要 2 分钟):
smartctl -t 短/dev/sdb
如果测试顺利通过且没有错误,则使用“long”而不是“short”(需要几个小时)再次运行。
然后,当它完成后,再次使用“-a”进行检查,并将零写入该扇区的磁盘以重新定位它们(这会破坏数据!请非常小心您输入的内容,因为那是在原始级别用零覆盖的内容)。
例如,如果您的扇区大小为 512 且 LBA 555 已损坏,则输入此命令(破坏数据!)
dd if = / dev / zero of = / dev / sdb bs = 512 count = 1 seek = 555
我会做更高的计数,这样您就不需要经常重复测试和写零,因为坏扇区通常彼此相邻。(破坏更多数据!)
dd if = / dev / zero of = / dev / sdb bs = 512 count = 500 seek = 555
也许您的对齐方式是错误的。确保所有分区都从 63 开始或之后,并且如果您的逻辑扇区大小小于物理扇区大小,请确保您的对齐方式可以被 physicalsize/logicalsize 整除。这应该会极大地影响写入速度,但不会对读取速度产生很大影响/根本不会。
例如,如果物理扇区是 4096,逻辑扇区是 512,那么起始扇区必须能被 8 整除 (4096/512)。在某些磁盘上,起始扇区必须远高于 63。在这些磁盘上,我使用 252 作为第一个分区的起始扇区。
如果您使用的是 SSD,还必须对齐到擦除块。对齐的安全数字是 129024 的倍数(这满足旧磁盘上的 63 要求、4096 字节扇区 [高级格式磁盘,例如大多数 Seagate 和 WD Green 磁盘]、大多数 SSD 上的 1024 MB 和罕见 SSD 上的 2048 MB)
此外,对于 SSD,如果它们看起来很慢,您应该在使用它们之前用供应商提供的工具擦除它们,或者使用 TRIM。
使用适当的基准测试。
除非使用 conv=fdatasync 或其他方法,否则您无法使用 dd 进行写入测试。David Schwartz 建议使用“time dd ...”,但如果您使用 conv=fdatasync,它会告诉您 dd 中的正确时间和速度,而无需您自己重新计算。如果您有大量 RAM 或写入缓存,如果您不使用 conv=fdatasync 之类的选项,那么您正在测量 RAM 和磁盘。http://romanrm.ru/en/dd-benchmark
例如。
dd bs=4K if=/dev/zero of=/mnt/vol1/test.file count=1M conv=fdatasync
使用适当的基准测试。(第 2 部分)
许多文件系统或磁盘在写入零时的表现会非常不同。您需要使用随机文件才能获得最佳效果。
例如。
第一次复制到 RAM
cp /某处/带有/big/files/bigfile.iso /dev/shm
运行测试
dd bs=4K if=/dev/shm/bigfile.iso of=/mnt/vol1/test.file count=1M conv=fdatasync
或者
准备随机文件
dd if=/dev/random of=/dev/shm/randfile bs=1M count=500
运行测试
dd bs=4K if=/dev/shm/randfile of=/mnt/vol1/test.file count=1M conv=fdatasync
另外,如果您的磁盘不太一样,或者有不同的文件系统,它们在 4k 块大小下的性能会有很大差异。还要测试 128k 和 1M。