03-31-2020, 02:40 PM
最近给一台电脑测试 Windows 系统,于是我拿了手上一块东芝的 320GB 机械硬盘装上 Windows 7. 结果遇到了一些怪现象,就是操作的时候时不时的会卡顿,此时硬盘灯一直亮着。我开始以为是因为内存太小导致 swap 次数过多,但是用任务管理器和性能分析器观察了一下,内存使用率不大的时候也会卡,于是我就怀疑到硬盘上来。
既然是硬盘的问题,首先我就怀疑是不是有坏道。进入 GNU/Linux 用 fdisk -l 查看硬盘分区的时候,到这块硬盘的时候也会卡顿,但是 dmesg 并没有显示 I/O error. 也就是说,卡顿不一定是由坏道引起。那么我就想看看硬盘到底有多慢,用 hdparm -t 看了一下,发现硬盘的速度出奇的低,hdparm 做了 3s 的读取居然才测出几 M/s 的速度。为了排除是 hdparm 读取固定位置造成的偏差,我试着用 hdparm 的 --offset 参数读不同的位置,最后干脆写成了以下脚本(脚本已经整理过,使用时把 DEV 换成要测的硬盘)。
结果发现硬盘的确是非常的慢。但是没有 I/O error,还是排除坏道的可能。没办法,我就把数据迁移到一块西数 500G 机械硬盘上。这块西数硬盘用以上脚本测试,在每个位置做 3s 读取速度都是接近 100MB/s.
然后就发现了奇怪的结果。我做数据迁移用的是 partclone,partclone 报告出的数据迁移速度是 6GB/min 多一点的,平均到秒就是 100MB/s 多一点的速度。可是按照这块东芝硬盘用 hdparm 测试的读取速度,这是不应该发生的。于是我做一个更长时间的测试,用 dd 读上 G 的数据,例如:
然后我就发现,开始的时候读取速度的确很慢,但逐渐加快,到 9s 的时候,速度就上到 100MB/s,这就解释了为什么 partclone 可以到这个速度。因为长时间连续读取时,硬盘会达到最大的速度。但是操作系统经常做随机读取,这样就导致了硬盘经常卡顿。
由此可以得出一点结论,这块东芝硬盘的读取延迟非常大,但是大量连续读写数据的性能是正常的。从机械硬盘的工作原理来看,这块硬盘可能寻道时间很长。此外,系统的电源管理是否造成了这样的性能表现,也有待进一步检查。
既然是硬盘的问题,首先我就怀疑是不是有坏道。进入 GNU/Linux 用 fdisk -l 查看硬盘分区的时候,到这块硬盘的时候也会卡顿,但是 dmesg 并没有显示 I/O error. 也就是说,卡顿不一定是由坏道引起。那么我就想看看硬盘到底有多慢,用 hdparm -t 看了一下,发现硬盘的速度出奇的低,hdparm 做了 3s 的读取居然才测出几 M/s 的速度。为了排除是 hdparm 读取固定位置造成的偏差,我试着用 hdparm 的 --offset 参数读不同的位置,最后干脆写成了以下脚本(脚本已经整理过,使用时把 DEV 换成要测的硬盘)。
引用:#!/bin/bash
DEV=/dev/sda
SIZE=$(blockdev --getsz $DEV)
SIZE_GB=$(($SIZE*512/1024/1024/1024))
OFFSETS=($(for i in $(seq 0 ${SIZE_GB}); do echo $i; done | shuf))
for i in "${OFFSETS[@]}"
do
hdparm -t --offset "$i" "$DEV"
done
结果发现硬盘的确是非常的慢。但是没有 I/O error,还是排除坏道的可能。没办法,我就把数据迁移到一块西数 500G 机械硬盘上。这块西数硬盘用以上脚本测试,在每个位置做 3s 读取速度都是接近 100MB/s.
然后就发现了奇怪的结果。我做数据迁移用的是 partclone,partclone 报告出的数据迁移速度是 6GB/min 多一点的,平均到秒就是 100MB/s 多一点的速度。可是按照这块东芝硬盘用 hdparm 测试的读取速度,这是不应该发生的。于是我做一个更长时间的测试,用 dd 读上 G 的数据,例如:
引用:dd if=/dev/sda of=/dev/zero bs=1M count=1000 skip=1000 status=progress
然后我就发现,开始的时候读取速度的确很慢,但逐渐加快,到 9s 的时候,速度就上到 100MB/s,这就解释了为什么 partclone 可以到这个速度。因为长时间连续读取时,硬盘会达到最大的速度。但是操作系统经常做随机读取,这样就导致了硬盘经常卡顿。
由此可以得出一点结论,这块东芝硬盘的读取延迟非常大,但是大量连续读写数据的性能是正常的。从机械硬盘的工作原理来看,这块硬盘可能寻道时间很长。此外,系统的电源管理是否造成了这样的性能表现,也有待进一步检查。