使用SSD固态硬盘,我需要调整swappiness来延长SSD的使用寿命吗?

我遇到了包含以下建议的这篇文章

交换空间和交换性能

我将我的交换分区保留在旧硬盘驱动器上。在SSD上进行交换会更快,但也会缩短SSD的寿命。

我的系统内存充足,因此我还将交换性能值减少到0,以告诉Ubuntu只有在绝对必要时才进行交换。我通过向/etc/sysctl.conf添加行vm.swappiness=0来实现这一点。

将交换性能设置为零真的能增加我的SSD的寿命吗?我在其他地方找不到相关参考资料。

7个回答

将swappiness减少到0意味着操作系统只会在没有可用的空闲内存时才开始使用SSD进行交换。
从理论上讲,这可以增加SSD的寿命,因为SSD的写入次数减少。这取决于实际情况是否会实际增加SSD的寿命。
Linux很少使用交换空间(尤其与Windows相比),即使设置了较高的交换性能值,也很少改变系统在具有大量RAM的情况下与RAM使用情况相比的交换行为。如果RAM不足,则默认值60会导致频繁交换,这种情况下减小交换性能值可能会对SSD的写入寿命产生显著影响。
对于普通消费者使用,基于MLC的SSD的写入耐久性仍然非常高。据说目前的基于MLC的SSD可以承受大约3000-5000次写入循环,然后才会磨损。以3000次限制计算,意味着一个每天写入10GB数据的128GB SSD可工作约38000天,即约100年。如果你有更大容量的SSD,那么它的磨损时间会更晚。因此,你的SSD因为单元磨损而死机的可能性非常低。(当然,如果你在企业/服务器环境中使用SSD,每天的写入量会更大,但企业环境通常使用基于SLC的SSD。)
这个写入循环限制非常高,以至于SSD制造商(首先是三星)开始为消费者制造基于TLC的SSD,这些SSD只能承受大约1000次写入循环,但价格更便宜。这些公司表示,即使这些SSD的写入循环限制超过了产品预计使用寿命。(2024年我们可能不会再使用128GB的SSD)不过,如果你有一款基于TLC的SSD并且经常向该驱动器写入,例如每天50GB,那么降低交换性能值可能会显著影响SSD的使用寿命。 这里有一个巨大的帖子,其中爱好者们通过不断写入数据来测试SSD的耐久性。虽然他们的测试方法可能不完全正确,但结果相当令人印象深刻和舒心。
总结一下:理论上来说,减少swappiness会延长SSD的寿命,但实际上可能并不会有太大影响。但是,如果你使用的是TLC型SSD,内存较小且经常向SSD写入数据,那么它确实会产生实际效果。
我使用的是基于MLC的128GB SSD,主要用于办公/浏览,相比于我的内存使用情况,我有足够的内存,所以我的SSD没有承受过重负荷的写入(尽管我的机器24/7开机)。但是因为我根本不需要交换,而且降低swappiness非常简单,所以在安装SSD时我将swappiness设置为0,因为为什么不这样做呢?(实际上,我在所有机器上都将swappiness设置为0,即使只有HDD的机器也是如此。)
你可以使用smartctl命令来查看你的SSD在其寿命中已经写入了多少数据。找到包含Total_LBAs_Written的那一行,这将显示已经写入SSD的512字节扇区的数量。(是的,我知道SSD实际上有4K块,而不是512字节,但SMART仍然显示:Sector Size: 512 bytes logical/physical,并且使用512块可以得到与tune2fs -l Lifetime writes输出相当的结果。)所以将该数字乘以512,就可以得到以字节为单位的写入量,或者简单地说:
sudo smartctl -a /dev/sda | grep Total_LBAs_Written | awk '{print $10*512/1024/1024/1024 " GiB"}'

将以GiB的形式打印出/dev/sda的信息。(只需将设备名称更改为您的SSD名称。)我的128GB SSD在一年多的时间里遭受了约800GB的写入,这意味着仅使用了3000个周期中的7个写入周期。

有了文件系统,我们可以使用TRIM来减少写放大效应。那么SWAP分区有没有类似的功能呢? - Bryce
1这个回答似乎假设"swappiness"的范围是从0到100,其中0表示没有交换(而100表示没有RAM?)。但是,另一个回答进一步详细说明了swappiness值,指出该数字范围从0到200,并表示对不同类型的交换的相对权重。 - palswim

所有关于SSD耗尽的说法都是“猜测”。我曾有同样的感觉,但开始商业使用它们后,情况完全不同。我在东海岸拥有最快的Oracle集群之一。3年前,我们为整个存储和临时文件系统引入了SSD。我们每天对SSD进行数十亿次写操作。经过3年的使用,我们仍然远未达到10%的耗尽。如果我在商业环境下都能做到这一点,那么在居民环境中它们就永远不会耗尽。因此,我专门为我的Linux工作站实施了一个SSD解决方案,用于交换空间,效果非常好!
所以,你的情况可能有所不同,但SSD在各个方面都是首选。

服务器专用的固态硬盘(SSD)可以承受比面向消费者的(更便宜的)固态硬盘更多的写入操作。 - jarno
1明白了,但是我在工作站上安装了消费级固态硬盘,它们全天候运行并部署在整个企业中,我们每隔几天备份一次增量数据,但在过去的两年里没有发生任何故障。请记住,物理旋转盘的平均无故障时间(MTBF)为3年,在我销售和维修系统的25多年经验中,这个数字相当准确。固态硬盘在性能上超越了所有其他选项,无论是商用还是消费级别的。 - TekOps
出于好奇,如果您并不在意SSD的最大使用量,并希望提高性能,您选择了怎样的swappiness? - Syakur Rahman

是的。你确实需要改变swappiness来延长SSD的使用寿命。
Swappiness可以让你控制使用多少交换文件。Swappiness的值可以从0到100进行更改。较高的swappiness值意味着内核将尝试使用更多的交换空间,较低的swappiness值意味着内核将根据我们的设置使用较少或不使用交换空间。
默认的swappiness值是60,如果你有足够的RAM,应该避免使用写入和读取SSD的交换空间,而是使用HDD。对于拥有4GB或更多RAM的系统,尝试通过将swappiness设置为10甚至0来减少交换的使用,同时将交换文件放在HDD上。
运行交换空间会导致磁盘I/O负荷很大,这对SSD来说实际上是不好的。SSD在写入操作之前只能处理有限次数的写入,然后你就被迫购买另一个驱动器。因此,如果可能的话,将交换空间移到次要的旋转驱动器上,远离SSD。
固态硬盘相对快速地因写入操作而磨损。特别是最早期的固态硬盘在这方面比较脆弱,但对于较新一代的固态硬盘来说,这种情况仍然存在,只是程度较轻。

你可以在新的磁盘上创建一个新的分区,或者只是创建一个交换文件;创建一个新的分区几乎总会带来更好的性能。

如果你没有备用驱动器可以移动到,你可以修改一个设置,只有当你的物理内存占用达到100%时才启用交换,这将减少对交换文件的负载,有助于保护你的固态硬盘。只需按下键盘上的Ctrl+Alt+T组合键打开终端。当终端打开后,运行以下命令:

echo 0 > /proc/sys/vm/swappiness

SSD的磨损与写入循环有关

固态硬盘的写入操作会相对较快地使其磨损。尤其是早期的SSD,这方面比较脆弱,但新一代的SSD也同样存在这个问题,只是程度较轻。

使用Trim

TRIM是您在使用SSD时的一个优势。它运行在软件中,并与SSD控制器通信,告诉它哪些“块”不再需要文件系统并且可以安全地清理和覆盖。这不会真正改善性能,但会延长SSD的使用寿命。

来源:Linux SSD调整 & 优化SSD的操作指南


我想知道出了什么问题?原帖问到他是否需要更改交换空间(swappiness)来延长固态硬盘的使用寿命,答案是需要更改交换空间设置。 - Mitch
我了解到最新版本的Ubuntu会自动为固态硬盘使用TRIM。 - Paddy Landau
最新的Ubuntu只针对特定型号的固态硬盘(SSD)使用TRIM功能。@PaddyLandau - Bryce

设置swappiness为零会增加我的SSD的寿命吗?
这将导致Linux较少频繁地将内存块移动到交换分区。如果您的交换分区位于SSD上,写入交换分区通常会使用写入周期。请记住,只有在需要时才会使用交换分区,如果您有足够的RAM,可能最好不要使用它(除非您想要休眠,但那是另一个问题)。
这种操作的效果可能会有所不同,但仅仅为了节省一些SSD的写入周期而这样做是错误的。现代SSD(大约从2012年开始)具有大量的写入周期,并且当您几乎使用完所有RAM时,应用程序的性能可能会降低。与交换相比,安装程序期间使用的写入周期更多。再次提醒,交换默认情况下仅在需要时才会被使用。
如果您担心交换使用的SSD写入周期,如果您有足够的RAM,可以完全删除/停用交换,并仅在HDD上激活临时交换,而不是调整swappiness。这将是最佳选择。

我强烈建议您将swappiness设置为较低的值,如果您的系统内存/ RAM足够,最好是“0”,即使在具有高RAM系统的情况下,swappiness设置为10,我几乎看不到Ubuntu将任何东西放入交换分区,因为大部分都已经在RAM中了。
我进行了一点谷歌搜索,找到了这个页面http://namhuy.net/1563/how-to-tweak-and-optimize-ssd-for-ubuntu-linux-mint.html,可能会帮助您调整和优化SSD,使您的Ubuntu系统运行更高效,并延长SSD的使用寿命。

改变swappiness可能实际上没有影响。我们在内存不足的系统中进行了很多尝试,希望尽可能多地将数据推送到SSD上,但实际上对性能几乎没有影响,因为这些数据仍然保留在内存中(这意味着它们是需要的)。这可能是一个无关紧要的问题。

我喜欢检查smartctl输出的想法,不过我的代码更加简洁。我从来不明白为什么人们不知道awk内置了grep功能。
sudo smartctl -a /dev/sdb | awk ' ($0 ~ /Total_LBAs_Written/) {print ($10*512)/(1024^3) " GiB"}'

尽管这是我使用的代码:
sudo smartctl -a ${device} | awk ' ($0 ~ /Total_LBAs_Written/) { if (($10*512)/(1024^3) > 1000) { msg="TiB"; size=($10*512)/(1024^4); } else { msg="GiB"; size=($10*512)/(1024^3); }; printf "\nThis device has had %.2
f %s written to it.\n",size,msg; }'