本次性能测试在正式环境下单台服务器上Kafka处理MQ消息能力进行压力测试。测试包括对Kafka写入MQ消息和消费MQ消息进行压力测试,根据10w、100w和1000w级别的消息处理结果,评估Kafka的处理性能是否满足项目需求。(该项目期望Kafka能够处理上亿级别的MQ消息)
二、测试范围及方法
2.1 测试范围概述
测试使用Kafka自带的测试脚本,通过命令对Kafka发起写入MQ消息和Kafka消费MQ消息的请求。模拟不同数量级的MQ消息写入和MQ消息消费场景,根据Kafka的处理结果,评估Kafka是否满足处理亿级以上的消息的能力。
2.2性能测试场景设计
2.2.1 Kafka写入消息压力测试
| 测试场景 | MQ消息数 | 每秒写入消息数 | 记录大小(单位:字节) |
| Kafka消息写入测试 | 10W | 2000条 | 1000 |
| 10W | 5000条 | 1000 | |
| 100W | 5000条 | 1000 |
2.2.2 Kafka消费消息压力测试
| 测试场景 | 消费MQ消息数 |
| Kafka消息消费测试 | 10W |
| 100W | |
| 1000W |
2.3测试方法简要描述
2.3.1测试目的
验证带台服务器上Kafka写入消息和消费消息的能力,根据测试结果评估当前Kafka集群模式是否满足上亿级别的消息处理能力。
2.3.2测试方法
在服务器上使用Kafka自带的测试脚本,分别模拟10w、100w和1000w的消息写入请求,查看Kafka处理不同数量级的消息数时的处理能力,包括每秒生成消息数、吞吐量、消息延迟时间。Kafka消息吸入创建的topic命名为test_perf,使用命令发起消费该topic的请求,查看Kafka消费不同数量级别的消息时的处理能力。
压测命令信息:
| 测试项 | 压测消息数(单位:W) | 测试命令 |
| 写入MQ消息 | 10 |
./kafka-producer-perf-test.sh --topic test_perf --num-records 100000 --record-size 1000 --throughput 2000 --producer-props bootstrap.servers=10.150.30.60:9092 |
| 100 |
./kafka-producer-perf-test.sh --topic test_perf --num-records 1000000 --record-size 2000 --throughput 5000 --producer-props bootstrap.servers=10.150.30.60:9092 |
|
| 1000 |
./kafka-producer-perf-test.sh --topic test_perf --num-records 10000000 --record-size 2000 --throughput 5000 --producer-props bootstrap.servers=10.150.30.60:9092 |
|
| 消费MQ消息 | 10 |
./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 100000 --threads 1 |
| 100 |
./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 1000000 --threads 1 |
|
| 1000 |
./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 10000000 --threads 1 |
脚本执行目录:服务器上安装Kafka的bin目录;
三、测试环境
3.1 测试环境机器配置表
| 主 机 | 数量 | 资 源 | 操作系统 |
| MQ消息服务/处理 | 1 |
硬件:1(核)-4(G)-40(G) |
ubuntu-16.04.5-server-amd64 |
3.2 测试工具
| Kafka压测工具 | Kafka自带压测脚本 |
3.3 测试环境搭建
这里仅仅使用单机版的kakfa,为了快速搭建,使用自带的zk。
新建目录
mkdir /opt/kafka_server_test
dockerfile
FROM ubuntu:16.04 # 修改更新源为阿里云 ADD sources.list /etc/apt/sources.list ADD kafka_2.12-2.1.0.tgz / # 安装jdk RUN apt-get update && apt-get install -y openjdk-8-jdk --allow-unauthenticated && apt-get clean all EXPOSE 9092 # 添加启动脚本 ADD run.sh . RUN chmod 755 run.sh ENTRYPOINT [ "/run.sh"]
run.sh
#!/bin/bash # 启动自带的zookeeper cd /kafka_2.12-2.1.0 bin/zookeeper-server-start.sh config/zookeeper.properties & # 启动kafka sleep 3 bin/kafka-server-start.sh config/server.properties
sources.list
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu xenial-security main restricted deb http://mirrors.aliyun.com/ubuntu xenial-security universe deb http://mirrors.aliyun.com/ubuntu xenial-security multiverse
目录结构如下:
./ ├── dockerfile ├── kafka_2.12-2.1.0.tgz ├── run.sh └── sources.list
生成镜像
docker build -t kafka_server_test /opt/kafka_server_test
启动kafka
docker run -d -it kafka_server_test
四、测试结果
4.1测试结果说明
本次测试针对Kafka消息处理的能力 进行压力测试,对Kafka集群服务器中的一台进行MQ消息服务的压力测试,关注Kafka消息写入的延迟时间是否满足需求。对Kafka集群服务器中的一台进行MQ消息处理的压力测试,验证Kafka的消息处理能力。
4.2.1写入MQ消息
| 测试项 | 设置消息总数 (单位:w) |
设置单个消息大小 (单位:字节) |
设置每秒发送消息数 | 实际写入消息数/秒 | 95%的消息延迟 (单位:ms) |
| 写入MQ消息 | 10 | 1000 | 2000 | 1999.84 | 1 |
| 100 | 1000 | 5000 | 4999.84 | 1 | |
| 1000 | 1000 | 5000 | 4999.99 | 1 |
压测结果
在上面已经启动了kafka容器,查看进程
root@ubuntu:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ced2eb77349 kafka_server_test "/run.sh" 34 minutes ago Up 34 minutes 0.0.0.0:2181->2181/tcp, 0.0.0.0:9092->9092/tcp youthful_bhaskara
进入kafka的bin目录
root@ubuntu:/opt# docker exec -it 5ced2eb77349 /bin/bash root@5ced2eb77349:/# cd /kafka_2.12-2.1.0/ root@5ced2eb77349:/kafka_2.12-2.1.0# cd bin/
1. 写入10w消息压测结果
执行命令
./kafka-producer-perf-test.sh --topic test_perf --num-records 100000 --record-size 1000 --throughput 2000 --producer-props bootstrap.servers=localhost:9092
输出:
records sent, 1202.4 records/sec (1.15 MB/sec), 1678.8 ms avg latency, 2080.0 max latency. records sent, 2771.8 records/sec (2.64 MB/sec), 1300.4 ms avg latency, 2344.0 max latency. records sent, 2061.6 records/sec (1.97 MB/sec), 17.1 ms avg latency, 188.0 max latency. records sent, 1976.6 records/sec (1.89 MB/sec), 10.0 ms avg latency, 177.0 max latency. records sent, 2025.2 records/sec (1.93 MB/sec), 15.4 ms avg latency, 253.0 max latency. records sent, 2000.8 records/sec (1.91 MB/sec), 6.1 ms avg latency, 163.0 max latency. records sent, 1929.7 records/sec (1.84 MB/sec), 3.7 ms avg latency, 128.0 max latency. records sent, 2072.0 records/sec (1.98 MB/sec), 14.1 ms avg latency, 163.0 max latency. records sent, 2001.6 records/sec (1.91 MB/sec), 4.5 ms avg latency, 116.0 max latency. records sent, 1997.602877 records/sec (1.91 MB/sec), 290.41 ms avg latency, 2344.00 ms max latency, 2 ms 50th, 1992 ms 95th, 2177 ms 99th, 2292 ms 99.9th.