如何优化 SSD 的操作系统?

Lar*_*eth 154 performance ssd

在固态驱动器上安装 Ubuntu 之前/期间/之后应该采取哪些步骤来优化性能并确保驱动器的最大耐用性?

jr0*_*ket 113

我已经成功地使用了几种不同的技术来改进 Ubuntu 使用存储设备的方式,无论是固态驱动器还是传统驱动器。

对于 SSD,您也希望尽量减少写入驱动器的次数,因为读取不应增加驱动器的磨损。

1) 管理交换文件

如果您不使计算机休眠并且您有足够的 RAM 内存来运行所有应用程序,那么理论上您不需要交换分区。

如果您混合使用 SSD 和硬盘驱动器,请仅将交换分区放在硬盘驱动器上。

2) 无写入读取时间戳(适用于 SSD 和硬盘驱动器)

使用选项noatimenodiratime挂载分区将在您读取文件和文件夹时停止时间戳写入。除非您使用本地邮件服务器客户端(例如 mutt),否则通常不需要这些时间戳写入。这通常是一个坏主意,因为每次读取都会在更新时间戳时产生写入。这会缩短 SSD 的使用寿命。

编辑您的/etc/fstab配置文件(小心 - 进行备份以确保破坏您的 fstab 配置会阻止您的系统工作):

cp /etc/fstab ~/fstab-backup
gksudo gedit /etc/fstab
Run Code Online (Sandbox Code Playgroud)

通过将文本 noatime 和 nodiratime 添加到定义根 (/) 和其他分区 (/home) 的行中来编辑分区的挂载选项 -注意:如果您有 /home 分区,请从更改开始如果您担心破坏某些东西,请使用该分区

# / was on /dev/sda2 during installation
UUID=587e0dc5-2db1-4cd9-9792-a5459a7bcfd2 /               ext4    noatime,nodiratime,errors=remount-ro 0       1

# /home was on /dev/sda3 during installation
UUID=2c919dc4-24de-474f-8da0-14c7e1240ab8 /home           ext4    noatime,nodiratime,defaults        0       2
Run Code Online (Sandbox Code Playgroud)

在这些更改生效之前,您需要重新启动机器

3) 最小化操作系统和应用程序的写入

假设您没有运行关键任务产品服务器,大多数人不会在出现问题时查看日志(特别是因为大多数 Ubuntu 用户很少出现严重错误)。因此,您可以配置 Ubuntu,以便将所有日志写入 RAM 内存而不是 SSD。

注意:只有在安装了要使用的所有软件(尤其是 Apache Web 服务器之类的东西)后才进行以下更改,否则您可能会遇到 /var/log 中缺少目录的问题

有关此方法的背景信息,请参阅ubuntu-eee.com 上的延长闪存驱动器的使用寿命

用编辑器打开/etc/fstab(假设你已经备份了 /etc/fstab 文件)

gksudo gedit /etc/fstab
Run Code Online (Sandbox Code Playgroud)

在 fstab 文件末尾添加以下行并保存:

# Uncomment these after all server based applications installed - eg. apache
#tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
#tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
#tmpfs /var/log tmpfs defaults,noatime,mode=0755 0 0 
#tmpfs /var/log/apt tmpfs defaults,noatime 0 0
# none /var/cache unionfs dirs=/tmp:/var/cache=ro 0 0
Run Code Online (Sandbox Code Playgroud)

在这些更改生效之前,您需要重新启动机器

也可以看看:

  • 关于日志和内容的最后一点,`tmpfs` 行被注释,那么为什么添加这些行会有什么不同呢?我们需要将它添加为未注释吗? (8认同)
  • 我可以理解这是否是为了提高速度,但你写的大部分内容似乎都是为了提高 SSD 寿命。对于现代 SSD,这些改进不是毫无意义的吗?并且以更多的内存使用为代价!(例如,请参阅 [this other answer](http://askubuntu.com/a/1689/43660) 中给出的链接) (8认同)
  • 没有必要2)。relatime 很好地完成了防止写入的工作,并且自 [kernel 2.6.30](http://kernelnewbies.org/Linux_2_6_30) 以来,默认情况下它一直处于活动状态。 (7认同)
  • 只是为了添加到@MihaiCapotă 的评论中,有一个 [Server Fault answer](http://serverfault.com/a/47487/82301),其中包含有关为什么不需要 noatime 的更多详细信息。 (4认同)

Ham*_*ner 94

固态硬盘寿命

通常我不会打扰 - 对 SSD 寿命的担忧被夸大了。你可以阅读这篇详细的文章,了解为什么你真的不应该担心。简而言之,现代 SSD 内部的电路为您管理磨损均衡,他们比您更知道如何做到这一点。

文章中计算了以 80M/s 的连续速率接收写入的 SSD 的寿命。寿命51岁。这是基于 2007 年的技术 - 现在 SSD 的寿命会更长。而且您几乎可以肯定不会一天 24 小时以 80M/s 的速度写入 SSD。

固态硬盘性能

然而,随着时间的推移性能下降可能是一个问题,TRIM是解决方案。有两种选择

  • 自动/在线修剪,又名丢弃
  • 手动修剪

您必须自己启用自动修剪。(基本上,您将该discard选项添加到您的挂载选项中,前提是您使用的是 ext4。)我发现一篇博客文章报告说,在删除文件时丢弃选项会降低您的系统速度

您偶尔可以使用fstrim手动(或在 cron 作业中)执行此操作。如果您只有一个分区,那么您需要做的就是:

sudo fstrim /
Run Code Online (Sandbox Code Playgroud)

请注意, fstrim 仅在 11.10 及更新版本中可用。对于较旧的系统,您将需要该wiper.sh脚本。我/usr/share/doc/hdparm/contrib/wiper.sh.gz在我的系统上找到了脚本。

如果您想知道,TRIM 解决的问题,如Wikipedia 所述,是:

SSD 将数据存储在分组为页面的闪存单元中,页面(通常每个 4 kB)组合成块(通常每个块 128 个页面,总计 512 kB)。NAND 闪存单元只能在空时直接写入。如果认为它们包含数据,则首先需要擦除内容,然后才能可靠地执行写入操作。在 SSD 中,写入操作可以在页面级别完成,但由于硬件限制,擦除命令总是会影响整个块。因此,只要可以使用空页面将数据写入 SSD 介质的速度就会非常快,但是一旦需要覆盖之前写入的页面,速度就会大大减慢. 由于在再次写入之前需要擦除页面中的单元,但只能擦除整个块,因此覆盖将启动读取-擦除-修改-写入循环:必须存储整个块的内容在闪存介质上被有效擦除之前,被覆盖的页面在缓存中被修改,因此缓存的块是最新的,只有这样整个块(带有更新的页面)才会写入闪存介质。这种现象称为写放大。

  • 我希望我可以多次投票。这将是这些答案之一。该链接解决了我长期以来的担忧。非常感谢哈米什。 (8认同)
  • 文章参考了企业级SSD:他使用了200万次写耐力周期。消费级 SSD 大约有 3000-5000 次循环。具有 3000 个周期的 128 GB SSD 可提供 57 天的连续 80MB/s 写入。 (3认同)
  • 从 Ubuntu 14.10 开始,在 fstrim 支持的所有 SSD 上每周都会自动进行 TRIMming。[参考](http://askubuntu.com/a/19480/263353) (2认同)

Seb*_*ühl 20

有几点:

结盟:

经常被指出的是分区的正确对齐。这应该等于 SSD 的块大小。安全操作并使您的分区与 MiB 边界对齐。请注意,您无法使用 Ubuntu 安装程序的分区工具(使用 MB 而不是 MiB)来执行此操作,但您可以启动 live CD,使用 Gparted(使用 MiB),然后单击安装以使用您设置的分区。

正确的调度程序:

重要的一点是调度程序应该是noop。您可以通过内核参数elevator=noop或通过echo noop > /sys/block/sda/queue/schedulerrc.local 中的条目设置此调度程序。

安装标志:

我会推荐noatimediscard

tmpfs

将 tmp 放在 ramdisk 上可以增加 ssd 的使用寿命。要使用它,请在 fstab 中添加以下行:none /tmp tmpfs defaults 0 0

一般来说,如果你想更深入地研究这个话题,我会推荐这篇优秀的维基文章。


And*_*ovs 16

Ubuntu 上的 SSD 快速调优课程:

文件系统

Arch wiki提到了几个 SSD 文件系统的首选选项 - 其中之一是不稳定的,其他是ext * 的。我认为ext4是最好的选择之一。
注意:在ext4 的情况下,您可能需要使用discard挂载选项。

# <file system> <mount point> <type> <options>                                  <dump>  <pass>
proc            /proc         proc   nodev,noexec,nosuid                        0       0
tmpfs           /tmp          tmpfs  nodev,nosuid,noatime,mode=1777             0       0
/dev/sda1       /             ext4   defaults,noatime,discard,errors=remount-ro 0       1
/dev/sda2       /home         ext4   defaults,noatime,discard,user_xattr        0       2
/dev/sda3       /windows      ntfs   defaults,noatime,discard,umask=007,gid=46  0       0
Run Code Online (Sandbox Code Playgroud)

这里有几件重要的事情:

  • 对于内存 >=2 gigs 的系统,在 RAM 中定位 /tmp 是可取的。
  • 没有swap分区。现在它只用于休眠,因为现代机器有相当大的内存。
  • noatimediscard选项。信息在这里

调度器

考虑从默认调度程序(在大多数 Linux 发行版中为 cfq(完全公平排队))切换到 SSD 的 noop 或截止日期调度程序。例如,使用 noop 调度程序,只需按照收到的顺序处理请求,而无需考虑数据在磁盘上的物理位置。此选项被认为对 SSD 有利,因为 SSD 上所有扇区的寻道时间都相同。

将以下内容添加到/etc/rc.local

# SSD performance tuning
echo noop > /sys/block/sda/queue/scheduler
Run Code Online (Sandbox Code Playgroud)

信息

一个 2

  • 并不真地。`tmpfs` 默认是 RAM 的 10%。不过,可以使用 `size` 选项调整大小。 (5认同)
  • 如果没有 *swap*,并且在 RAM 中有 `/tmp`,很容易出现 *out of memory* 的情况,因为很多程序使用 `/tmp` 作为存储空间(例如 *Brasero* 用于存储DVD 图像)。 (2认同)

Uli*_*Uli 8

4)启用自动TRIM

如果您的SSD支持的话,你也应该启用自动TRIM(如描述这里