性能测试
测试代码
https://github.com/litongjava/netty-boot-web-hello
package com.litongjava.study.netty.boot.handler;
import com.litongjava.model.body.RespBodyVo;
import com.litongjava.netty.boot.utils.HttpRequestUtils;
import com.litongjava.netty.boot.utils.HttpResponseUtils;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
public class OkHandler {
public FullHttpResponse txt(ChannelHandlerContext ctx, FullHttpRequest httpRequest) throws Exception {
String responseContent = "Hello, this is the HTTP response!";
return HttpResponseUtils.txt(responseContent);
}
public FullHttpResponse json(ChannelHandlerContext ctx, FullHttpRequest httpRequest) throws Exception {
RespBodyVo ok = RespBodyVo.ok();
return HttpResponseUtils.json(ok);
}
public FullHttpResponse echo(ChannelHandlerContext ctx, FullHttpRequest httpRequest) {
String fullHttpRequestString = HttpRequestUtils.getFullHttpRequestAsString(httpRequest);
return HttpResponseUtils.txt(fullHttpRequestString);
}
}
package com.litongjava.study.netty.boot.config;
import java.util.function.Supplier;
import com.litongjava.annotation.AConfiguration;
import com.litongjava.annotation.Initialization;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.netty.boot.http.HttpRequestRouter;
import com.litongjava.netty.boot.server.NettyBootServer;
import com.litongjava.netty.boot.websocket.WebsocketRouter;
import com.litongjava.study.netty.boot.handler.OkHandler;
import com.litongjava.study.netty.boot.handler.Ws2Handler;
import com.litongjava.study.netty.boot.handler.WsHandler;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
@AConfiguration
public class WebConfig {
@Initialization
public void config() {
// 设置 HTTP 路由
HttpRequestRouter httpRouter = NettyBootServer.me().getHttpRequestRouter();
OkHandler okHandler = Aop.get(OkHandler.class);
httpRouter.add("/txt", okHandler::txt);
httpRouter.add("/json", okHandler::json);
httpRouter.add("/echo", okHandler::echo);
// 设置 WebSocket 路由
WebsocketRouter websocketRouter = NettyBootServer.me().getWebsocketRouter();
Supplier<SimpleChannelInboundHandler<WebSocketFrame>> wsHandlerSupplier = WsHandler::new;
websocketRouter.add("/ws", wsHandlerSupplier);
websocketRouter.add("/ws2", Ws2Handler::new);
}
}
测试报告
root@ping-Inspiron-3458:~# ab -c1000 -n10000000 http://localhost/im/json
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000000 requests
Completed 2000000 requests
Completed 3000000 requests
Completed 4000000 requests
Completed 5000000 requests
Completed 6000000 requests
Completed 7000000 requests
Completed 8000000 requests
Completed 9000000 requests
Completed 10000000 requests
Finished 10000000 requests
Server Software:
Server Hostname: localhost
Server Port: 80
Document Path: /im/json
Document Length: 43 bytes
Concurrency Level: 1000
Time taken for tests: 1080.087 seconds
Complete requests: 10000000
Failed requests: 0
Total transferred: 1090000000 bytes
HTML transferred: 430000000 bytes
Requests per second: 9258.52 [#/sec] (mean)
Time per request: 108.009 [ms] (mean)
Time per request: 0.108 [ms] (mean, across all concurrent requests)
Transfer rate: 985.53 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 51 7.7 50 206
Processing: 12 57 13.3 55 651
Waiting: 8 42 13.2 40 651
Total: 63 108 12.4 106 674
Percentage of the requests served within a certain time (ms)
50% 106
66% 109
75% 111
80% 113
90% 119
95% 125
98% 134
99% 142
100% 674 (longest request)
报告分析
该报告显示了通过 ApacheBench 工具对一个在本地运行的 HTTP 服务 (http://localhost/im/json
) 的压力测试结果。以下是对报告中各项数据的具体分析:
测试概要
- 并发水平 (Concurrency Level): 1000。模拟了 1000 个并发请求,测试了系统在高并发负载下的性能。
- 总请求数 (Total requests): 10,000,000。测试总共发送了 1000 万次请求。
- 测试持续时间 (Time taken for tests): 1080.087 秒。完成所有请求所用的总时间。
- 无失败请求 (Failed requests): 0。没有失败请求,表明服务在并发压力下的稳定性良好。
- 总传输字节数 (Total transferred): 1,090,000,000 字节(约 1GB)。包括 HTTP 头部和响应正文的数据量。
- HTML 传输字节数 (HTML transferred): 430,000,000 字节。具体的文档数据传输量。
请求处理效率
- 每秒请求数 (Requests per second): 9258.52 [#/sec]。服务每秒处理的请求数(RPS),这是对系统处理能力的重要指标。
- 平均每个请求的时间 (Time per request): 108.009 毫秒(mean),即从请求发送到接收响应的平均时间。
- 平均每个请求的时间(并发请求下): 0.108 毫秒(mean, across all concurrent requests)。这是所有并发请求的总体平均时间。
数据传输效率
- 传输速率 (Transfer rate): 985.53 KB/秒。数据在传输过程中的速度。
连接时间统计 (Connection Times)
每个请求的不同阶段的时间分布:
- 最小连接时间 (min): 0 毫秒
- 平均连接时间 (mean): 51 毫秒
- 连接时间标准差 (±sd): 7.7 毫秒
- 中位数连接时间 (median): 50 毫秒
- 最大连接时间 (max): 206 毫秒
请求处理时间:
- 平均处理时间: 57 毫秒
- 等待时间: 42 毫秒(指从请求发送到收到响应的等待时间)
总时间: 从请求发出到接收响应的总时间(平均值为 108 毫秒)
百分比分布 (Percentage Distribution)
报告的百分比分布描述了不同百分比请求的响应时间:
- 50% 请求的响应时间小于 106 ms。
- 90% 请求的响应时间小于 119 ms。
- 99% 请求的响应时间小于 142 ms。
- 100% 请求的响应时间小于 674 ms(最慢的请求)。
这表明在绝大多数情况下,系统可以在 120 毫秒内响应请求,但极少数情况下的响应时间会略高。
综合分析
- 并发性能优秀: 该系统能够在高并发情况下每秒处理超过 9000 个请求,并且没有出现失败请求。
- 响应时间较稳定: 从百分比分布中可以看出,大多数请求的响应时间保持在 120 毫秒以下。
- 适合大规模应用: 在数据传输和高并发测试下,系统表现出良好的稳定性和高效性,适用于需要快速响应的应用场景。。