如何为SSD优化操作系统?

在安装Ubuntu到固态硬盘之前/期间/之后,有哪些步骤可以优化性能并确保驱动器的最大耐用性?
13个回答

我成功地使用了几种不同的技术来改善Ubuntu对存储设备(无论是固态还是传统硬盘)的使用方式。
对于固态硬盘(SSD),您需要尽量减少写入次数,因为读取操作不会对硬盘造成磨损。
1) 管理交换文件
如果您不休眠计算机,并且有足够的RAM内存来运行所有应用程序,理论上您不需要交换分区。
如果您同时使用SSD和传统硬盘,请将交换分区放在传统硬盘上。
2) 读取时间戳时不进行写入(适用于SSD和传统硬盘)
使用选项“noatime”和“nodiratime”挂载分区可以阻止在读取文件和文件夹时进行时间戳写入。除非您使用本地邮件服务器客户端(如mutt),否则通常不需要这些时间戳写入。之所以通常不建议这样做,是因为每次读取都会在更新时间戳时产生写入操作,从而缩短SSD的寿命。
请谨慎编辑您的/etc/fstab配置文件(务必备份以确保安全,因为破坏fstab配置可能导致系统无法正常工作)。
cp /etc/fstab ~/fstab-backup
gksudo gedit /etc/fstab

编辑您的分区挂载选项,通过在定义根(/)和其他分区(如果有的话,/home)的行中添加noatime和nodiratime文本来实现- 注意:如果您有一个/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

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

3) 减少操作系统和应用程序的写入

假设您不在运行关键任务的产品服务器上,大多数人在出现问题时不会查看日志(尤其是对于大多数Ubuntu用户来说,严重错误很少发生)。因此,您可以配置Ubuntu,使所有日志都写入RAM内存而不是SSD。

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

有关此方法的背景,请参见在ubuntu-eee.com上延长闪存驱动器的寿命

使用编辑器打开/etc/fstab文件(假设您已备份/etc/fstab文件)

gksudo gedit /etc/fstab

在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

在这些更改生效之前,您需要重新启动计算机。
另请参阅:
- 如何启用 TRIM?(链接:How to enable TRIM?

不错的发现,JR0cket。在Ubuntu-eee变成EasyPeasy之前,我曾经为其做出过贡献。Ramvi是个绅士。http://wiki.geteasypeasy.com/index.php?title=How_to:_Connect_to_the_Internet_via_Bluetooth&action=history - Scaine
这里的unionfs的目的是什么,我该如何安装它? - ændrük
9关于日志和其他相关问题的最后一部分,tmpfs行是被注释掉的,那为什么添加这些行会有任何区别呢?我们需要取消注释吗? - Oxwivi
如今要有足够的内存确实很困难。你永远无法知道自己可能需要多少。 - Eren Tantekin
8我可以理解如果这是为了提高速度,但你写的大部分内容似乎是为了延长固态硬盘的寿命。难道现代固态硬盘不已经具备了这些改进吗?而且这还要以更多的内存使用为代价!(例如,请参考此答案中给出的链接 - Chan-Ho Suh
在最新版本的Ubuntu中,您可能会希望使用aufs而不是unionfs。以下这行代码具有等效功能:none /var/cache aufs br=/tmp:/var/cache=ro 0 0 - Andrew Ferrier
你能量化你的建议带来的改进吗?你觉得它们为什么重要,又对什么方面有所改善? - Gilles 'SO- stop being evil'
通过将选项noatime添加到文件系统中,您告诉Ubuntu不要更新您使用的文件的修改时间。这样可以节省每次读取文件时的文件写入操作。由于在没有从磁盘上读取文件的情况下很难使用计算机,这将减少计算机的工作量。我对任何改进的量化都没有兴趣,因为性能始终是与使用方式相关的,并且计算设备的使用方式变化多样。我分享这些选项是因为我通常会在所有可写驱动器(包括SSD)上使用它们。谢谢。 - practicalli-john
7不需要2)。relatime 通过很好地防止写入,自 kernel 2.6.30以来已默认激活。 - Mihai Capotă
4只是为了补充一下 @MihaiCapotă 的评论,这里有一个 Server Fault 回答,详细解释了为什么不需要使用 noatime。 - Cas
1据他们说,noatime意味着nodiratime 在这里,所以只需添加前者选项即可。 - jarno
链接已失效。 - a06e
一般优化建议:https://orangesputnik.eu/ubuntu-desktop-optimization/ - Igor Popov

SSD 寿命

一般来说,我不会太在意 - 关于 SSD 寿命的担忧被夸大了。你可以阅读这篇详细文章,解释为什么你真的不用担心。简而言之,现代 SSD 内部的电路会自动进行磨损均衡管理,他们比你更懂如何做得更好。

文章中计算了一个以每秒 80M 的连续写入速率接收写入的 SSD 的寿命。寿命为51年。这是基于2007年的技术 - 现在的 SSD 寿命会更长。而且你几乎肯定不会以每秒 80M 的速度全天候地写入你的 SSD。

SSD 性能

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

  • 自动/在线 TRIM,也称为丢弃
  • 手动 TRIM
你必须自己启用自动TRIM。(基本上,将discard选项添加到您的挂载选项中,前提是您正在使用ext4。)我找到了一篇博文报告说在删除文件时,discard选项会减慢您的系统速度。 您可以偶尔使用fstrim手动执行(或在cron作业中执行)。如果您只有一个分区,您所需做的就是:
sudo fstrim /

请注意,fstrim只适用于11.10及更高版本的系统。对于旧版本的系统,您需要使用wiper.sh脚本。我在我的系统上找到了该脚本,路径为/usr/share/doc/hdparm/contrib/wiper.sh.gz。
如果您想知道TRIM解决的问题,请参考维基百科中的描述(described by Wikipedia)。
SSD将数据存储在被分组成页的闪存单元中,每个页通常为4 kB,这些页又被分组成块,每个块通常包含128个页,总计512 kB。当NAND闪存单元为空时,才能直接对其进行写入操作。如果认为它们包含数据,则在可靠地执行写入操作之前,首先需要擦除其内容。在SSD中,可以在页级别上进行写入操作,但由于硬件限制,擦除命令总是影响整个块。因此,只要可以使用空白页,向SSD媒体写入数据非常快速,但一旦需要覆盖以前写入的页,速度就会显著降低。由于在再次写入之前需要擦除页面中的单元,但只能擦除整个块,所以覆盖操作将启动一个读-擦除-修改-写入循环:必须将整个块的内容存储在缓存中,然后在闪存介质上有效地擦除,然后在缓存中修改被覆盖的页,使得缓存块保持最新状态,最后才将整个块(带有更新的页)写入闪存介质。这种现象被称为写放大。

8我希望我能投多次票。这将是其中一个答案。那个链接解决了我长期以来的一个担忧。非常感谢,Hamish。 - Luis Alvarado
storagesearch.com的有趣文章。但希望它能提供日期!上述答案是否意味着SSD所有者不需要理会第一个答案中的建议,除非是TRIM?我对文件访问时间没有太大需求,但是拥有2G内存时,在运行一些照片编辑软件以及同时运行几个其他占用内存的程序(如Chrome)时,拥有交换分区可能仍然有用。 - Lawrence I. Siden
@lsiden:这篇文章确实在中途提到了“后来:- 2008年5月”。你说得对,你不必担心第一篇文章中的其他内容。只需启用TRIM功能,享受速度吧 :) - Hamish Downer
3这篇文章提到了企业级固态硬盘:它具有200万次的写入耐久循环。而消费级固态硬盘大约只有3000-5000次的循环寿命。一个拥有3000次循环寿命的128GB固态硬盘可以连续以80MB/s的速度写入数据57天。 - LeartS
2и‡ҒUbuntu 14.10иµ·пәЊз”±fstrimж”ҮжЊЃзљ„ж‰Ђжњ‰SSDйѓҢдәљжҮЏе‘Ёи‡ҒеЉЁиү›иҰЊTRIMж“ҚдҢњгЂ‚еЏ‚иЂѓй“ңжҺӨ - KrisWebDev

有几个要点:
对齐:
经常提到的是分区的正确对齐。这应该等于SSD的块大小。为了安全起见,将您的分区对齐到MiB边界。请注意,您无法使用Ubuntu安装程序的分区工具来实现这一点(它使用MB而不是MiB),但您可以启动Live CD,使用Gparted(它使用MiB),然后点击安装以使用您设置的分区。
正确的调度程序:
一个重要的要点是调度程序应该是noop。您可以通过内核参数elevator=noop或通过在rc.local中输入echo noop > /sys/block/sda/queue/scheduler来设置此调度程序。
挂载标志:
我建议使用noatimediscard Tmpfs

将tmp放在ramdisk上可以延长固态硬盘的使用寿命。 要使用此功能,请在fstab中添加以下行:none /tmp tmpfs defaults 0 0

一般来说,如果你想深入了解这个话题,我推荐阅读this优秀的维基文章。


请注意,自此文写作以来,我们已经进行了大量工作,使默认的IO调度程序(现在是CFQ)在SSD上表现良好,phoronix的一些测试结果显示它现在更快。此外,现代SSD每秒能够执行如此多的操作,以至于你将不再注意到调度程序之间的任何差异,这在驱动器速度较慢时更为必要。 - thomasrutter

在Ubuntu上为您的SSD快速调整课程:

文件系统

Arch wiki提到了几个适合SSD的文件系统选项 - 其中一个不稳定,其他是ext*系列。我认为ext4是其中最好的选择之一。
注意:对于ext4,您可能希望使用discard挂载选项。

fstab

# <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

这里有几个重要的事项:

  • 对于内存大于等于2GB的系统,将/tmp目录定位到RAM中是可取的。
  • 不需要swap分区。现代机器的内存容量很大,只有在休眠时才需要swap分区。
  • 使用noatimediscard选项。相关信息请参考这里

调度程序

考虑将默认调度程序从cfq(完全公平队列)切换到noop或deadline调度程序以适应SSD。例如,使用noop调度程序只是按照请求接收的顺序处理数据,而不考虑数据在磁盘上的物理位置。这个选项被认为对于SSD是有优势的,因为SSD上的寻道时间对所有扇区都是相同的。

/etc/rc.local中添加以下内容:

# SSD performance tuning
echo noop > /sys/block/sda/queue/scheduler

信息


2没有交换空间,并且将/tmp放在内存中,很容易出现内存不足的情况,因为许多程序使用/tmp作为存储空间(例如用于存储DVD映像的Brasero)。 - arrange
5不完全正确。tmpfs 默认是 RAM 的 10%。但是可以使用 size 选项来调整大小。 - Andrejs Cainikovs
1Brasero是一个不好的例子,它本来就不应该这样做,正如Lennart Poettering在他的博客http://0pointer.de/blog/projects/tmp.html中所解释的那样。 - LiveWireBT

4) 启用自动 TRIM
如果您的固态硬盘支持,您还应该启用自动 TRIM(如此处所述)。

需要 UPS。在 /etc/sysctl.conf 文件中

vm.dirty_writeback_centisecs = 15000
vm.swappiness = 10

找到配置文件守护进程,通常是/etc/syslog.conf/etc/rsyslog.d/,并将所有形式为/var/log/的路径改写为在路径前面写一个减号("-")。在修改之前,mail.err。
/var/log/mail.err

/var/log/mail.err上有一个错误的邮件。

使用FS btrfs并使用-o ssd选项。

更多信息请参考http://vasilisc.com/speedup_ubuntu_eng#speedup_fs


TRIM允许操作系统通知SSD哪些数据块不再使用,并可以在内部擦除。修剪使得SSD能够提前处理垃圾收集开销,否则将会显著减慢未来对相关块的写入操作速度。1 在Ubuntu 14.04中,util-linux软件包新增了一个功能,可以自动定期修剪SSD,但只有Intel和Samsung的SSD默认启用了TRIM,因为一些廉价的SSD在运行TRIM时甚至可能变砖。2 Ubuntu 14.04中/etc/cron.weekly/fstrim的内容如下:
#!/bin/sh
# call fstrim-all to trim all mounted file systems which support it
set -e

# This only runs on Intel and Samsung SSDs by default, as some SSDs with faulty
# firmware may encounter data loss problems when running fstrim under high I/O
# load (e. g.  https://launchpad.net/bugs/1259829). You can append the
# --no-model-check option here to disable the vendor check and run fstrim on
# all SSD drives.
exec fstrim-all

1https://en.wikipedia.org/wiki/Trim_%28computing%29
2如何启用Trim?


我不会将这行添加到你的fstab文件中,var/tmp文件夹是为了在重启后保留数据的,这可能会给你带来问题。
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0

当我配置新系统时,我会将所有的tmp文件夹注释掉,这样如果发生任何问题,我可以查看日志和其他内容。然后一旦我设置好主要系统,我会取消注释它们,但我从不添加上述行,以下是我使用的内容:
tmpfs /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

如果我在使用系统时遇到任何问题,我会将这些问题注释掉,以便在重新启动或强制重启后仍然能够检查一切。

另外,你不需要nodiratime,noatime选项可以自行处理这两个功能。

至于TRIM,如果你的硬件/软件支持它,那是必须的,我不在fstab中使用discard。我创建了一个每日定时任务,因为我的电脑始终保持开启状态,方法如下:

gksu gedit /etc/cron.daily/trim

然后将其添加到文件并保存(如果您在SSD上没有单独的/home分区,或者还有其他在SSD上的部分,您应该知道如何修改这个)。
#!/bin/sh
LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
fstrim -v /home >> $LOG

然后通过以下方式使文件可执行:
sudo chmod +x /etc/cron.daily/trim

我也像这样编辑我的rc.local文件:
gksu gedit /etc/rc.local

在“exit 0”之上和最后一个#之下添加以下内容:
# Modification for SSD
# you may want to add more folders to be checked/created to this list
for dir in apparmor apt ConsoleKit cups dist-upgrade fsck gdm installer news ntpstats samba speech-dispatcher unattended-upgrades; do
  if [ ! -e /var/log/$dir ] ; then
    mkdir /var/log/$dir
  fi
done

你可以从这里复制粘贴,这样就不会出错,对于外行来说可能看起来有些不协调,但实际上并非如此。
我还读到过,保留固态硬盘10%的未格式化空间可以延长其使用寿命,但尚未得到证实。我对此了解不多,无法保证是否有意义这样做。
这是最全面的指南,他不是在谷歌上草草搜索一天然后写出来的,你应该看看这里

将所有/var/log目录添加到/etc/rc.local是一个好主意吗?如果不添加这些目录会发生什么?我猜如果安装了新的软件包,可能需要添加更多的目录。在关机期间更新/etc/rc.local以在下次启动时创建所有目录是否可行? - jarno
在 Ubuntu 14.04 及以后的版本中,默认设置了一个 cron 任务 /etc/cron.weekly/fstrim,用于每周修整文件系统。关于 14.04 版本,请参考这里。而 Ubuntu 15.10 在 fstrim 脚本中使用了 /sbin/fstrim --all || true 命令。 - jarno
至少在Xubuntu 15.10中,目录/var/log/installer下有一个名为ubiquity-apt-clone的子目录。您是否应该递归地创建子目录? - jarno

很明显,由于其内容需要在重新启动之后得到保留,所以/var/tmp不应该在tmpfs中:

这里有一些关于如何调整和优化Ubuntu、Linux Mint上的SSD的好信息,你可能会感兴趣。你可以在http://namhuy.net/1563/how-to-tweak-and-optimize-ssd-for-ubuntu-linux-mint.html找到更多相关内容。

使用preload

要在Ubuntu、Linux Mint或基于debian的发行版上安装preload:

# apt-get update && apt-get install preload

关闭交换空间
要更改swappiness设置:
$ su -
# nano /etc/sysctl.conf

将此行添加到sysctl.conf文件中。
vm.swappiness = 10