云服务器基准测试
测试说明:基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试;云服务器基准测试主要是相同软件版本下不同硬件的性能对比测试。
测试工具:
网络性能测试
带宽性能(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测试方法:
- 在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 | 在集群模式下运行客户端 |
测试结果: