作者:潘立峰 | QE-LAB
云存储平台提供了海量的存储容量,可提供用户多种存储业务模式,但是,由于用户场景需求、文件块大小、并发情况差异较大,造成服务器压力不均衡、资源闲置,浪费处理能力,频繁报错等问题,却始终困扰着我们。本文通过 K8S 容器环境、裸金属环境下 nfs 存储之间 IOPS 读写测试数据比对,通过此测试方案,比较了两种不同环境下 NFS 存储性能差异。
本次测试目标仅测试在其他条件完全相同情况下(网络、CPU、内存,硬盘型号和类型,客户端性能),比较 K8s 集群下容器化的 NFS 和运行在 linux OS 下的 NFS 的 I/O 读写性能差别,并在这两种测试环境下,测试处理 mysql 数据库时的读写删除性能,通过测试,比较 K8s 容器环境和裸金属(用虚拟机模拟)下 NFS 存储的性能差异。
通过测试,给出容器化和裸金属环境下软硬件资源的配置建议,帮助企业更好地了解 NAS 类型的存储系统(如 NFS)。通过升级或修改其配置,从而提高整体应用程序性能;更有效地故障排查瓶颈和其他问题。
影响存储测试性能优劣的因素有很多,如果这些环节配置合理,可以发挥出存储的最佳性能,如果不当,那么任何一个环节都有可能成为瓶颈。通过下图来了解一下,在一个完整的测试过程中,可能会影响测试性能的各因素:
磁盘(磁盘类型,SATA,SAS)
接口(业务口配置,聚合,网卡性能及兼容性)
中间设备(交换机,链路,巨帧)
网络设置(网卡,巨帧)
软件(相关软件设置,测试软件设置及选择)
客户端主机性能 (initiator 与 CPU 占用率的关系)
软件名称 | 版本 | 说明 |
---|---|---|
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 存储卷配置:
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 只读测试后,收集的只读测试结果如下表。
测试项 | 裸金属存储测试环境 | 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%。
二种环境下执行 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%。
K8s 容器存储测试环境的资源开销是裸金属存储测试环境的 3 倍,延迟也比后者高。
裸金属存储测试环境的读写 IOPS 均在 11 万以上,而 K8s 容器存储测试环境的读写峰值 IOPS 只有 8 万出头。
使用 sysbench 从集群内对 mysql 执行 OLTP 基准测试后得出的测试结果,并以裸金属存储测试环境为基准提供了相对测试结果,与 K8s 容器存储测试环境环境进行了比较。
我们用 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 |
从上表看出,与裸金属存储测试环境相比,K8s 容器存储测试环境性能损耗较大,具体表现为:
经上述测试,我们发现在 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
本节列出了文中出现的所有缩略词和术语,便于理解和查阅。
序号 | 简写 | 英文全称 | 中文全称或含义 |
---|---|---|---|
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% 的数据将被舍弃,即去掉瞬间的毛刺(尖峰),使统计值更具真实意义 |