云服务器基准性能测试

2023-02-20 17:02:19 浏览数 (1)

云服务器基准测试

测试说明:基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试;云服务器基准测试主要是相同软件版本下不同硬件的性能对比测试。

测试工具:

网络性能测试

带宽性能(TCP)

性能指标:测试网络吞吐速率

测试工具:netperf

代码语言:javascript复制
centos
# 下载netperf
wget -O netperf-2.7.0.tar.gz -c  https://codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.7.0
tar zxf netperf-2.7.0.tar.gz
cd netperf-netperf-2.7.0
# 安装编译
./autogen.sh && ./configure && make && make install

ubuntu
# 下载安装netperf
sudo apt install netperf -y

测试方法:

1. S1上安装上安装netperf的netserver作为服务器server端,

2. C1、C2上安装netperf作为客户client端,

3. 在不运行应用情况下,C1和C2同时压测S1,测试S1的网络TCP带宽性能;

4. 持续时间为3分钟,取S1收到压力30秒后持续2分钟的带宽平均值;

5. 分别对计算型实例、通用型实例的TCP、TCP_RR、TCP_CRR流进行测试;

6. 分别针对场景1、2、3分别按照64、512、1500、2048字节的吞吐速率进行上述测试;

7. 每个过程记录S的CPU、网卡利用率;

关注指标:rxkB/s的值,即为收带宽的值

测试步骤:

执行以下命令:

1.在服务端启动server命令:

代码语言:javascript复制
# 使用shell脚本快速启动,脚本内容如下
for i in {7000..7015}
do 
    echo $i
    netserver -p $i
done
注:这里默认16条流,如需修改数量,只需修改7015值即可

2.客户端发起client测试命令(与server端的port数匹配):

代码语言:javascript复制
# 使用shell脚本快速启动,脚本内容如下
client1:
size=$1
for i in {7000..7007}
do
    echo $i
    netperf -H <server端ip> -p $i -t TCP_STREAM -l 180 -- -m $size &
done

client2:
size=$1
for i in {7008..7015}
do
    echo $i
    netperf -H <server端ip> -p $i -t TCP_STREAM -l 180 -- -m $size &
done
# 注:如需测试TCP_RR等,只需要替换TCP_STREAM即可

参数备注:

-H 接收端IP地址 -p 端口号 -t 发包协议类型,可以是TCP_STREAM或者UDP_STREAM -l 测试时长 -m 数据包大小

3.查看结果

在server端使用sar采集平均带宽的命令:

代码语言:javascript复制
sleep 30;sar -n DEV 1 120

如sar命令无法执行,安装sar工具 yum install sysstat

测试5次,取5次的平均值作为结果

rxkB/s乘以8,再除以1000转换为Mb/s

取sar结果里rxkB/s的值,即为收带宽的值,取5次测试结果取平均值。

网络(UDP)

性能指标:测试网络转发性能、抖动、传输速率

测试工具:iperf3 qperf

代码语言:javascript复制
# iperf3安装
yum install -y iperf3

# qperf安装
yum install -y qperf

测试方法:

Iperf测试方法:

1. S1上安装上安装iperf作为服务器server端,用于接收;

2. C1、C2上安装iperf作为客户client端,用于发送数据;

3. 在不运行应用情况下,C1和C2同时压测S1,测试S1的网络UDP带宽性能;

4. 持续时间为10分钟,取S1收到压力1秒后持续8分钟的带宽平均值;

5. 分别对计算型实例、通用型实例的场景1、2、3,按照64、512、1500、2048字节的吞吐速率进行上述测试;

6. 测试时长每次10分钟,记录S的CPU、网卡利用率。

测试步骤:

1.在服务器端启动server命令:

代码语言:javascript复制
# 使用shell脚本快速启动,脚本内容如下
server:
#!/bin/bash
for i in {5000..5015}
do
    echo $i
    iperf3 -s -p $i >/dev/null 2>&1 &
done

2.客户端发起client测试命令(与server端的port数匹配):

代码语言:javascript复制
client1:
#!/bin/bash
size=$1
for i in {5000..5007}
do
    echo $i
    iperf3 -c <server端ip> -b 0M -u -t 600 -l $size -p $i -i 0 &
done
client2:
#!/bin/bash
size=$1
for i in {5008..5015}
do
    echo $i
    iperf3 -c <server端ip> -b 0M -u -t 600 -l $size -p $i -i 0 &
done
# 注:iperf3 -b参数表示客户端发包限速,-b 0M,表示不做限速。实测时发现丢包很严重,原因是server端来不及处理client端发的包。这里可以调整-b 的参数观察不丢包时候客户端限制应该是多少。

参数备注:

P: 要运行的并行客户端流的数量,服务器关闭之前保持的连接数,一般等于网卡队列数。默认是0,这意味着永远接受连接。客户端专用选项 b: 可选,以比特/秒为单位的目标带宽(0 表示无限制)(UDP 默认 1 Mbit/sec,TCP 无限制) t: 单次运行时长(默认10秒) J: 结果以json格式输出 R: 反向测试模式——服务器发送,客户端接收 f: 选择输出bandwidth单位 指定打印带宽数字的格式的字母。 支持的格式是 'k' = 千字节/秒 'K' = 千字节/秒 'm' = Mbits/sec 'M' = MBytes/sec 自适应格式可根据需要在千和兆之间进行选择。

Iperf结果示例:

Qperf测试方法:

  1. 在iperf压测基础上进行qperf测试;

S服务端:

代码语言:javascript复制
qperf

C客户端:

代码语言:javascript复制
qperf <server端ip> -m $size -vu tcp_bw tcp_lat udp_bw udp_lat
# 注:qperf 客户端 -m 指定的包大小,可以和iperf -l 参数中指定的包大小一致

记录结果:tcp带宽、延迟,udp带宽、延迟;

Qperf结果示例:

磁盘测试

性能指标:测试磁盘吞吐量

测试工具:sysbench

安装命令:

代码语言:javascript复制
yum -y install sysbench

测试命令:

代码语言:javascript复制
sysbench /usr/share/sysbench/oltp_read_write.lua  --db-driver=mysql --mysql-host=<数据库所在ip>  --mysql-port=3306 --mysql-user= --mysql-password=  --mysql-db=sbtest1 --tables=1 --table-size=20000000 --threads=64    --events=2000000000 --report-interval=10 --rand-type=uniform --time=100 --percentile=95 run

参数说明

代码语言:javascript复制
--db-driver=数据库引擎指定
--mysql-host=被访问数据库的ip地址
--mysql-user=访问此数据库的用户名
--mysql-password=********
--mysql-db=被访问的db
--tables=创建表的个数
--table-size=单个表的数据量条数
--threads=访问数据库的线程数
--events=限制最大请求数,0表示不限制
--report-interval=每隔几秒报告一次结果,0表示禁用间隔报告
--rand-type=表示随机类型为固定模式
--time=限制最长执行时间,0表示不限制
--percentile=表示设定采样比例,默认是 95%,即丢弃5%的长请求

测试结果:

指标说明:

结果数据指标:

  • avg:平均响应时间
  • max:最大响应时间
  • 95percentile: 响应时间95分位数,分位数为可变参数
  • transaction: 每秒事务数
  • read/write requests: 每秒请求数

过程数据指标:

  • QPS:每秒查询数
  • TPS:每秒事务数
  • rtt:每秒响应时间95分位

业务测试

Mysql测试

性能指标:测试数据库TPS、QPS、平均响应时间和95分位时间,同时关注其测试过程中的cpu和磁盘使用情况

测试工具:sysbench

安装命令:

代码语言:javascript复制
yum -y install sysbench

测试命令:

代码语言:javascript复制
sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=<数据库所在ip> --mysql-port=3306 --mysql-user=root --mysql-password=test --mysql-db=sysbench1 --tables=1 --table-size=20000000 --threads=8 --events=2000000000 --report-interval=10 --rand-type=uniform --time=100 --percentile=95 run

参数说明:

代码语言:javascript复制
--db-driver=数据库引擎指定
--mysql-host=被访问数据库的ip地址
--mysql-user=访问此数据库的用户名
--mysql-password=********
--mysql-db=被访问的db
--tables=创建表的个数
--table-size=单个表的数据量条数
--threads=访问数据库的线程数
--events=限制最大请求数,0表示不限制
--report-interval=每隔几秒报告一次结果,0表示禁用间隔报告
--rand-type=表示随机类型为固定模式
--time=限制最长执行时间,0表示不限制
--percentile=表示设定采样比例,默认是 95%,即丢弃5%的长请求

测试结果:

指标说明:

结果数据指标:

  • avg:平均响应时间
  • max:最大响应时间
  • 95percentile: 响应时间95分位数,分位数为可变参数
  • transaction: 每秒事务数
  • read/write requests: 每秒请求数

过程数据指标:

  • QPS:每秒查询数
  • TPS:每秒事务数
  • rtt:每秒响应时间95分位

Redis测试

性能指标:测试redis在set和get请求下的OPS、平均响应时间和每秒写入数据大小,同时关注其测试过程中的cpu、内存和带宽使用情况

测试工具:memtier_benchmark

安装命令:

代码语言:javascript复制
1. 安装编译环境和依赖包
## 安装编译环境
yum install -y autoconf automake make gcc-c  
## 安装依赖包
yum install -y pcre-devel zlib-devel libmemcached-devel wget git

2. 编译安装libevent
cd /root
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar xvzf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable
./configure
make && make install

3. 更新库文件配置
echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}" >> /etc/profile
source /etc/profile
ldconfig /usr/local/lib

4. 编译安装memtier_benchmark工具
cd /root
git clone https://github.com/RedisLabs/memtier_benchmark.git
cd memtier_benchmark
autoreconf -ivf
./configure --prefix=/usr/local/memtier
make && make install
echo "export PATH=/usr/local/memtier/bin:${PATH}" >> /etc/profile
source /etc/profile

5. 验证安装
memtier_benchmark --help

测试命令:

Standalone(单机):

代码语言:javascript复制
memtier_benchmark -s 127.0.0.1 -p 6379  -t 4 -c 50 -R -a 123456 --ratio=1:10 --test-time=20 --select-db=0 --hide-histogram -x 3 --expiry-range=60-90 --data-size-range=8-512 --data-size-pattern=R --out-file=/root/single.log

Cluster(集群):

代码语言:javascript复制
memtier_benchmark -s 127.0.0.1 -p 6379 --cluster-mode -t 4 -c 50 -R -a 123456 --ratio=1:10 --test-time=20 --select-db=0 --hide-histogram -x 3 --expiry-range=60-90 --data-size-range=8-512 --data-size-pattern=R --out-file=/root/rc.log

参数说明:

选项

说明

-s

Redis数据库的连接地址

-p

Redis数据库的连接端口

-t

测试中使用的线程数(默认值为4)

-c

测试中模拟连接的客户端数量(默认值为50)

-R

基准测试将会使用随机化的测试数据

-a

Redis数据库的密码

--ratio

SET和GET操作的比率(默认值为1:10)

--test-time

测试时长(单位:秒)

--select-db

测试使用的DB数量

--hide-histogram

不输出详细的延迟柱状图

-x

完整测试的迭代执行次数

--expiry-range

测试键的过期时间是一个随机值,这个随机值在指定的范围之内

--data-size-range

基准测试使用的测试数据的大小是随机的,数据大小在指定的范围之内(min-max)

--data-size-pattern

当这个选项设置为R时,就需要和--data-size-range选项一起使用,测试数据的大小将会在指定的范围之内随机取值。当这个选项设置为S时,定义的测试数据大小将会在测试键的范围之内均匀分布,请参考--key-maximum选项。默认值为R

--out-file

输出结果文件的名称(默认值为stdout)

--cluster-mode

在集群模式下运行客户端

测试结果:

0 人点赞