跳转至

内存硬核诊断与 Swap 调优

当 NAS 频繁死机、文件解压CRC错误、或者 Docker 容器莫名崩溃时,问题往往不在软件,而在内存条。DSM 自带了一个隐藏的内存检测工具,类似于 Windows 的 MemTest86。

此外,Linux 默认的 Swap(虚拟内存)策略可能导致硬盘狂响。本文教你如何硬核诊断和调优。

1. 启用 Synology Memory Test (内存自检)

这不是在 DSM 界面里点的,它需要重启并进入特殊模式。

适用场景

  • 新买了第三方内存条,想测试兼容性。
  • NAS 经常无故重启或死机。
  • Btrfs 文件系统频繁报错(数据校验和不匹配)。

操作步骤

  1. 下载 Synology Assistant:在电脑上安装这个官方工具(去群晖官网下载中心)。
  2. 准备测试:确保 NAS 处于开机状态。
  3. 启动测试
    • 打开电脑端的 Synology Assistant。
    • 点击右上角的 齿轮图标 (偏好设置)
    • 勾选 启用高级服务 (Enable Advanced Services)。
    • 在列表中选中你的 NAS。
    • 点击上方的 内存测试 按钮。
  4. 过程
    • NAS 会重启。
    • 注意:测试过程非常漫长(根据内存大小,可能需要 1-5 小时)。
    • 期间 NAS 无法访问,且状态灯会闪烁。
    • 测试完成后,NAS 会自动重启进入 DSM。
  5. 查看结果
    • 重启完成后,登录 DSM。
    • 通知中心会弹出一个通知,告诉你测试是否通过。
    • 如果没弹,去 日志中心 搜索 Memtest 关键字。

2. Swap (虚拟内存) 深度调优

很多用户发现 NAS 即使内存还有空余,硬盘也在“滋滋”响。这可能是 Linux 的 Swappiness 策略太激进,过早地把内存数据搬到了硬盘上。

什么是 Swappiness?

  • Linux 内核参数,范围 0-100。
  • 值越高:越积极地使用 Swap(硬盘),以此留出更多物理内存给文件缓存。
  • 值越低:尽可能使用物理内存,直到撑不住了才用 Swap。
  • DSM 默认值:通常是 1060(取决于机型)。

为什么需要调整?

  • 机械硬盘噪音:频繁读写 Swap 会导致炒豆子般的噪音。
  • 性能卡顿:从硬盘读回数据比内存慢几万倍。
  • SSD 寿命:如果你把 Swap 放在 SSD 缓存上,频繁写入会损耗寿命。

调优步骤 (SSH)

  1. 查看当前值
    cat /proc/sys/vm/swappiness
    
  2. 临时修改 (立即生效)
    # 建议设为 1,意味着“除非物理内存真的不够了,否则别碰硬盘”
    sudo sysctl -w vm.swappiness=1
    
  3. 验证效果
    • 观察几天,看“炒豆子”声音是否减少,系统响应是否变快。
    • 如果内存本来就只有 2GB 且跑了 Docker,设太低可能会导致 OOM (内存溢出) 杀进程,请谨慎。
  4. 永久生效 (重启不失效)
    • DSM 可能会在重启后重置此参数。你需要创建一个启动脚本。
    • 控制面板 > 任务计划 > 新增 > 触发的任务 > 用户定义的脚本
    • 事件:开机。
    • 用户:root。
    • 脚本
      sysctl -w vm.swappiness=1
      

3. ZRAM (内存压缩) —— 救活小内存机器

如果你的 NAS 内存只有 2GB 且无法升级(如某些 ARM 机型或板载内存),可以尝试开启 ZRAM。

  • 原理:在物理内存中划出一块区域,作为“压缩的 Swap”。数据写入时先压缩,读出时解压。
  • 效果:用 CPU 算力换取内存空间。2GB 内存能当 3GB 用。
  • DSM 支持:DSM 7.x 部分机型内核已支持 ZRAM,但默认未开启。
  • 检查支持
    lsmod | grep zram
    
    如果有输出,说明内核支持。
  • 开启方法
    • 这是一个高级操作,通常需要通过第三方脚本(如 memory-compactor)来实现。
    • 警告:新手不建议折腾 ZRAM,买根内存条是最简单的方案。

4. 内存泄露 (Memory Leak) 排查

如果你的内存占用率每天通过 10% 的速度稳步上涨,重启后归零,那多半是某个软件内存泄露了。

  • 嫌疑人 Top 3
    1. 第三方 Docker 容器:尤其是 Java 写的应用(如 Minecraft 服务器)或 Python 爬虫。
    2. Plex / Emby / Jellyfin:在扫描超大媒体库时可能会吃光内存。
    3. Antivirus Essentials:ClamAV 杀毒引擎是非常吃内存的,建议小内存机器卸载。
  • 对策
    • 给 Docker 容器设置 内存限制 (Memory Limit)
    • 任务计划 中设置每周自动重启特定的 Docker 容器。