作者:潘立峰 | 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容器存储测试环境性能损耗较大,具体表现为:
- K8s容器存储测试环境的只读性能只有裸金属存储测试环境的 15%,即裸金属存储测试环境是K8s容器存储测试环境容器平台的 6 倍以上。
- K8s容器存储测试环境只写性能为裸金属存储测试环境的 83%。
- K8s容器存储测试环境的综合读写性能为裸金属存储测试环境的 52% 左右。
- K8s容器存储测试环境相比裸金属存储测试环境的删除性能稍微下降 7% 至 9%,差异不大。
- 同样查询次数,K8s容器存储测试环境耗用的时间为裸金属存储测试环境的 6 到 11 倍。
- 同样查询次数,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% 的数据将被舍弃,即去掉瞬间的毛刺(尖峰),使统计值更具真实意义 |