SDB:SSD 性能

跳转到:导航搜索


在 openSUSE 上测试

相关文章


本文档解释了如何优化 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 文件系统

# ln -s /usr/share/systemd/tmp.mount /etc/systemd/system/

这将创建/tmp在启动时在内存中创建文件夹。

Tumbleweed 和 Btrfs

当 Btrfs 文件系统用于 Tumbleweed 的根分区时,默认情况下(截至 20170403 快照)/tmp 挂载在 / 分区的一个子卷上。它在 /etc/fstab 中有一个条目,如下所示(内容用 ____ 括起来,它们本身是为了替换实际内容而使用的描述):

UUID=__string of UUID__ /tmp btrfs subvol=@/tmp 0 0

在这种情况下,之前描述的 systemd 方法可能无法将 /tmpsubvol=@/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,但仅针对非旋转磁盘。

# vi /etc/udev/rules.d/60-sched.rules
#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 来说几乎没用。

# systemctl disable systemd-readahead-collect.service
# systemctl disable systemd-readahead-replay.service

完成了。

禁用 SSD 上的交换空间

大多数配备 2GB+ 内存的现代计算机很少会使用交换空间,除非需要将其用于在驱动器上存储数据(例如休眠功能)。以下是一种可以减少写入交换区域的量,以帮助防止 SSD 磨损的调整。

# echo 1 > /proc/sys/vm/swappiness

或者,如果您希望使其永久生效,可以将以下行添加到 /etc/sysctl.d/99-sysctl.conf

vm.swappiness=1
vm.vfs_cache_pressure=50

更多

闪存以大于测量分区的 512 字节单元的块进行管理。使用默认的 Linux 工具(但对于足够新的 openSUSE,12.2 或更高版本,不应存在问题),您肯定会以一种生成不必要 I/O 的方式对齐文件系统,因为每次写入数据时,它都会触及两个而不是一个块。您可以通过将分区和文件系统对齐到大于 512 字节的块并确保它们从 0 开始来解决此问题。

但是,这是一个相当复杂的过程,您只能在新 SSD 上执行此操作。在下面的链接中,您可以找到有关如何执行此操作的信息

参见

相关文章

外部链接