Featured image of post 群晖优化虚拟内存以及关闭swap

群晖优化虚拟内存以及关闭swap

优化交换分区解决频繁读写导致的噪音

起因

原因是发现群晖明明还有很多的内存也会就经常进行swap交换,导致硬盘一直非常的吵(尤其是多盘位的机型)而且频繁读写也可能导致硬盘寿命下降,因此找的解决方法。

解决方案

小内存优化

先在任务计划内创建一个触发的任务,使用root权限执行,事件执行为开机执行,定义的脚本填写

1
sysctl -w vm.swappiness=1

对于内存在8G的可以在任意一个文件夹内创建一个任意名称.sh的脚本,内容填写

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash
 
# 脚本名称: manage_zram.sh
# 描述: 这个脚本用于在群晖NAS上管理zram设备,包括创建、配置和停用zram。
# 使用方法: sudo ./manage_zram.sh [-p <百分比>] [-d] [-m <最大压缩流>]
# 选项:
#   -p, --percent: 设置zram大小占总内存的百分比(默认50%)
#   -d, --disable: 停用zram设备
#   -m, --max-streams: 设置最大压缩流数量(默认为CPU核心数)
 
set -e  # 遇到错误立即退出
set -u  # 使用未定义的变量时报错
 
# 默认值
RAM_PERCENT=50
DISABLE_ZRAM=false
MAX_COMP_STREAMS=$(nproc)
 
# 错误处理函数
error_exit() {
    echo "错误: $1" >&2
    exit 1
}
 
# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
 
# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -p|--percent)
            RAM_PERCENT="$2"
            if ! [[ $RAM_PERCENT =~ ^[0-9]+$ ]] || [ $RAM_PERCENT -lt 1 ] || [ $RAM_PERCENT -gt 100 ]; then
                error_exit "RAM百分比必须是1到100之间的整数。"
            fi
            shift 2
            ;;
        -d|--disable)
            DISABLE_ZRAM=true
            shift
            ;;
        -m|--max-streams)
            MAX_COMP_STREAMS="$2"
            if ! [[ $MAX_COMP_STREAMS =~ ^[0-9]+$ ]] || [ $MAX_COMP_STREAMS -lt 1 ]; then
                error_exit "最大压缩流数量必须是正整数。"
            fi
            shift 2
            ;;
        *)
            error_exit "未知选项: $1\n使用方法: $0 [-p <百分比>] [-d] [-m <最大压缩流>]"
            ;;
    esac
done
 
# 检查root权限
[[ $EUID -ne 0 ]] && error_exit "此脚本必须以root权限运行。"
 
# 检查是否为DSM系统
[[ ! -f "/etc.defaults/VERSION" ]] && error_exit "无法检测到DSM系统,脚本可能无法正常工作。"
 
# 检查zram模块是否可用
check_zram_available() {
    if ! modprobe -n zram &>/dev/null; then
        error_exit "zram模块不可用。请确保您的系统支持zram。"
    fi
}
 
# 停用zram函数
disable_zram() {
    local zram_devs=$(ls /dev/zram* 2>/dev/null)
    if [[ -n "$zram_devs" ]]; then
        for dev in $zram_devs; do
            swapoff $dev 2>/dev/null || log "无法停用 $dev"
            echo 1 > /sys/block/$(basename $dev)/reset 2>/dev/null || log "无法重置 $dev"
        done
        rmmod zram 2>/dev/null || log "无法卸载zram模块"
        log "zram已停用并移除。"
    else
        log "未检测到活动的zram设备。"
    fi
}
 
# 配置和启用zram
configure_zram() {
    # 加载zram模块
    modprobe zram num_devices=1 || error_exit "无法加载zram模块。"
 
    # 设置最大压缩流
    echo $MAX_COMP_STREAMS > /sys/block/zram0/max_comp_streams || log "无法设置最大压缩流,使用默认值。"
 
    # 计算zram大小
    local TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    local ZRAM_SIZE=$((TOTAL_MEM * 1024 * RAM_PERCENT / 100))
 
    # 设置zram大小
    echo $ZRAM_SIZE > /sys/block/zram0/disksize || error_exit "无法设置zram大小。"
 
    # 创建swap并启用
    mkswap /dev/zram0 || error_exit "无法创建swap分区。"
    swapon -p 100 /dev/zram0 || error_exit "无法启用zram swap。"
 
    log "zram已成功配置并启用为swap"
    log "压缩算法: lzo (群晖NAS默认)"
    log "最大压缩流: $(cat /sys/block/zram0/max_comp_streams)"
    log "RAM使用百分比: $RAM_PERCENT%"
    log "zram大小: $((ZRAM_SIZE / 1024 / 1024)) MB"
}
 
# 主逻辑
check_zram_available
 
if [[ $DISABLE_ZRAM = true ]]; then
    disable_zram
else
    disable_zram  # 先停用现有的zram设备
    configure_zram
fi

然后在任务计划内新增一个触发的计划任务(注:需要root权限执行),先行任务填关闭swap的任务即可,用户定义的脚本填写刚刚写好的脚本路径,如:volume1/plan/创建的脚本名.sh。

sh脚本来自sleele大佬

大内存优化

对于内存大于8G以上的建议直接关闭swap,执行第一条即可,有条件的话可以添加SSD读写缓存,实测对于小文件频繁读写多的场景提升挺大的,噪音也小了很多,需要注意的是群晖默认会从第一块盘启动系统,如果有添加SSD缓存可以把固态硬盘放在第一位。

原来博客不止我一个人看呀
本博客已稳定运行
发表了10篇文章 · 总计10.74k字
总阅读次 您是第个小伙伴 萌ICP备20250969号