起因
原因是发现群晖明明还有很多的内存也会就经常进行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缓存可以把固态硬盘放在第一位。