0%

kong网关压力测试

测试环境:

​ 硬件: 阿里云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级日志。