服务器压力测试
服务器压力测试
测试机(云服务器)
- 配置:CPU(4 核 )、内存(8GB)
- 安全组:允许所有
ip,连接服务器固定端口port CPU利用率:- 总利用率:
200% - 单
CPU利用率:50%
- 总利用率:
发家机(本地主机)
测试工具:Jmeter
配置:CPU(6 核)、内存(16GB)
测试选项
- ThreadGroup
- 线程数:表示启动多少个用户;
Ramp-Up:启动所有线程的时间;- 循环次数:每个用户执行多少次配置的请求;
- 调度器:所有线程都到达后,持续的时间;
- HTTP 属性:
- 方法:Get
- 地址:8.137.169.217:8081
- URL:/sylar/xx 和 /
- 连接超时:3s
- 响应超时:10s
- ThreadGroup
阶段测试
- 协程服务器
- 打开日志
- 1000 线程

- 2000 线程

- 5000 线程

- 10000 线程

- 1000 线程
- 关日志
1000 线程

2000 线程

- 打开日志
muduo网络库- 1000 线程

- 1000 线程
- 协程服务器
思路解析
针对 开日志 的情况下:
1000线程的吞吐量大概是2700/sec,平均响应时间是301 ms,错误率是0。这说明系统现在是 健康的。
2000线程的吞吐量大概是2863.9/sec,平均响应时间增加到607 ms,错误率依旧是0。吞吐只比
1000线程多了一点,但延迟几乎翻倍。说明系统已经开始接近瓶颈。5000线程的吞吐量大概是2804.1/sec,平均响应到达了明显的1324 ms,错误率仍然为 0。吞吐没继续涨,反而下降,说明已经进入排队区了
10000线程的吞吐量大概是3111.7/sec,平均响应到达了惊人的2211ms,错误率到达了11.91%。这里表面吞吐变高了,但这是 “带错误” 的吞吐。
成功吞吐量:
3111.7 × (1 - 11.91%) ≈ 2741 req/s。10000线程并没有真正提升有效处理能力,只是把系统压进了高延迟、高失败的失稳区。
结论
协程服务器在开日志场景下:
- 最佳稳定区间:大约
1000~2000线程; - 稳定吞吐上限:大约
2800req/s; 5000线程后:主要是在排队,不是在提升处理能力;10000线程:已经超过稳定承载能力;
针对 关日志 的情况下:
1000线程的吞吐量:3461/sec,平均响应时间:241 ms,中位数:21ms,错误率:0.79%,P99:7099 ms;
和 “开日志,1000 线程” 相比:
- 优点
- 吞吐量:
2741 → 3461,提升约26.3%; - 平均响应:
301ms → 241ms,下降约20%; - 意义:
- 日志确实是当前系统里的一个重开销点。
- 吞吐量:
- 缺点
- 中位数只有
21ms - 但
P95到了895 ms P99到了7099 ms- 还有
0.79%错误率 - 意义:
- 系统不是 “整体都慢”,而是 大多数请求很快,但有一小部分请求会突然卡很久,甚至失败。
- 问题可能存在的点:
- 每个线程的负载不均;
- 出现了
CPU计算型任务;
- 中位数只有
muduo 网络库对比
使用 关日志的协程服务器 对比:
- 吞吐量更高:
3461 > 3055 - 平均响应更低:
241 < 270 - 中位数更低:
21 < 50 - 但错误率更高:
0.79% > 0.09% P99更差:7099 > 2369
这表明:“协程服务器主路径性能” 上已经不弱 muduo,甚至在 吞吐 和平均响应 上超过了 muduo;但在 高压下 的 尾延迟控制 和 稳定性 上,muduo 还是更稳。
- 框架主路径优化具有有潜力;
- 但高并发下的协程调度、公平性、排队控制、超时控制 还要加强;
框架优势及使用场景
优势场景
- 高并发、
IO密集、等待时间长的业务- 相关场景:
- 大量连接长期在线,但大部分时间都在等事件;
- 需要频繁访问
Redis/MySQL/HTTP上游的服务返回;
- 原因:
- 一个请求里会有很多 “等” 的时间,比如等
socket可读、等定时器、等上游返回; - 协程可以在 等待时 主动让出执行权,并且 同一个线程能挂很多个协程,不需要一个连接绑一个线程
- 一个请求里会有很多 “等” 的时间,比如等
- 相关场景:
- 业务流程比较复杂、串行步骤很多 的场景
- 相关场景:
- 比如一个请求要做:解析请求、查缓存、缓存没有则查数据库、调另一个
HTTP服务、然后拼装响应; - 原因:
- 代码可以写得像同步逻辑一样;
- 调用链更直;
- 业务越复杂、链路越长、等待点越多,协程风格越容易体现优势。
- 比如一个请求要做:解析请求、查缓存、缓存没有则查数据库、调另一个
- 相关场景:
劣势场景
CPU密集型业务- 相关场景:
- 大量计算
- 编解码
- 加解密
- 复杂算法
- 原因:
CPU拉满时,协程不会让算力变多,一个线程还是只会执行这一个任务;- 这种场景下,真正关键的是:利用多核的优势,将任务拆分,使用线程池策略;
- 相关场景:
- 纯网络收发
- 相关场景:
echo server- 简单
HTTP静态返回
- 原因:
- 因为这类 请求链路 更短,几乎没有大量的 阻塞等待点,主要工作就是 “收包、处理、回包”。
- 此时,协程调度、上下文切换、
hook机制以及额外的运行时管理,反而会带来一定开销。 muduo这类基于Reactor模型的网络库路径更短,整体实现也更加直接,通常能够获得更稳定的尾延迟表现。
- 相关场景:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 GYu的妙妙屋!
