Linux 固态硬盘 RAID0 + LVM 速度测试及优化要点

本文着重简述Linux 固态硬盘 RAID0 + LVM 速度测试及优化要点,不包括具体搭建。测试平台:Deepin Linux 20.2.4,自带磁盘工具gnome-disk-utility。硬件:Intel i7 4770 CPU,2条8G内存,2块金士顿A400 480G固态硬盘。演示视频地址: https://www.bilibili.com/video/BV1qh411t7Aq?share_source=copy_web

一、参数及价格
固态硬盘标称速度,480G及以上是读500M/s,写是450M/s。当前价格:480G版,309元;960G版,569元。

二、磁盘结构概览
两块硬盘各分为两两相等的4对分区,每对分区使用 mdadm 组成软件 RAID0,4个RAID0作为 LVM 的物理卷(PV)组成卷组(VG),卷组上划分逻辑卷(LV)供 Linux 作为文件系统分区。示意图如下。
这里,实际上两块硬盘可以直接组成一个大的 RAID0 就行,我分成4对分区主要是为了以后可以任意在几个分区中安装如 Windows 等系统,借助 LVM 可以在不影响已有系统的情况下随意折腾。

三、测试步骤及结论
一)、步骤
1、测试之前执行一次全文件系统 trim 操作 sudo fstrim -Av 以减少无用数据的影响。
2、分别测试两块硬盘单盘的读取性能。因为系统运行在上面,无法卸载,就不执行单盘写入测试。
3、测试一个 RAID0 的读取性能。因为其上有活动的LVM卷组,就不执行写入测试。
4、测试大的LV分区(/dev/fast/home,/home 挂载,591G)的读取性能。因为其上有挂载的 /home 文件系统,就不执行写入测试。
5、卸载小的LV分区(/dev/fast/iotest,/mnt/iotest 挂载,85G),测试读取写入性能。
二)、结论
构建在2块固态硬盘+RAID0+LVM (或2块固态硬盘+RAID0)的读写(或只读,写未测试)性能基本上达到单盘标称的2倍。
但是2块固态硬盘坏掉任意1块整个文件系统数据就丢失了,所以不适合存储重要数据。我的重要数据存储在联机的另一块机械硬盘上,并且还有另一块机械硬盘放在硬盘盒里作离线备份。

四、固态硬盘优化要点
1、不要买到不适合在 Linux 下工作的固态硬盘,这里有个黑名单:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/ata/libata-core.c#n3775 。
2、使用新内核、更新固态硬盘固件、使用成熟的 ext4 文件系统、内存大点、如果每天都要写入四五十个G的内容不要用TLC NAND的SSD固态硬盘。
3、4K对齐,现在 Linux 的分区工具如 fdisk 默认 4K 对齐了。
4、在 /etc/fstab 添加 "noatime" 或者 "relatime" mount 选项以禁止或大大减少读取文件产生的更新访问时间的写操作。
5、使用 fstrim.timer 进行固态硬盘的 trim(每周1次),而不是在 fstab 中 设置discard 选项和手动频繁执行 trim。频繁执行 trim 可能对磁盘有负面影响。
6、把 /tmp,/var/log,/var/tmp 等临时或日志目录挂载到内存中,减少对磁盘的写操作。
7、使用低延迟IO调度,echo deadline > /sys/block/sdX/queue/scheduler (不过,Deepin 内核中只含 mq-deadline 一种,据查是 deadline 针对多队列设备的变种)。
8、LVM 配置文件 /etc/lvm/lvm.conf 中设置 issue_discards = 1 在移除或缩小逻辑卷(LV)回收空间。
9、尽可能使用内存,减少交换分区的使用。在 /etc/sysctl.d/local.conf 中设置 vm.swappiness=1 。
10、在 EXT4 文件系统中禁止日志功能弊大于利,不建议禁止。
11、修改了系统参数后,执行 sudo update-initramfs -k all -u -v 更新所有内核的 /boot/initrd.img* 文件。
上面有些要点是与网上的一些文章相冲突的,一是因为有的文章是过时的,或者观点有争议的。所以我上面的优化要点仅供参考。

五、主要参考链接:
SSDOptimization
https://wiki.debian.org/SSDOptimization

ssd linux 相关黑名单:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/ata/libata-core.c#n3775

How to properly activate TRIM for your SSD on Linux: fstrim, lvm and dm-crypt
http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/

Extend the life of your SSD drive with fstrim
https://opensource.com/article/20/2/trim-solid-state-storage-linux

Should I disable journaling on Linux to protect SSD drives>?
https://www.reddit.com/r/linuxquestions/comments/al60h9/should_i_disable_journaling_on_linux_to_protect/

mdadm
https://en.wikipedia.org/wiki/Mdadm
Since version 3.7 of the Linux kernel mainline, md supports TRIM operations for the underlying solid-state drives (SSDs), for linear, RAID 0, RAID 1, RAID 5 and RAID 10 layouts.

LVM
https://wiki.archlinux.org/title/Solid_state_drive#LVM
TRIM requests that get passed from the file system to the logical volume are automatically passed to the physical volume(s). No additional configuration is necessary.

发表评论

电子邮件地址不会被公开。 必填项已用*标注