测试环境:
硬件: 阿里云ECS主机. 配置: 1核1G, 4核4G, 8核8G,
系统: Ubuntu 18.04.2 LTS (与线上环境统一系统版本)
基准测试(1核 1G):
测试组件 | 连接数 | QPS | 响应时间 |
---|---|---|---|
kong | 1万 | 7500 | 2s |
kong + redis | 1万 | 3326 | 5s |
kong + redis | 2万 | 2000 | 7s |
使用1万并发对不同插件进行压力测试:
插件名 | QPS | 平均响应时间 | 总请求数 | 失败请求数 |
---|---|---|---|---|
login**(请求 urs 后端服务)** | 1324 | 6.48s | 39836 | 34869 |
login | 1351 | 5.91s | 27165 | 0 |
request-check | 1057 | 7.38s | 21265 | 0 |
login-check | 863 | 8.44s | 17339 | 0 |
refresh-token | 1549 | 5.63s | 29433 | 0 |
heartbeat | 2934 | 3.03s | 58959 | 0 |
i18n | 6133 | 1.54s | 123221 | 0 |
logout | 1348 | 6.30s | 41019 | 0 |
使用1万并发对不同机器配置进行压力测试:
登录态:
插件名 | 硬件配置 | QPS | 平均响应时间 | 成功请求数 |
---|---|---|---|---|
login | 1核 1G | 1351 | 5.91s | 27165 |
login | 4核 4G | 6231 | 1.58s | 184343 |
login | 8核 8G | 9292 | 1.05s | 279506 |
非登录态:
插件名 | 硬件配置 | QPS | 平均响应时间 | 成功请求数 |
---|---|---|---|---|
login | 1核 1G | 910 | 8.65s | 18293 |
login | 4核 4G | 3025 | 3.09s | 91061 |
login | 8核 8G | 6406 | 1.51s | 192840 |
heartbeat | 1核 1G | 2934 | 3.03s | 58959 |
heartbeat | 4核 4G | 12826 | 765.24ms | 386095 |
heartbeat | 8核 8G | 21285 | 465.81ms | 640638 |
压测过程暴露出的问题及处理:
Login 插件压测发现的问题:
问题一、登录插件读取Postgresql 中 app 配置并保存到 Redis,在高并发情况下大量请求会穿透redis, 打到数据库中压垮Postgresql。
解决:在查询数据库代码前, 加入Mutex互斥锁, 防止并发请求穿透redis到数据库查询数据。
问题二、插件中有大量日志记录操作,在高并发情况下会发生大量磁盘IO, 导致QPS一直上不去.
解决: 对日志记录进行分级,调试日志设为 INFO Level, 错误日志设为 ERR Level, 平时只记录ERR级日志, 减少日志磁盘IO. 有需要时再打开 INFO 级日志。
问题三、当有大量并发请求使用同一账户时,用于保存session数据的redis key 会被撑爆, 在 Redis 进行 zrange 操作时, 发生 OOM kill, 导致 Redis server 进程被系统Kill 掉, 从火焰图可看出问题出在互踢函数中.
![](/home/junsheng/Pictures/2019-07-03 15-59-26 的屏幕截图.png)
解决:对登录插件进行限流处理, 同一IP访问登录接口时,限制1分钟内的请求次数.
Request-check 压测发现的问题:
问题一: 用1万并发压测Request-check插件时, 出现大量 upstream prematurely closed connection while reading response header from upstream 错误。
解决:将nginx与php-fpm的通信由 tcp 改为 unix socket.
KONG的网关本身:
问题:在网关背后的服务响应缓慢时, 并发高时, 会出现很多超时错误, 此时, KONG直接返回一段错误信息, 与正常时返回JSON字符串的响应方式不一致。
解决: 修改kong的错误Handle. 网关错误码设计时预留了 2000 以下的错误码作为保留错误码, 此处是否应该使用这些保留错误码?
插件性能优化:
i18n国际化插件优化: 将 xxx.mo 国际化二进制内容保存到kong的一级缓存中,避免大量的读取文件磁盘IO, 性能提升 1000 QPS。
login插件优化:对 openresty http 方法,加入超时机制并启用HTTP连接池。
login check插件优化:日志记录进行分级, 正常运行只记录ERR级日志。