起因
几个月前,开始重学编程,往 NAS 的 docker 里放了些 containers ,每一个用来跑练习的 App。为了放更多的app,上个月加了 4GB 内存。最近只放了两个,NAS 就会时不时的闪断。codes 全存在网络驱动器上,当存盘存时报错,浏览器显示网络断开,烦!登录 NAS QTS 会提示 swap 使用过高,内存用尽之类的。今天闲,调优顺手写个水文。 10年前 IT 是本行。
原有配置
- 硬件是 QNAP TS-453D 2020年买的低配空壳,但送了 4GB 内存
- 添了 2 块 4TB HHD 硬盘, RAID 1 运行,读出性提高。
- 扩展卡,为使用 SSD 当缓存,提高性能。(还有一个 TS-210 特别慢)
- 插了一片 256GB SSD (Laptop 换下来的,可以说为这一片,买的上面这些...)
- 上个月买了一条 4GB 内存
当前配置
初步性能提升
从上图,可以看到新加的 4GB 内存,在 NAS 中已经识别,虽然工厂不同,但兼容性是正常的。因为这是一个封闭的 Linux 系统,能做的不太多,只能在 OS 设置上找办法。
以下操作要使用 管理员 admin root 操作
1.预防网络服务的中断,减少 swap 使用
a. 调整 VM swappiness 去减少 swap 使用
文件:/proc/sys/vm/swappiness
VM Swappiness 是一个内核参数,控制 OS 使用交换内存(swap)的积极程度。值越高,系统越倾向于将内存中的数据放到硬盘;值越低,尽量保留数据在物理的内存中。
QNAP QTS 默认:25
[admin@davens templates]# cat /proc/sys/vm/swappiness
25
其实满低的,但我给它改为:10
[admin@davens templates]# echo 10 > /proc/sys/vm/swappiness
[admin@davens templates]# cat /proc/sys/vm/swappiness
10
b. 什么是 swap 虚拟内存 ( VM ) 技术
在 Linux 中,swap 是一种虚拟内存 ( VM ) 技术,它让系统使用硬盘空间来扩展物理内存(RAM)。当物理内存不够用时,系统会将一部分不常用的内存数据移到硬盘上的专用空间或文件,之后释放物理内存,把内存空间让给其它程序使用。
Linux Unix Windows 都用了这项技术
补充1: swap 会经常在硬盘的固定位置上 读写 操作, 如果你的物理内存足够大,比如我在用的老笔记本 32GB 内存,只是看网剧用。32GB 内存应该不会用满,可以在 Windows 11 中,把虚拟内存调为 0。还能保护 SSD。
截屏这台 Laptop 是我儿子的,给个参考示范。在哪里设置 虚拟内存(Windows 里叫 Paging file),你需要以 系统管理员 身份运行才能修改:
c. 继续优化 修改 /etc/sysctl.conf
原文件内容:
[admin@davens templates]# cat /etc/sysctl.conf
vm.swappiness=10
有点儿奇怪,QNAP QTS 系统只有一行。淫吹斯丁。 /etc/sysctl.conf 是 Linux 系统中一个重要的内核参数配置文件。可以调整网络、内存管理、文件系统。
修改后内容:
[admin@davens templates]# sysctl -p
vm.swappiness = 10
vm.oom_kill_allocating_task = 1
vm.min_free_kbytes = 65536
vm.vfs_cache_pressure = 50
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 2500
kernel.panic = 20
kernel.panic_on_oops = 1
[admin@davens templates]#
解释各个参数作用:
注:做这些前,不要完全参考我的参数,要以你的 NAS/Linux 系统来做相应调整
第一部分 内存管理
vm.swappiness = 10 | 让系统更倾向使用物理内存 |
vm.oom_kill_allocating_task = 1 | OOM killer(Out-Of-Memory killer)当系统内存耗尽时,会选择并杀死 1 个进程,来释放内存 |
vm.min_free_kbytes = 65536 | 系统必须保留 64 MB 内存 (通常是物理内存的 1% - 5%,因为我把 swap 放在 SSD,用 7 GB 的 1%,取最近 8 的倍数。) |
vm.vfs_cache_pressure = 50 | 控制内核,回收文件系统缓存(值:1-100), 50 内核减少回收缓存,提高文件系统性能。 |
第二部分 网络性能
net.core.rmem_max = 16777216 | 设置接收的网络缓冲区:16MB 提高在高带宽、高延迟或高并发网络环境下的性能 |
net.core.wmem_max = 16777216 | 设置发关的网络缓冲区:16MB 提高在高带宽、高延迟或高并发网络环境下的性能 |
net.ipv4.tcp_rmem = 4096 87380 16777216 | 单独优化 Tcp 缓冲区的接收值大小。最小 4096 bytes,Linux默认值 87380, 最大值 16MB。 |
net.ipv4.tcp_wmem = 4096 65536 16777216 | 单独优化 Tcp 缓冲区的发送值大小。最小 4096 bytes,Linux默认值 65536, 最大值 16MB。 |
net.core.netdev_max_backlog = 2500 | 数据包队列的最大长度,在高负载时减少数据包丢失。 |
第三部分 系统稳定性
kernel.panic = 20 | 内核崩溃后 20 秒自动重启 |
kernel.panic_on_oops = 1 | 内核发生 Oops,系统会立即进入 panic,20秒后重启 |
注:Oops 当 Linux 内核检测到一些不一致或异常情况时,会生成 Oops 信息,但通常不会导致系统立即能崩溃。
2. 找出 swap 配置
a. CMD: free -g
[admin@davens ~]# free -gtotal used free shared buffers cached
Mem: 7 4 3 0 0 0
-/+ buffers/cache: 3 4
Swap: 30 5 24
可以看到内存状态:
- 总共:7GB (可能系统占用1GB没显示)
- 使用:4GB
- 可用:3GB
- 缓存:0GB
- 实际空闲:4GB (含缓存)
- 实际使用:3GB (含缓存)
可以了解交换内存 swap 状态:
- 总共:30GB
- 使用:5GB
- 空闲:24GB
以前没留意过,没想到 QNAP 默认在系统里,分给这么大的交换内存,我的知识里,交换内存最大是物理内存的 2 倍。 现在技术是进步,还是逻辑不同了吗?
建议1:以下操作,先备份数据,再执行后面的命令。(我没有备份数据,以前是做 IT 的,就算 OS 起不来,也容易搞定。)
建议2:如果你的 NAS 是 RAID 1, 可以摘下一块儿硬盘或同组硬盘,幸运的话重建用1-2天,万一系统毁了,用这块/组盘来启动,能恢复之前的配置。
b. swaps 交换文件
原配置:/proc/swaps 用于存储 swaps 信息的
[admin@davens templates]# cat /proc/swaps
Filename Type Size Used Priority
/dev/md321 partition 7751228 6026840 -2
/dev/md256 partition 530108 0 -3
/dev/md322 partition 6702652 0 -4
/share/CACHEDEV1_DATA/.swap/qnap_swap file 16777212 0 -5
从上面可以了解到:QNAP NAS 的交换内存(文件)的具体配置(文件名,交换内存的类型,大小,使用情况,优先级),TMD 我说 NAS 硬盘总是响,原来是 swap 害的。
QNAP QTS 把交换内存 swap 文件分为三份: /dev/md321 /dev/md256/ dev/md322 ,现在内存不够用,要经常读写 swap 这部分,草得雷。
而且它已经用了 CACHEDDEV1_DATA 这是 SSD 设备,优先级是 -5。竟然是最后,合着一只没用上。.
c. 在 SSD 上创建一个新的 8GB swap
[admin@davens templates]# dd if=/dev/zero of=/share/CACHEDEV1_DATA/.swap/ssd_swap bs=1M count=8192
8192+0 records in
8192+0 records out
8589934592 bytes (8.0GB) copied, 39.890566 seconds, 205.4MB/s
[admin@davens templates]#
写的速度是 205.4MB/s ,现在可以确定 CACHEDDEV1_DATA 是 SSD,就用它做 swap。
这是 NAS 上的 SSD 缓存配置,就不分析上面的内容。 看到是健康的就行。
继添加 “ssd_swap” 到 swap 中,还要用以下的命令:
- 分配权限 600:chmod 600 /share/CACHEDEV1_DATA/.swap/ssd_swap
- 格式化新的swap:mkswap /share/CACHEDEV1_DATA/.swap/ssd_swap
- 分配优先级:swapon -p -1 /share/CACHEDEV1_DATA/.swap/ssd_swap (但 QNAP 不支持 -1)
[admin@davens templates]# chmod 600 /share/CACHEDEV1_DATA/.swap/ssd_swap
[admin@davens templates]# mkswap /share/CACHEDEV1_DATA/.swap/ssd_swap
Setting up swapspace version 1, size = 8589930 kB
[admin@davens templates]# swapon -p -1 /share/CACHEDEV1_DATA/.swap/ssd_swap
[admin@davens templates]# cat /proc/swaps
Filename Type Size Used Priority
/dev/md321 partition 7751228 5995864 -2
/dev/md256 partition 530108 0 -3
/dev/md322 partition 6702652 0 -4
/share/CACHEDEV1_DATA/.swap/qnap_swap file 16777212 0 -5
/share/CACHEDEV1_DATA/.swap/ssd_swap file 8388604 0 -6
执行完以上命令后,竟然是 -6 ,新做的 swap 现在是最后一个使用的。
d. 重新分析 swaps 优先级
原来的:
[admin@davens templates]# cat /proc/swaps
Filename Type Size Used Priority
/dev/md321 partition 7751228 5995864 -2
/dev/md256 partition 530108 0 -3
/dev/md322 partition 6702652 0 -4
/share/CACHEDEV1_DATA/.swap/qnap_swap file 16777212 0 -5
/share/CACHEDEV1_DATA/.swap/ssd_swap file 8388604 0 -6
把每一个 swap 从系统中脱离:
[admin@davens templates]# swapoff /share/CACHEDEV1_DATA/.swap/ssd_swap
[admin@davens templates]# swapoff /share/CACHEDEV1_DATA/.swap/qnap_swap
[admin@davens templates]# swapoff /dev/md322
[admin@davens templates]# swapoff /dev/md256
[admin@davens templates]# swapoff /dev/md321
重新分配优先级:
[admin@davens templates]# swapon -p 1 /share/CACHEDEV1_DATA/.swap/ssd_swap
[admin@davens templates]# swapon -p 2 /share/CACHEDEV1_DATA/.swap/qnap_swap
[admin@davens templates]# swapon -p 3 /dev/md321
[admin@davens templates]# swapon -p 4 /dev/md256
[admin@davens templates]# swapon -p 5 /dev/md322
修改之后:
[admin@davens templates]# cat /proc/swaps
Filename Type Size Used Priority
/share/CACHEDEV1_DATA/.swap/ssd_swap file 8388604 23872 1
/share/CACHEDEV1_DATA/.swap/qnap_swap file 16777212 0 2
/dev/md321 partition 7751228 0 3
/dev/md256 partition 530108 0 4
/dev/md322 partition 6702652 0 5
[admin@davens templates]#
现在 VM 使用了 SDD。正因为交换内存 swap 从 HHD 换到了 SSD, NAS 安静多了。希望这个 3星 SSD 有长寿。