群晖DSM虽然在易用性方面非常不错,但是系统上的很多机制可以说是非常搓了,我的DS918+,自行添加内存到16G双通道,按理来说,NAS上跑的那点东西,16G内存是完全够用了,但就是这样,群晖也特别喜欢用虚拟内存,导致开机久了,我打开docker控制台,都要等7,8秒
原因就在于,群晖的配置都非常寒酸,那么高的价格只舍得配2G,4G的内存,DSM默认的vm.swappiness值设定为
10
,内存高的建议修改为1
所以,如果想要提高群晖系统的流畅度,首先就是要加大你的内存,之后修改DSM的vm.swappiness数值
ssh 进群晖,输入如下命令即可,不需要重启(对大部分Linux系统也适用)
目录
临时生效版
之前的方法方法,虽说是永久生效,但是群晖并不会读取/etc/sysctl.conf
,所以实际上,我们还是要重启后刷新一下sysctl.conf
。不如直接开机时就执行修改swappiness的命令,这条命令会及时生效,调整swappiness值为1
sysctl -w vm.swappiness=1
永久生效版
sudo -I
echo "vm.swappiness = 1" >> /etc/sysctl.conf
# 调整SWAP使用积极性为1,不要设置为0,之后会讲
swapoff -a
swapon -a
# 临时关闭虚拟内存,让系统回收虚拟内存。开启虚拟内存
sysctl -p
# 刷新sysctl.conf
添加到群晖计划任务中
群晖DSM有一点设计的特别好,每一块硬盘里都装有DSM系统,并且大部分对DSM的修改,在关机后都会失效,确保了安全性。所以,我们需要设置计划任务,让开机时能够执行刚才那段命令
实测修改sysctl.conf
参数后,并不会会在重启后失效,不会shell的可以在计划任务中执行,第一次重启后请务必关闭或删除本计划任务
具体操作如图所示
现在开机久了,系统也依旧健步如飞,反应速度明显快了很多
添加开机时刷新sysctl.conf
虽然群晖不会把sysctl.conf恢复为默认,但是不知道DSM修改了什么,默认竟然不会读取这里的参数,所以需要添加计划任务,开机时sysctl -p
也可以添加,效果是一样的,这种就不需要像上面的步骤那样修改/etc/sysctl.conf
了
sysctl -w vm.swappiness=1
简单说一下vm.swappiness
这里直接引用v2ex的一篇帖子,说的很简单透彻
https://www.v2ex.com/t/666354#reply7
vm.swappiness 优化
swappiness
设置为 1
比设置为 0
要好,因为在一些内核版本 swappiness
设置为 0
会触发系统 OOM-killer (注:Linux 内核的 Out of Memory ( OOM ) killer 机制)。
swappiness 的值的大小对如何使用 swap 分区是有着很大的联系的。swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap 空间,swappiness = 100 的时候表示积极的使用 swap 分区,并且把内存上的数据及时的搬运到 swap 空间里面。linux 的基本默认设置为 60,具体如下:
cat /proc/sys/vm/swappiness
60
也就是说,你的内存在使用到 100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统 io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
本文由 NG6 于2020年04月27日发表在 sleele的博客
如未特殊声明,本站所有文章均为原创;你可以在保留作者及原文地址的情况下转载
转载请注明:群晖性能优化-降低swap使用率 | sleele的博客
sleep 10m
swapoff -a
如果要打开怎么搞?
swapon -a?
感谢博主的教程,非常有用。
由于我现在只是8G内存,还要运行BT下载和Jellyfin等一些比较吃内存的服务,我又不想完全关掉swap担心在长时间运行后内存爆掉。
那我就先ssh运行一次:
sudo sysctl -w vm.swappiness=1
sudo swapoff -a
sudo swapon -a
sudo sysctl -p
然后开机计划设置:
swapoff -a
swapon -a
sysctl -p
这样的话群晖应该会在内存极大占用时使用swap,然后平时就不会再进行写入吧
@匿名 swappiness,用来调整内存压力阈值
swapoff,关闭虚拟内存
所以只需要调整swappiness就可以
内存不够用,最好还是加个内存,群晖的swap是直接写到HDD的,性能很差,还会导致所有磁盘一块转(Raid1)
感谢博主的教程,但是作为技术小白有些步骤还不是太明白,比如DSM7.1还需要执行修改文件的计划吗?是直接使用sleep 10m
swapoff -a?烦请博主指点一下。
@hoops 只在计划任务中添加这两条命令就可以了
![DTiwkd0]()
查看图片
@NG6 添加sleep 10m swapoff -a的计划,是在已经修改了sysctl.conf调整swappiness值为1以后再添加呢,还是不需要修改swappiness的值,直接添加计划就行?求指点一下,看的我有点懵逼
@EnRyu swapoff -a的意思是关闭swap,已经关闭swap自然不需要再调整swappiness值
试了下永久生效版,发现 DSM7 又限制了些操作,不能直接
sudo echo "vm.swappiness = 1" >> /etc/sysctl.conf
,必须要打开配置文件编辑。之后的
swapoff -a
是个挺考验耐心的命令。敲下去,终端就没有响应了。我4G内存,40%占用的时候(当时交换区大小未检查)大概要等5分多钟。但等待是值得的,
free
命令下,看到交换区变0,太好了!另外发现这篇博文后来有增补,在前后文里我有点弄不清群晖开机时到底会不会读
sysctl.conf
。最后还是要谢谢博主的钻研,我看了好多文章,受益匪浅。
@里脊 群晖开机时不会读取/etc/sysctl.conf
![DTiwk0]()
建议使用下面这种方法,所有系统版本都适用,添加计划任务,开机10分钟后,关闭swap
查看图片
@NG6 谢谢解惑!
@NG6 图片看不到了,请问计划任务应该添加哪个脚本?
@krisp sleep 10m
swapoff -a
执行之后swap分区大小直接变成0