SDB:SSD 性能
本文档解释了如何优化 openSUSE 以获得 SSD 的最佳性能。
情况
您的新电脑配备了 SSD 驱动器。您可能不想过早地使其磨损,并且希望尽可能地利用其性能。那么,您应该使用什么文件系统?还有其他什么需要做的吗?您可以在这里找到答案。
最大化性能与耐用性
本文档描述了您需要做的几个选择
TRIM
有关 TRIM 的更多信息,请参阅 wiki 上的 SSD Discard 支持 文章。
需要注意的是,与 SSD 不同,不应将“discard”应用于 NVMe SSD,如 ArchWiki 所述,而应使用定期或手动 Trim 来处理 NVMe SSD。如果安装在 NVMe SSD 上,openSUSE Tumbleweed 已经处理了这个问题。可以使用以下命令确认支持:
$ systemctl status fstrim ● fstrim.service - Discard unused blocks Loaded: loaded (/usr/lib/systemd/system/fstrim.service; static; vendor preset: disabled) Active: inactive (dead)
Intel SSD
旧版 Intel SSD 固件中存在一个错误,当 smartd 守护程序运行时会导致停滞,而 smartd 守护程序默认情况下是启用的。要解决此问题,请从 [1] 升级您的驱动器固件
文件系统
最适合 SSD 驱动器的文件系统是 BTRFS 和 EXT4。BTRFS 文件系统甚至有一个名为ssd用于在 /etc/fstab 中针对 SSD 上的分区使用的选项。
在本文档中,我们假设/dev/sda(这里,a 表示设备 0) 是您的 SSD (它可能是/dev/nvme0n1(这里,0 表示设备 0) 对于 NVMe SSD)。
创建 TMPFS 文件系统
强烈建议将数据的最不稳定部分放在 TMPFS 上 - 这尤其包括 /tmp 目录。该目录仅包含在重新启动时删除的临时文件。将此内容保存在内存中是节省 SSD 工作量的一种极佳方式。仅针对 openSUSE Tumbleweed,由于 20200806 快照版本的新安装默认情况下使用 tmpfs 作为 /tmp。对于之前的安装,或对于 Leap,需要手动启用 tmpfs 作为 /tmp,如下所示。请注意,如果您长时间运行系统,此目录的大小(因此其内存使用量)可能会大幅增加。如果您遇到内存压力,建议退出您的 DE,删除内容,然后重新登录。
将 /tmp 挂载到 tmpfs 文件系统
这将创建/tmp在启动时在内存中创建文件夹。
Tumbleweed 和 Btrfs
当 Btrfs 文件系统用于 Tumbleweed 的根分区时,默认情况下(截至 20170403 快照)/tmp 挂载在 / 分区的一个子卷上。它在 /etc/fstab 中有一个条目,如下所示(内容用 __ 和 __ 括起来,它们本身是为了替换实际内容而使用的描述):
UUID=__string of UUID__ /tmp btrfs subvol=@/tmp 0 0
在这种情况下,之前描述的 systemd 方法可能无法将 /tmp 从 subvol=@/tmp 更改为 tmpfs 文件系统。然后,可以取消该行之前的 #,并添加另一行以将创建的 TMPFS 作为 /tmp 挂载。例如:
#UUID=__string of UUID__ /tmp btrfs subvol=@/tmp 0 0 #__other subvols__ tmpfs /tmp tmpfs uid=root,gid=root,mode=1777,size=512M 0 0
其中 size=512M 是一个选项,用于将 /tmp 的 最大 容量设置为 512MiB。您也可以使用 size=2G 表示 2GiB,甚至使用 size=25% 的相对大小,表示总物理内存大小,具体取决于可用的总物理内存大小。
其他更改
您可以进行其他一些更改
EXT4 的 noatime
您应该在 /etc/fstab 中进行的一项更改是确保您的 SSD 具有 noatime 选项
/dev/sda1 / ext4 noatime,defaults 0 1
noatime 可能会破坏一些备份工具;使用 relatime 可以解决该问题。
调整内核 (I/O 调度器)
首先检查调度器。对于 `sda` 设备:
$ cat /sys/block/sda/queue/scheduler noop deadline [cfq]
这里,'cfq' 处于活动状态(由 `[ ]` 表示)。对于 NVMe SSD 设备:
$ cat /sys/block/nvme0n1/queue/scheduler [none] mq-deadline kyber bfq
'none' 被选中,这意味着未使用任何调度器。如果涉及其他设备,请相应地更改路径。
建议您将默认调度器从 cfq 更改为 deadline,但仅针对非旋转磁盘。
#set noop scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
# set cfq scheduler for rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="cfq"
注意:根据 Phoronix 报告的测试,'none' 在 none、mq-deadline、kyber 和 bfq 中是 NVMe SSD 的最佳选择。
readahead
您可以禁用 readahead,因为它对于具有最小寻道时间的 SSD 来说几乎没用。
完成了。
禁用 SSD 上的交换空间
大多数配备 2GB+ 内存的现代计算机很少会使用交换空间,除非需要将其用于在驱动器上存储数据(例如休眠功能)。以下是一种可以减少写入交换区域的量,以帮助防止 SSD 磨损的调整。
或者,如果您希望使其永久生效,可以将以下行添加到 /etc/sysctl.d/99-sysctl.conf
vm.swappiness=1 vm.vfs_cache_pressure=50
更多
闪存以大于测量分区的 512 字节单元的块进行管理。使用默认的 Linux 工具(但对于足够新的 openSUSE,12.2 或更高版本,不应存在问题),您肯定会以一种生成不必要 I/O 的方式对齐文件系统,因为每次写入数据时,它都会触及两个而不是一个块。您可以通过将分区和文件系统对齐到大于 512 字节的块并确保它们从 0 开始来解决此问题。
但是,这是一个相当复杂的过程,您只能在新 SSD 上执行此操作。在下面的链接中,您可以找到有关如何执行此操作的信息