群晖性能优化-降低swap使用率
本文最后更新于 2023年05月10日

群晖DSM虽然在易用性方面非常不错,但是系统上的很多机制可以说是非常搓了,我的DS918+,自行添加内存到16G双通道,按理来说,NAS上跑的那点东西,16G内存是完全够用了,但就是这样,群晖也特别喜欢用虚拟内存,导致开机久了,我打开docker控制台,都要等7,8秒

原因就在于,群晖的配置都非常寒酸,那么高的价格只舍得配2G,4G的内存,DSM默认的vm.swappiness值设定为10,内存高的建议修改为1

所以,如果想要提高群晖系统的流畅度,首先就是要加大你的内存,之后修改DSM的vm.swappiness数值

ssh 进群晖,输入如下命令即可,不需要重启(对大部分Linux系统也适用)

sysctl -w vm.swappiness=1

不过这个方法存在一个问题,就是每次重启后会失效,需要重新执行这条命令

添加开机时刷新sysctl.conf

如图所示,在群晖计划任务中,添加一条计划任务,开机后执行sysctl -w vm.swappiness=1

推荐版

如果你已经加装内存,比如说内存来到16GB,那么推荐你直接关闭swap,具体操作如下

添加到群晖计划任务中

如图所示,在群晖计划任务中,添加一条计划任务,开机10分钟后关闭swap

现在开机久了,系统也依旧健步如飞,反应速度明显快了很多

简单说一下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的博客

评论

  1. 番茄
    Windows Chrome
    1周前
    2024-12-07 7:02:46

    【DSM7.2.2 物理内存16G】 经过实际测试发现,7.2.2中不会出现评论区里提到的开机后系统会延迟从60改为10的现象,一直都是60. 而且经过测试,不使用带sleep的脚本在开机时触发运行,修改swappiness为1,后续也不会被改成10.

    我的脚本是:
    sysctl -w vm.swappiness=1
    swapoff -a
    swapon -a

    不过出现了另外一个问题如同评论区第一条评论【活在梦里】说的那样,这样修改后在 资源监控 – 内存 – 类型:交换 界面看到的总计值是0KB。如果开机不修改的话这个值是2GB。 而且使用 cat /proc/swaps 查询所有swap分区会发现默认的/dev/md1 swap分区也会消失。 我对 swapon -a 是否真的重新开启了swap表示怀疑,但是单独运行这条命令结果还是一样的,难道需要真的内存到了99%才能恢复swap?

    • 番茄
      番茄
      Windows Chrome
      1周前
      2024-12-07 7:46:53

      @番茄 【修正】
      经过研究发现,评论区里面大部分修改swappiness之后再次开关swap的操作是错误的。原因如下:

      1. sysctl -w vm.swappiness=1 这个命令修改swappiness是立即生效的,根本无需重启swap。
      2. swapon -a 这个命令生效的前提是系统在/etc/fstab文件写好了什么分区作为swap,但是群晖默认是没写的,所以swapon -a 在群晖上根本不会生效。

      这也就解释了为什么使用了这三行脚本之后swap分区反而消失了,资源监控里面交换分区大小也变成0KB了。 因为swap被彻底关闭了而重新开启失败了。

      所以在DSM7.2.2上正确修改swappiness的脚本是:
      sysctl -w vm.swappiness=1

      就只需要这一行就够了,不需要延迟修改,也不需要重新开启。
      评论区里的错误太多了。

  2. 番茄
    Windows Chrome
    1周前
    2024-12-07 5:28:59

    为什么我的7.2.2好像一开机就是60,而且不会随着时间发生改变。。。。

  3. chenxuzheng
    Windows Edge
    10月前
    2024-2-17 0:11:51

    这样子就成功了吗
    total used free shared buff/cache available
    Mem:: 32761832 1807904 27750576 653684 3203352 29831060
    Swap: 21755828 0 21755828

  4. 霸霸
    Macintosh Safari
    已编辑
    2年前
    2023-5-25 4:06:53

    DSM7.1以后开机执行这个命令前必须要有一个 “sleep 5m”
    关于“sleep 5m”命令的说明:DSM7.1以后的系统很神奇,开机先是linux默认的vm.swappiness=60,延迟哔声以后大约2-3分钟自动修改为“vm.swappiness=10”,如果设置开机就执行“sysctl -w vm.swappiness=1”,那么导致的结果就是开机以后设置vm.swappiness=1成功,但是延迟2-3分钟以后系统自动执行sysctl -w vm.swappiness=10,导致设置失效。所以干脆设置5分钟以后执行 sysctl -w vm.swappiness=1
    这样成功率100%。

    cat /proc/sys/vm/swappiness
    就可以根据返回结果进行观测

  5. zzsama
    Android Chrome
    2年前
    2023-3-31 21:57:19

    前边有些看懂了,到评论区为什么直接变成开机10分钟关闭虚拟内存了?前边的不用修改了吗?😂

    • 霸霸
      zzsama
      Macintosh Safari
      2年前
      2023-5-04 2:35:35

      @zzsama sleep 360 && sysctl -w vm.swappiness=1
      swapoff -a
      swapon -a

      用这个,不要用off那个,爆内存的时候那个容易出问题

      • 番茄
        霸霸
        Windows Chrome
        已编辑
        1周前
        2024-12-07 7:29:57

        @霸霸 这个脚本是错的。 首先 sysctl -w vm.swappiness=1 修改是立即生效的,不需要重新开关swap功能。 其次,swapon -a 这个命令生效的前提是系统在/etc/fstab文件写好了什么分区作为swap,但是群晖默认是没写的,所以swapon -a 在群晖上根本不会生效,所以你这脚本运行的最终结果只是关闭swap而不会重新开启。 你这脚本去掉后面两行就已经可用了。

    • NG6
      zzsama
      博主
      Macintosh Chrome
      2年前
      2023-5-10 21:58:23

      @zzsama 文章经过几次更新后乱了,重新写了一下,现在应该很好理解了

  6. hahadiy
    Windows Edge
    2年前
    2023-3-30 12:15:40

    你好,有个问题,设置完后,群晖docker容器好像还是会用硬盘做缓存,但套件能用到物理内存了。请问博主有这种问题么?

  7. Edward Yeng
    Windows Edge
    2年前
    2022-11-26 9:54:35

    sleep 10m
    swapoff -a
    如果要打开怎么搞?
    swapon -a?

  8. 匿名
    Windows Chrome
    2年前
    2022-7-05 10:33:46

    感谢博主的教程,非常有用。
    由于我现在只是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,然后平时就不会再进行写入吧

    • NG6
      匿名
      博主
      Macintosh Chrome
      2年前
      2022-7-08 15:30:40

      @匿名 swappiness,用来调整内存压力阈值
      swapoff,关闭虚拟内存
      所以只需要调整swappiness就可以
      内存不够用,最好还是加个内存,群晖的swap是直接写到HDD的,性能很差,还会导致所有磁盘一块转(Raid1)

  9. hoops
    Macintosh Chrome
    已编辑
    3年前
    2022-6-13 16:01:19

    感谢博主的教程,但是作为技术小白有些步骤还不是太明白,比如DSM7.1还需要执行修改文件的计划吗?是直接使用sleep 10m
    swapoff -a?烦请博主指点一下。

    • NG6
      hoops
      博主
      Macintosh Chrome
      已编辑
      3年前
      2022-6-13 22:52:54

      @hoops 只在计划任务中添加这两条命令就可以了


      查看图片
      DTiwkd0

      • EnRyu
        NG6
        Windows Edge
        2年前
        2022-6-19 0:36:15

        @NG6 添加sleep 10m swapoff -a的计划,是在已经修改了sysctl.conf调整swappiness值为1以后再添加呢,还是不需要修改swappiness的值,直接添加计划就行?求指点一下,看的我有点懵逼

        • 匿名
          EnRyu
          Macintosh Safari
          已编辑
          2年前
          2022-6-19 16:15:38

          @EnRyu swapoff -a的意思是关闭swap,已经关闭swap自然不需要再调整swappiness值

  10. 里脊
    Macintosh Chrome
    已编辑
    3年前
    2022-2-20 11:10:53

    试了下永久生效版,发现 DSM7 又限制了些操作,不能直接 sudo echo "vm.swappiness = 1" >> /etc/sysctl.conf,必须要打开配置文件编辑。

    之后的 swapoff -a 是个挺考验耐心的命令。敲下去,终端就没有响应了。我4G内存,40%占用的时候(当时交换区大小未检查)大概要等5分多钟。

    但等待是值得的,free 命令下,看到交换区变0,太好了!

    另外发现这篇博文后来有增补,在前后文里我有点弄不清群晖开机时到底会不会读 sysctl.conf

    最后还是要谢谢博主的钻研,我看了好多文章,受益匪浅。

    • NG6
      里脊
      博主
      Macintosh Chrome
      已编辑
      3年前
      2022-2-22 11:01:27

      @里脊 群晖开机时不会读取/etc/sysctl.conf
      建议使用下面这种方法,所有系统版本都适用,添加计划任务,开机10分钟后,关闭swap


      查看图片
      DTiwk0

      • 里脊
        NG6
        Macintosh Chrome
        3年前
        2022-2-22 20:03:49

        @NG6 谢谢解惑!

      • krisp
        NG6
        Macintosh Safari
        3年前
        2022-4-01 11:01:49

        @NG6 图片看不到了,请问计划任务应该添加哪个脚本?

        • NG6
          krisp
          博主
          Macintosh Chrome
          3年前
          2022-4-01 11:30:11

          @krisp sleep 10m
          swapoff -a

      • zzsama
        NG6
        Android Chrome
        2年前
        2023-3-31 21:59:20

        @NG6 直接用关闭虚拟内存的方法了吗?前边不用设置了?为什么要在开机10分钟后关闭?

  11. 活在梦里
    Windows Chrome
    4年前
    2021-2-17 18:30:15

    执行之后swap分区大小直接变成0

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇