云原生 在云原生和裸金属环境开展 NFS 存储性能比对测试

QE LAB for QE LAB · 2023年03月02日 · 4040 次阅读

作者:潘立峰 | QE-LAB

1.前言

云存储平台提供了海量的存储容量,可提供用户多种存储业务模式,但是,由于用户场景需求、文件块大小、并发情况差异较大,造成服务器压力不均衡、资源闲置,浪费处理能力,频繁报错等问题,却始终困扰着我们。本文通过 K8S 容器环境、裸金属环境下 nfs 存储之间 IOPS 读写测试数据比对,通过此测试方案,比较了两种不同环境下 NFS 存储性能差异。

2.测试目的

本次测试目标仅测试在其他条件完全相同情况下(网络、CPU、内存,硬盘型号和类型,客户端性能),比较 K8s 集群下容器化的 NFS 和运行在 linux OS 下的 NFS 的 I/O 读写性能差别,并在这两种测试环境下,测试处理 mysql 数据库时的读写删除性能,通过测试,比较 K8s 容器环境和裸金属(用虚拟机模拟)下 NFS 存储的性能差异。

通过测试,给出容器化和裸金属环境下软硬件资源的配置建议,帮助企业更好地了解 NAS 类型的存储系统(如 NFS)。通过升级或修改其配置,从而提高整体应用程序性能;更有效地故障排查瓶颈和其他问题。

3.存储测试原理和影响因素

  • 存储测试原理

影响存储测试性能优劣的因素有很多,如果这些环节配置合理,可以发挥出存储的最佳性能,如果不当,那么任何一个环节都有可能成为瓶颈。通过下图来了解一下,在一个完整的测试过程中,可能会影响测试性能的各因素:

  • 影响到存储性能测试的因素

磁盘(磁盘类型,SATA,SAS)

接口(业务口配置,聚合,网卡性能及兼容性)

中间设备(交换机,链路,巨帧)

网络设置(网卡,巨帧)

软件(相关软件设置,测试软件设置及选择)

客户端主机性能 (initiator 与 CPU 占用率的关系)

4.测试准备

工具和软件

软件名称 版本 说明
Centos7.6 7.6 Centos 操作系统的一种发行版本,也是本次测试中几种测试环境的底层操作系统。
FIO 2.2.10 这是通用的 I/O 存储测试工具,在本次测试中将用于测试几种环境下的 I/O 读写性能。
sysbench 1.0.20 这款基准测试工具用于模拟 MySQL 数据库存储引擎 InnoDB 的磁盘 I/O 模式,进而评估 mysql 数据库读写删除性能。
Mysql 5.5 一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
NFS 4.0 NFS 是在 UNIX 和 Linux 系统中最流行的网络文件系统,属于 NAS 类型共享文件存储系统。
K8s 19 k8s 全称 kubernetes,k8s 是为容器服务而生的一个可移植容器的编排管理工具,k8s 的 nfs 存储卷用于将某事先存在的 nfs 服务器上导出的存储空间挂载到 pod 中以供容器使用。

测试环境

为了消除硬件环境下部分影响因子,本次测试的两个测试环境搭建在同一局域网内(详见拓扑图),统一使用千兆网卡以消除网络相关因素对本次测试影响,同时测试环境使用的虚拟机使用同一服务器的内存、CPU、磁盘,以消除因 CPU、内存、磁盘型号不同带来的影响因子,通过资源完全相同的虚拟机客户端配置,消除客户端主机不同带来的影响。

l K8S NFS&mysql 配置:

kind: Pod

metadata:

 name: vol-nfs-pod

 labels:

  app: mysql

spec:

 containers:

 \- name: mysql

  image: mysql:5.5

  ports:

  \- containerPort: 3306

   name: mysqlport

  volumeMounts:

  \- mountPath: /data

   name: mysqldata

 volumes:

 \- name: mysqldata

  nfs:

   server: [nfs.ilinux.io](http://nfs.ilinux.io/)

   path: /data/mysql

   readOnly: false

l 容器存储(PV)相关配置

Mysql 容器路径:root@mysql-5.5-d67bfff99-zv7h7:/data#

l 存储卷配置:

5.测试执行

FIO 测试:裸金属存储测试环境、K8s 容器存储测试环境、二种测试环境下执行以下命令实施 FIO 存储测试。

fio -direct=1 -iodepth=128 -rw=randrw -ioengine=libaio -bs=4k -size=15G -numjobs=1 -runtime=120 -group_reporting -filename=iotest -name=randrw_test

mysql 测试:分别在裸金属存储测试环境、K8s 容器存储测试环境容器平台两种测试环境下,通过数据卷存储数据使用 sysbench 从集群内对 mysql 执行 OLTP 基准测试时将使用以下命令。

sysbench --db-driver=mysql--mysql-user=root --mysql-password=dangerous --mysql-host=192.168.129.116 --mysql-port=34159 --mysql-db=mysql--range_size=100 --table_size=500000 --tables=10 --threads=5 --events=0 --time=60 --rand-type=uniform /usr/share/sysbench/oltp_read_only.lua prepare

FIO 测试

本节展示了实际的 FIO 测试结果为参考基准提供了相对测试结果,用于比较二种环境的性能优劣。

1.1 FIO 只读测试

在二种环境下执行 FIO 只读测试后,收集的只读测试结果如下表。

测试项 裸金属存储测试环境 K8s容器存储测试环境
处理的 IO 数据量 7678 MB 7678 MB
IOPS 113079 83364
bw=平均 IO 带宽 KB/s 452319 333457
slat=提交延迟 2.89 4.12
clat=完成延迟 562.21 762.24
lat=响应时间 565.18 766.43
CPU 利用率 2.85% 11.07%

资源开销对比

裸金属存储测试环境在 IOPS 和带宽分别为 113079 和 452319,其资源开销约为 3%,而 K8s 容器存储测试环境资源 IOPS 和带宽分别为 83364 和 333457,资源开销高达 10% 以上。

延迟和响应时间

裸金属存储测试环境在延迟和响应时间方面同样只有 3% 不到的资源开销;而 K8s 容器存储测试环境容器平台的资源开销高达 10% 以上。

小结

总之,K8s 容器存储测试环境的资源开销是裸金属存储测试环境的 3 倍,延迟也比后者长 36% 以上。

裸金属存储测试环境的读取性能高于 K8s 容器存储测试环境,峰值读取 IOPS 在 11 万以上,而 K8s 容器存储测试环境的峰值 IOPS 只有 8 万出头,仅相当于裸金属存储测试环境的 72%。

1.2 FIO 写入测试

二种环境下执行 FIO 写入测试后,收集的写入测试结果如下表。

测试项 裸金属存储测试环境 K8s容器存储测试环境
处理的 IO 数据量 7678MB 7678MB
IOPS 113062 83351
bw=平均 IO 带宽 KB/s 452250 333406
slat=提交延迟 3.76 5.58
clat=完成延迟 562.02 762.33
lat=响应时间 565.85 767.98
CPU 利用率 3.75% 10.10%

资源开销对比

裸金属存储测试环境在 IOPS 和带宽分别为 113062 和 452250,其资源开销约为 3%,而 K8s 容器存储测试环境资源 IOPS 和带宽分别为 83351 和 333406,资源开销高达 10% 以上。

延迟和响应时间

裸金属存储测试环境在延迟和响应时间方面同样只有 4% 不到的资源开销,而 K8s 容器存储测试环境和 K8s 容器存储测试环境容器平台的资源开销高达 10% 以上。

CPU 利用率

裸金属存储测试环境的 CPU 利用率没有明显变化,而 K8s 容器存储测试环境资源利用率不足 80%。

小结

总之,K8s 容器存储测试环境的资源开销是裸金属存储测试环境的 3 倍,延迟也比后者长 36% 以上,而 CPU 利用率只有后者的一半不到。

裸金属存储测试环境的写入性能高于 K8s 容器存储测试环境,峰值写入 IOPS 在 11 万以上,而 K8s 容器存储测试环境的峰值 IOPS 只有 8 万出头,约为裸金属存储测试环境的 72%。

1.3 FIO 测试结论

K8s 容器存储测试环境的资源开销是裸金属存储测试环境的 3 倍,延迟也比后者高。

裸金属存储测试环境的读写 IOPS 均在 11 万以上,而 K8s 容器存储测试环境的读写峰值 IOPS 只有 8 万出头。

mysql 测试

使用 sysbench 从集群内对 mysql 执行 OLTP 基准测试后得出的测试结果,并以裸金属存储测试环境为基准提供了相对测试结果,与 K8s 容器存储测试环境环境进行了比较。

1.4 测试结果

我们用 sysbench 这款基准测试工具模拟 mysql 数据库存储引擎 InnoDB 的磁盘 I/O 模式,在裸金属和 K8s 容器这两种测试环境下,对 mysql 数据库执行了只读、只写、综合读写和删除测试,得出了以下测试结果。

测试项 环境 TPS QPS 95th 百分位 (ms) 均值 (ms)
只读 裸金属存储测试环境 2292.728 36683.628 3.032 2.18
K8s 容器存储测试环境 346.37 5541.84 26.68 14.43
只写 裸金属存储测试环境 1068.68 6412.078 7.598 4.68
K8s 容器存储测试环境 889.42 5336.54 9.22 5.62
综合读写 裸金属存储测试环境 473.39 9467.77 30.37 10.56
K8s 容器存储测试环境 246.21 4924.25 30.81 20.30
删除 裸金属存储测试环境 2747.83 2747.83 1.95 1.82
K8s 容器存储测试环境 2491.59 2491.59 3.75 2.00

1.5 测试分析

从上表看出,与裸金属存储测试环境相比,K8s 容器存储测试环境性能损耗较大,具体表现为:

  1. K8s 容器存储测试环境的只读性能只有裸金属存储测试环境的 15%,即裸金属存储测试环境是 K8s 容器存储测试环境容器平台的 6 倍以上。
  2. K8s 容器存储测试环境只写性能为裸金属存储测试环境的 83%。
  3. K8s 容器存储测试环境的综合读写性能为裸金属存储测试环境的 52% 左右。
  4. K8s 容器存储测试环境相比裸金属存储测试环境的删除性能稍微下降 7% 至 9%,差异不大。
  5. 同样查询次数,K8s 容器存储测试环境耗用的时间为裸金属存储测试环境的 6 到 11 倍。
  6. 同样查询次数,K8s 容器存储测试环境删除耗用的时间为裸金属存储测试环境的 5 倍以上,综合读写方面差异不大。

6.测试总结

经上述测试,我们发现在 FIO 存储测试中,K8s 容器存储的资源开销是原有裸金属存储环境的 3 倍,延迟和响应时间比裸金属存储高 36% 以上;同样在 mysql 测试期间,裸金属存储测试环境的只读性能是 K8s 容器存储测试环境容器平台的 5 倍,综合读写性能是 K8s 容器存储的一倍。

所以我们建议

Ø 原有裸金属 nfs 存储业务转换使用 K8s 容器存储,应增加 K8s 容器存储节点虚拟芯片的核数为之前裸金属存储所有物理 CPU 核数的三倍,这样基本可以保证现有业务的稳定性。

Ø 在测试中,我们发现网络的状态会对 NFS 性能产生较大的影响,建议客户如需要使用 NFS 服务器对 mysql 数据库文件做备份的话,相关数据库服务器和 NFS 服务器划分到一个独立的 VLAN 里,同时 NFS 服务器尽量不要运行其他应用。

Ø 另外,在 NFS 配置 UPD 传输模式时候,性能会稍差,且容易丢包,,建议使用使用 TCP 命令在 NFS 服务器挂载 mysql 数据库文件夹,提升网络冗余,防止丢包导致相关 mysql 数据库文件内容丢失。

mount -t nfs 192.168.127.198:/data/lys /lys -o proto=tcp -o nolock

7.缩略词和术语表

本节列出了文中出现的所有缩略词和术语,便于理解和查阅。

序号 简写 英文全称 中文全称或含义
1 TPS Transactions Per Second 每秒处理的事务数
2 QPS Queries Per Second 每秒处理的查询数
3 IOPS Input/Output Operations Per Second 每秒输入输出量(或读写次数)
4 bw bandwidth 平均 I/O 带宽或吞吐量
5 slat submission latency 从提交 I/O 到实际执行 I/O 的时长
6 clat completion latency 从提交 I/O 到完成 I/O 的时长
7 lat latency 从 FIO 创建 I/O 到完成 I/O 的总时长
8 95th 百分位 The 95th percentile 统计数集内超过其 95% 的数据,超过 5% 的数据将被舍弃,即去掉瞬间的毛刺(尖峰),使统计值更具真实意义
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册