SATA Q&A

Q1: 如何测量硬盘读写速度?

用命令测试一下磁盘性能,下面介绍两个常用命令:

Hdparm

用法如下:

Hdparm --t   /dev/sda

dd

dd 指令 主要是对整个HD进行测试,而不是partition。

dd if=/dev/zero of=/dev/sda bs=4k count=1000000

两个命令的差别:

在测试HD IO performance ,建议用 "hdparm" 比用 dd 好,減少误判狀況

不建议dd 对 partition 操作,若是 dd partition 会有不准的情况。

使用举例如下:

测试sda

测试它的分区sda1

测试sda节点,两者的速度差了15M左右。而测试它的分区sda1,两者差了50M左右了。

dd命令只是对速度进行简单的评估,但如果要测比较准确的测试,还是建议使用Hdparm工具来测吧。

Q2: 硬盘disk在运行过程中出现问题,重启以后再也无法识别,但是使用工具在pc上是可以识别的,第一次出现问题时打印日志如下,这是什么问题?

从日志看,SATA已经读取硬盘失败了,而且retry了5次都是失败的,说明硬盘确实已经无法操作了,导致硬盘出现问题的情况比较多,典型的是:硬盘高速运行期间,磁盘发生震荡,或强制拔掉硬盘的电源线或数据线,或者外部供电不稳定,导致的硬盘操作io异常。

第一个要重点注意的就是,保证硬盘的外部环境正常,不要在运行期间,随意的移动硬盘。

第二个就是排查电路,是否供电正常。

因为pc上还可以识别,排除物理性的损坏,所以,不是运行期间震荡或者拔线导致的。

然后排查电路,用硬件工具排查一下,看sata供电是否正常,是否稳定。如果电流长期在硬盘工作需求之下,有可能当时不会出问题,但运行一段时间就会出现题中所述的这种情况。

把电源换成6A的电源,继续煲机一周,没再出现该问题。

所以,最终确认该问题为硬盘供电电流不足导致的异常。

解决方案: 电源长期供电不足会导致硬盘异常。需要找硬件设计的确定硬盘能获取到多少电流,是否能满足硬盘电流需求,然后换一个合适的供电电源,以确保硬盘供电正常。

Q3:APP对硬盘节点进行操作后(如格式化),出现读取不到硬盘的节点(ex: /dev/sda1)的问题

如果出现这种情况,请用命令试一下 mdev -s

如果使用命令后,能出现相应的节点,可以将该命令写入到程序中。

Q4:如何查看查看HD相关信息?

使用smartctl命令:

  1. 使能SMART support的指令:

    ./smartctl --smart=on /dev/sda
    
  2. 查看HD温度:

    ./smartctl -a /dev/sda -s on
    
  3. 查看HD 全部信息: (这个最全) ,整颗HD好坏,这个信息最准

    ./smartctl -i /dev/sda
    

Q5:我们系统是否支持2T以上的硬盘?

支持,默认系统已经开启。

如果没有开启,请确认kernel编译时(make menuconfig)是否有打开以下两个选项:

同时配置make依赖的配置文件也要修改支持,配置:CONFIG_LBDAF=y,例如使用配置文件:mercury6_ssc016a_s01a_spinand_defconfig,配置如下:

然后再make config,重新编译烧写替换。

此外,2T以上的硬盘,不要使用MBR进行分区,请使用gpt方式进行分区。

Q6:使用fdisk -l命令查看硬盘信息,发现2T以上的硬盘识别成2T容量,如下图

fdisk命令只能对2T的硬盘进行操作,超过2T的是识别不到的,也无法进行分区操作;属于工具的限制。

可以使用parted工具进行操作,parted命令查看正常,如下图:

Q7: 使用dd命令测试硬盘写的速率时,与磁盘的实际速度相差太大(50Mbps以上),磁盘读写命令:dd if=/dev/zero of=/dev/sda count=50000 bs=64000

在写磁盘数据时,要注意对齐,一次写入的数据(bs)最好是4k的整数倍,可以将题中的读写命令改为:dd if=/dev/zero of=/dev/sda count=50000 bs=64k,再进行测试。

使用上述命令及修改后的命令测试,在demo板上测试情况如下:

使用64k速度明显大幅提升。

Q8:如何修改sata速率?

在 kernel\arch\arm64\boot\dts\sstar\infinity7.dtsi 文件中sata节点 phy_mode进行修改:

phy_mode = <0>; 表示 1.5 Gbps

phy_mode = <1>; 表示 3.0 Gbps

phy_mode = <2>; 表示 6.0 Gbps

例如:如下设定表示sata速率是 6.0 Gbps。

sata {
    ... ...
    phy_mode = <2>;
    ... ...
};

Q9:创建raid5后,可以只做resync,不做recovery吗?

在创建raid5时,一般不需要做recovery,如果是直接使用命令mdadm进行创建的,可以添加–force命令,这样就只做resync,不做recovery了。

Q10:raid5在recovery时,此时读写效率比较低,怎么样提高读写速率呢?

可以降低recovery的读写速率,使用命令进行设置:

sysctl -w dev.raid.speed_limit_max=30000

设置后,recovery的速率就变成了30MBps(默认200MBps),此时进行读写操作,影响就会比较小。

设置值的大小,需要按照实际情况进行调整。

Q11:创建raid5,可以用不同容量的盘进行组建吗?

可以。

但是建议使用相同的容量的盘,因为如果容量不一样,总的的容量不是简单的所有盘容量的相加,而是所有的盘都会按照最小的盘的容量进行组合,而多余的那部分则没法使用,造成浪费。