Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决

时间:2021-02-23 01:06:34


 作者:田逸(formyz)

场景描述


五节点Proxmox VE集群,万兆网络,数据网络与存储网络独立,接口两两bond,交换机堆叠。

单机配置两颗AMD 宵龙CPU,核心数48,单台线程数192,单台内存1024G。

存储分三种:SATA接口SSD,做系统盘;NVME 固态盘,做虚拟机与数据库的Ceph Pool;大容量低速SATA机械盘,做要求不太高的对象Ceph Pool。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决


计划中,像日志、图片等需要共享的数据,在Proxmox VE集群上创建虚拟机,从SATA Ceph Pool划分空间,以NFS服务共享给其他的主机。


性能问题描述


基础环境部署好以后交付给相关开发人员,有人从腾讯云拉取了一个400M左右的tgz压缩包,将其解包到挂接的NFS目录,速度非常慢,得几十分钟,尝试多次也是如此。将其换到本地目录(NVME Ceph Pool存储),耗时数秒。虽然我用dd测试NFS挂接目录、用scp远程拷贝大文件到nfs挂接目录,速度都还可以接受,建议用户本地目录tar,再cp到挂接来的共享目录。但用户认为,既然tar一个400M的包都那么费时,别的也可能不靠谱,不肯接受。


排查处理过程


首先登录到挂接NFS共享目录的系统,执行如下指令,复现一下tar解包的耗时。

[root@mysql-p-122-120 ~]# time tar zxvf 29.tgz -C /mnt/nfs/ --no-same-owner

从感官上都觉得很慢,因为屏幕滚动一顿一顿的,很久都没有结束,暂时ctrl-c结束进程,吧这个tar到本地目录,10几秒而已。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决



一干到底,继续执行tar到共享目录,看到底耗时多少,很久很久以后,终于正常结束了,耗时很恐怖!

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决

怀疑是Centos系统的问题,换OpenSuse,慢!换TrusNAS,仍然慢啊!由于需要尽快把业务从公有云迁移到自有Proxmox VE集群,压力很大。于是临时找了一个安装了Debian系统的外部单服务器,再Debian系统里发布NFS,共享给Proxmox VE里的虚拟机,再进行测试,tar 同样的那个tgz包,耗时秒级。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决

由此可得出一个初步结论,物理机操作系统之上发布的NFS性能,比虚拟出来的NFS性能还是有很大的差异,虽然物理存储都是SATA 机械盘。这个临时措施解决了性能问题,但因为它存在单点,决策人坚决反对,既需要性能有需要可用性,这还真难啊!本来建议再增加两台服务器,做成双机形式的NFS服务,讨论方案,未能通过,看来还得回到Proxmox VE集群,解决了性能,才能交差。

辗转反侧,绞尽脑汁,夜不能寐。既然操作系统Debian上发布NFS不存在性能问题,那么虚拟出一层后发布的NFS性能存在那么大的差异,是不是是协议方面的问题呢?NFS客户端,我一直习惯用“-o nolock,vers=3”这样的方式来挂接NFS共享目录,如果换成NFS版本4,会不会好一些呢?

立即在Proxmox VE集群建一个虚拟机,安装好操作系统(NVME Ceph Pool),并单独分配了SATA Ceph Pool作为存储空间作为系统的“sdb”存储设备。分区后在这个/dev/sdb1上创建文件系统,选择Btrfs格式,挂接到系统。确认挂接的分区读写正常后,文本编辑器修改“/etc/export”文件,内容如下:

/data/nfs_dir 10.122.200.0/22(fsid=0,async,rw,all_squash,annotallow=1000,annotallow=1000)

其中,/data是分区“/dev/sdb1”的挂节点,目录是手动创建的。与以前的NFS服务配置相比,多了一个选项“fsid=0”,这是NFS4 版本所需要的。

再创建一个用户data,用户id、组id正好是1000,与NFS配置文件里的设定相一致。再用指令“chown -R data:data /data/nfs_dir”赋予正确的权限(系统管理员不许用chmod 777这个坏毛病哟)。启动服务NFS及rpcbind,并确认其正确性。

继续回到Proxmox VE集群上欲挂接NFS共享的系统,执行如下指令进行挂接。注意:NFS4的挂接与NFS v3有少许差别,挂节点不一样哟!

mount.nfs4 10.122.200.138:/ /mnt/nfs/ -o rw

如果挂接地址加上NFS export出来的路径,会报错的。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决

确保NFS 以版本4的方式挂接,执行如下指令确认。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决



一切准备妥当,再来执行那个tgz包往NFS共享目录写入,看看什么结果是否有所改善。


[root@mysql-c-200-113 ~]# time tar zxvf 29.tgz -C /mnt/nfs --no-same-owner

29/photo/origin/2023/3/9/1db014ac121fe614d614e2af858cc60a.jpg

29/photo/origin/2023/3/15/

29/photo/origin/2023/3/15/23965ad2037c0b02f007e8a442153e96.jpg

……………省略若干……………

29/photo/origin/2023/3/15/0d6cf1265b3cc1365f861d0f357155a1.jpg


real 0m11.595s

user 0m3.014s

sys 0m2.227s

与NFS v3 相比,天壤之别。重复数次测试,保持稳定,问题得以解决。


最终结论


在高性能的Proxmox VE超融合集群上,即便是用低速SATA机械盘虚拟一层后发布出来的NFS服务,在保证最高可用性的前提下,性能上同样可以满足需求。

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决