0%

在OpenMediaVault上配置NFS over RDMA

理论上使用nfs-kernel-server的服务器都可以用这个方法进行配置,可以用如下命令安装

1
sudo apt-get install nfs-kernel-server

本文主要参考了Sparktour’s博客中使用Mellanox网卡基于RDMA挂载NFS

前情提要

之前家里的服务器系统用的是VMWare ESXi,主要一开始比较图方便,而且界面也算是美观。

但用着用着,总觉得有些地方不太喜欢,比如配置TPM、链路聚合等功能,还需要一个额外的vCenter系统来进行管理配置,感觉太“重”了。

所以前几天就忙着备份服务,并将服务器的系统重装为了Proxmox VE,一个基于KVM的虚拟化平台。

在原本的服务器上,我在OpenMediaVault系统上配置了VGPU和Docker,相当于存储和业务都放在一个虚拟机里,优点ALL IN ONE的意思。

既然推倒重来了,我还是希望能将家里服务器上的各个业务理顺一点,大概的架构像这样,后面管理也比较清晰,不至于ALL IN BOOM。

那么要想实现这个架构,我必须做到,让上层的业务,能够访问存储服务器的资源。

技术选型

目前比较需要存储的业务有两个,一个是Emby媒体服务器,一个是qBittorrent,Emby的话其实主要就是读取媒体文件而已,而qBittorrent的话,跑PT下载上传,对文件IO会比较敏感一些,所以我的想法是,qBittorrent用ISCSI连接到存储服务器,最好能配置成ISER(iSCSI Extensions for RDMA),然后Emby用NFS或者SMB连接到媒体服务器。ISER的配置我还没研究明白,NFS的比较简单,并且也支持RDMA,所以就先从这个开始入手了。

我的Emby电影都是从PT站上下载的,我也不想当一个吸血鬼,下载完种子后不保种。所以我电影电视剧下载完后,是将下载的文件拷贝到Emby使用的硬盘上,某种意义上来说,把qBittorrent直接挂在存储服务器上确实方便,但综合想了一下,还是想将各个业务层分清楚一点。

开始配置NFS服务端

OpenMediaVault原生支持NFS功能,直接在web上就可以配置。

WEB UI配置

第一步,在web上,服务——NFS——共享里配置好需要分享的文件夹

第二步,在服务——NFS——设置,启动NFS服务

修改systemctl配置文件

执行完上面两步,只是完成了基本的NFS配置,此时还不支持RDMA

如果需要支持RDMA,需要加载内核模块,并让NFS服务器使用RDMA,好在OpenMediaVault的NFS基于nfs-kernel-server,只需要修改nfs服务的启动文件即可

我们在这个路径可以看到nfs-kernel-server的启动配置文件

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
[Unit]
Description=NFS server and services
DefaultDependencies=no
Requires=network.target proc-fs-nfsd.mount
Requires=nfs-mountd.service
Wants=rpcbind.socket network-online.target
Wants=rpc-statd.service nfs-idmapd.service
Wants=rpc-statd-notify.service
Wants=nfsdcld.service

After=network-online.target local-fs.target
After=proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
After=nfs-idmapd.service rpc-statd.service
After=nfsdcld.service
Before=rpc-statd-notify.service

# GSS services dependencies and ordering
Wants=auth-rpcgss-module.service rpc-svcgssd.service
After=rpc-gssd.service gssproxy.service rpc-svcgssd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/sbin/exportfs -r
ExecStart=/usr/sbin/rpc.nfsd
ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f

ExecReload=-/usr/sbin/exportfs -r

[Install]
WantedBy=multi-user.target

我们只需要定位到ExecStart=/usr/sbin/rpc.nfsd, 在其上下添加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/sbin/exportfs -r

ExecStartPre=/sbin/modprobe rpcrdma

ExecStart=/usr/sbin/rpc.nfsd

ExecStartPost=/bin/bash -c "sleep 3 && echo 'rdma 20049' | tee /proc/fs/nfsd/portlist"

ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f

这个配置的意思是,在启动NFS服务之前,先加载rpcrdma内核模块

然后在启动后,添加使用RDMA支持,监听20049端口。

修改完后重载启动配置

1
systemctl daemon-reload

然后重启NFS服务

1
systemctl restart nfs-kernel-server.service

配置NFS客户端

首先客户端需要安装nfs-common组件

1
sudo apt-get install nfs-common

然后用以下命令挂载即可

1
sudo mount -o proto=rdma,port=20049 NFS服务器的IP地址:/NFS共享文件夹名称 你本地的挂载点

例如,我在本地新建了一个test文件夹当做挂载点,NFS服务器地址是192.168.4.72,NFS分享的目录名称叫做pt_share_folder,

1
sudo mount -o proto=rdma,port=20049 192.168.4.72:/pt_share_folder test

挂载的时候我们通过proto=rdma,port=20049来强制NFS走RDMA。

看看跑分(淘汰的笔记本硬盘组的RAID0,性能比较幽默,理解一下

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
magicdian@ubuntu-hpn-dev:~/test$ curl -sL yabs.sh | bash -s -- -ig
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
# Yet-Another-Bench-Script #
# v2024-03-05 #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Fri Mar 29 06:04:10 AM UTC 2024

Basic System Information:
---------------------------------
Uptime : 0 days, 15 hours, 49 minutes
Processor : QEMU Virtual CPU version 2.5+
CPU cores : 48 @ 2794.746 MHz
AES-NI : ✔ Enabled
VM-x/AMD-V : ❌ Disabled
RAM : 31.3 GiB
Swap : 8.0 GiB
Disk : 100.8 GiB
Distro : Ubuntu 22.04.4 LTS
Kernel : 5.15.0-101-generic
VM Type : KVM
IPv4/IPv6 : ✔ Online / ❌ Offline

IPv4 Network Information:
---------------------------------
ISP : Akari Networks
ASN : AS38136 Akari Networks
Host : Akari Networks Limited
Location : Hong Kong, Central and Western District (HCW)
Country : Hong Kong

fio Disk Speed Tests (Mixed R/W 50/50) (Partition 192.168.4.72:/pt_share_folder):
---------------------------------
Block Size | 4k (IOPS) | 64k (IOPS)
------ | --- ---- | ---- ----
Read | 249.00 KB/s (62) | 4.85 MB/s (75)
Write | 265.00 KB/s (66) | 5.09 MB/s (79)
Total | 514.00 KB/s (128) | 9.95 MB/s (154)
| |
Block Size | 512k (IOPS) | 1m (IOPS)
------ | --- ---- | ---- ----
Read | 33.03 MB/s (64) | 51.02 MB/s (49)
Write | 35.23 MB/s (68) | 54.19 MB/s (52)
Total | 68.26 MB/s (132) | 105.22 MB/s (101)

YABS completed in 2 min 33 sec

配置完后的效果

  • 文件传输时,iftop看不到网络流量,应该是通过RDMA技术直接访问远程内存了
  • 文件存储服务器重启后,docker的挂载点不需要额外的操作就可以继续访问了。

两个疑问

客户端在NFS挂载点使用fio进行测速的时候,用iftop命令是没有查看到有大流量的,但是在服务端,我使用命令 netstat -ntulp 并没有看到RDMA 20049端口的监听,应该要如何证实当前的NFS是基于RDMA的呢?

另外,如果qBittorrent下载/上传的过程中文件服务器重启/挂掉会怎样??