QNAP NAS使用在SSD的SWAP文件提升性能

  • 摘要
  • 问题描述
  • 1. 只有1个HDD的情况
  • 2. 有1个SSD和1个HDD的情况
  • 问题分析
  • 解决方法
  • 详细过程
  • 1. SSH连接到NAS
  • 2. 禁用HDD上的SWAP
  • 3. 创建SWAP文件
  • 4. 设置开机自动执行
  • 注意事项


摘要

通过在SSD上使用SWAP文件并禁用HDD上的SWAP分区,提高小内存容量的QNAP NAS的SWAP读写性能,减少CPU的I/O等待时间,提高系统性能。

关键词:QNAP、NAS、SWAP File、SSD

问题描述

在QNAP的小内存的小内存少磁盘插槽的NAS上启用大量占用内存的服务,物理内存占用过高时,SWAP分区占用会被系统频繁读写。由于HDD的物理特性,若在HDD上划分SWAP分区则SWAP分区读取性能较低,I/O等待大量占用CPU时间,使系统性能下降。

QNAP TS-212 P3是QNAP推出的一款入门级NAS,配备Realtek RTD1295处理器和板载1GB DDR4内存,支持2个3.5英寸SATA Ⅲ磁盘。

1. 只有1个HDD的情况

在TS-212 P3插槽1上装入一个HDD,并将系统安装在此HDD上。

此时系统在HDD上划分1个SWAP分区,并在系统所在卷创建SWAP文件,系统按照HDD的SWAP分区 → 系统卷的SWAP文件的顺序使用SWAP空间。

启用QuMagie后AI引擎占用大量内存,导致SWAP分区占用较高,HDD上的SWAP分区频繁被读写,I/O等待大量占用CPU时间,NAS频繁断开连接并长时间无法被访问。

qnap 开机自启动 frpc docker containertstation qnap 启动慢_插槽


qnap 开机自启动 frpc docker containertstation qnap 启动慢_ssh_02

2. 有1个SSD和1个HDD的情况

在TS-212 P3插槽1装入一个HDD,插槽2装入一个SSD,并将系统安装在SSD上。

此时系统在HDD上划分SWAP分区,并在系统所在卷创建SWAP文件,系统按照HDD的SWAP分区 → 系统所在卷的SWAP文件的顺序使用SWAP空间。
此时即使系统安装在SSD上,也会因为优先使用HDD的SWAP分区而无法利用SSD的读写优势提升系统性能。

启用QuMagie后AI引擎占用大量内存,导致SWAP分区占用较高,HDD上的SWAP分区频繁被读写,I/O等待大量占用CPU时间,NAS频繁断开连接并长时间无法被访问。

问题分析

查阅帮助文件,QNAP对交换分区做出以下解释:

默认情况下,QTS 预留大约 8 GB 空间(分布在不同的 HDD),在系统卷上预留 16 GB 用作交换空间。如果 NAS 装有两个 2.5 英寸 SSD,一个 M.2 SSD 或一个 PCIe SSD,QTS 会另外再创建约 8 GB 的交换空间(分布在不同的 SSD)。SSD 交换空间会比 HDD 交换空间优先使用,以提升系统性能。QTS 预留的交换空间量不得变更。在容量较小的硬盘或卷上,可能会预留较少的交换空间。

咨询QNAP技术支持,得到的回复是:

当前的design 是这样的:

  1. 一個 SSD 用完整磁區做系統 -> No SWAP (只有一個 SDD)
  2. 一個 SSD 用精簡磁區做系統 -> No SWAP (只有一個 SDD
  3. 兩個 SSD 用完整磁區做系統 -> SSD & Volum SWAP
  4. 兩個 SSD 用精簡磁區做系統 -> SSD & Volum SWAP

所以如果只有單一SSD做成磁碟區,是沒有swap。请知悉。谢谢!

总结为表格:

表1.1 装入磁盘与SWAP的对应关系

磁盘1

磁盘2

M.2插槽

PCIe插槽

SSD SWAP

HDD SWAP

系统卷SWAP

HDD

×

×

×

0

8GB

16GB

HDD

HDD

×

×

0

8GB

16GB

SSD

×

-

-

8GB

0

16GB

SSD

HDD

×

×

0

8GB

16GB

SSD

SSD

-

-

8GB

0

16GB

-

-

SSD

-

8GB

0/8GB

16GB

-

-

-

SSD

8GB

0/8GB

16GB

表中“×”表示不装入磁盘,“-”表示可装入任意类型磁盘。

TS-212 P3没有M.2插槽或PCIe插槽,无擦装入M.2 SSD或PCIe SSD。且它只有2个磁盘插槽,若将2个插槽都装入SSD,储存空间将无法满足我的使用需求。

需要对系统进行修改,使系统在SSD上分配SWAP分区或禁用HDD上的SWAP分区。

解决方法

在通常情况下,SSD的可用空间可能已经被分区并使用,没有足够的未分配空间划分SWAP分区,因此使用一种更通用的方式:SWAP File。1

详细过程

1. SSH连接到NAS

  1. 打开控制台 → 网络&文件服务 → Telnet/SSH。
  2. 勾选允许SSH连接并设置端口号 (默认为22)。
  3. 点击应用保存设置。
  4. 通过SSH连接NAS,登录管理员账户。(这里使用Xshell 7演示)
    a. 进入连接Connection。在协议Protocol中选择SSH,主机Host (涂绿色处)填入NAS的IP地址,端口号Port Number (涂红色处)填入在NAS控制台设置的SSH的端口号。名称Name处可以随意填写。
  5. qnap 开机自启动 frpc docker containertstation qnap 启动慢_d3_03

  6. b. 进入授权Authentication。在方法Method中选择Password,用户名User Name (涂绿色处)填入NAS的管理员账户名,密码Password (涂红色处)填入NAS的管理员账户密码。
  7. qnap 开机自启动 frpc docker containertstation qnap 启动慢_ssh_04

  8. c. 点击连接Connect连接至NAS,控制台出现管理主菜单。输入Q返回至Shell环境。
  9. qnap 开机自启动 frpc docker containertstation qnap 启动慢_linux_05

  10. d. 输入Y确认。
  11. qnap 开机自启动 frpc docker containertstation qnap 启动慢_vim_06

  12. 控制台出现[~] #
  13. qnap 开机自启动 frpc docker containertstation qnap 启动慢_d3_07

2. 禁用HDD上的SWAP

  1. 查看现在NAS上有哪些SWAP。输入命令
[~] # cat /proc/swaps

返回现在的SWAP有

Filename								Type		Size 		Used 	Priority
/dev/md256								partition 	530108 		343448 	-1
/dev/md322								partition 	7235132 	138184 	-2
/share/CACHEDEV1_DATA/.swap/qnap_swap	file		16777212	0		-3

即此时我有2个SWAP分区:/dev/md256/dev/md322,还有1个SWAP文件:/share/CACHEDEV1_DATA/.swap/qnap_swap。返回的结果因人而异。

由于已知2个SWAP分区是分配在HDD上的,因此禁用这两个SWAP分区。

  1. 禁用SWAP分区。输入命令
[~] # swapoff /dev/md256
[~] # swapoff /dev/md322

此时2个在HDD上的SWAP分区被禁用。

若此时系统不是安装在SSD上,则不会有SSD上的系统卷SWAP文件,需要手动创建。

3. 创建SWAP文件

  1. 浏览器访问NAS,通过QNAP File Station在SSD的卷上创建共享文件夹SWAP
    SWAP共享文件夹的名字可以用任意名字任意替换。
  2. 回到Xshell,切换目录至刚刚创建的SWAP文件夹 (或是你自己命名的其他名字)。输入命令
[~] # cd /share/SWAP

若创建的共享文件夹不叫SWAP,则将命令中的SWAP替换成你创建的文件夹的名字。

  1. 在SWAP文件夹中创建一个名叫swapfile的文件。输入命令
[/share/SWAP] # dd if=/dev/zero of=swapfile bs=1048576 count=16384

该命令将在SWAP文件夹中创建一个连续的、没有碎片的文件。虽然这在SSD上无关紧要,但如果希望在HDD上创建SWAP File,这是很有必要的。

可以修改命令中bscount后面的数字调整文件的大小:bs是块大小,单位为字节;count是块的个数。此处我创建了一个块大小为1MB、共16GB的文件。

根据硬盘的写入性能和创建文件的大小,执行命令后需要等待一段时间,当控制台返回类似以下文字时说明文件已经创建。

16384+0 records in
16384+0 records out
17179869184 bytes (16.0GB) copied, 109.460713 seconds, 149.7MB/s
  1. 检查是否成功创建文件,输入命令
[/share/SWAP] # ls -l

若返回类似以下文字时说明文件创建成功。

total 16777228
drwxr-xr-x 2 admin administratiors 4096 2021-01-23 23:12 @Recently-Snapshot/
drwxrwxrwx 2 admin administrators 4096 2021-01-23 23:12 @Recycle/
-rw-r—r—1 admin administrators 17179869184 2021-01-23 23:36 swapfile
  1. 设置文件权限,确保不会有人弄坏这个文件。输入命令
[/share/SWAP] # chmod 600 swapfile

最好将SWAP文件夹在网络中隐藏,确保没有人能弄坏这个文件。

用浏览器访问NAS,打开控制台 → 权限 → 共享文件夹 → 共享文件夹,找到SWAP文件夹,点击编辑属性内容,勾选隐藏网络磁盘

qnap 开机自启动 frpc docker containertstation qnap 启动慢_d3_08

  1. swapfile文件制成SWAP文件。输入命令
[/share/SWAP] # mkswap swapfile

应返回类似以下文字

Setting up swapspace version 1, size = 17179865 kB
  1. 令NAS使用这个SWAP文件。输入命令
[/share/SWAP] # swapon swapfile

此时NAS应已经开始使用这个SWAP File。

cat命令确认是否成功,输入命令

[/share/SWAP] # cat /proc/swaps

若返回swapfile则说明成功。

Filename								Type	Size 		Used 	Priority
/share/CACHEDEV1_DATA/.swap/qnap_swap	file	16777212	0		-1
/share/CACHEDEV1_DATA/SWAP/swapfile 	file	16777212	0		-2

此时成功在SSD上创建SWAP文件并使用。

但QNAP NAS每次重启后都会使用系统默认的SWAP设置,因此需要令NAS每次开机时自动执行上述命令。2

4. 设置开机自动执行

  1. 用浏览器访问NAS,打开控制台 → 系统 → 硬件,勾选启动时运行用户定义的进程。点击应用保存设置。
  2. 回到Xshell,编辑autorun.sh文件,输入命令
[/share/SWAP] # cd /share/CACHEDEV1_DATA/.system/autorun
[/share/CACHEDEV1_DATA/.system/sutorun] # vim autorun.sh

其中CACHEDEV1_DATA是系统卷名称,名称因人而异,若名称不同需替换。

进入vim界面后输入I进入INSERT模式,在第一行下方输入以下文字

swapoff /dev/md256
swapoff /dev/md322
mkswap /share/SWAP/swapfile
swapon /share/SWAP/swapfile

qnap 开机自启动 frpc docker containertstation qnap 启动慢_vim_09


按下esc键退出INSERT模式,输入以下命令保存文件并退出vim

:wq
  1. 回到浏览器,点击查看autorun.sh查看是否保存成功。

    此处显示内容与vim中编辑的一致,则修改成功。
  2. 重启,完成修改。
    此时NAS会自动禁用HDD的SWAP分区,并使用刚刚设置的SWAP File。

注意事项

由于禁用了SWAP分区,只使用在一个卷上的SWAP File,可能会导致正在使用SWAP File所在的卷无法被卸载。若出现系统文件不干净等需要检查文件系统的情况,SWAP File所在的卷将无法被卸载,因此无法完成文件系统检查。由此可能会导致NAS没有响应,无法连接等情况。

若出现需要卸载SWAP File所在卷的情况,需要先将autorun.sh中输入的

swapoff /dev/md256
swapoff /dev/md322
mkswap /share/SWAP/swapfile
swapon /share/SWAP/swapfile

注释掉。即即进入vim中,在该4行文字前插入#

#swapoff /dev/md256
#swapoff /dev/md322
#mkswap /share/SWAP/swapfile
#swapon /share/SWAP/swapfile

然后重启NAS,此时NAS会使用系统默认策略创建的SWAP分区,然后再进行需要卸载卷的操作。


  1. How to add SWAP Partition (on SSD) ↩︎
  2. SCRIPT create-autorun.sh ↩︎