当前位置:网站首页>我们被一个 kong 的性能 bug 折腾了一个通宵
我们被一个 kong 的性能 bug 折腾了一个通宵
2022-07-26 15:35:00 【InfoQ】
故事背景
一系列失败的尝试
参数调优
NGINX_WORKER_PROCESSESMEM_CACHE_SIZEDB_UPDATE_FREQUENCYWORKER_STATE_UPDATE_FREQUENCYwork_memshare_buffers清理数据
kong 实例的读写分离
postgres 迁移 RDS
回滚
问题的复现之路
导入数据
psql -h 127.0.0.1 -U kong < kong.sqlcurl -X POST http://10.97.4.116:8001/plugins --data "name=prometheus"现象一
curl http://10.97.4.116:8001
现象二
curl -i -X POST http://10.97.4.116:8001/services/ -d 'name=baidu2' -d 'url=http://www.baidu.com'
curl -i -X POST http://10.97.4.116:8001/services/baidu2/routes \
-d "name=test2" \
-d "paths[1]=/baidu2"curl http://10.97.4.116:8000/baidu2#!/bin/bash
curl -i -X POST http://10.97.4.116:8001/services/ -d 'name=baidu' -d 'url=http://www.baidu.com'
curl -i -X POST http://10.97.4.116:8001/services/baidu/routes \
-d "name=test" \
-d "paths[1]=/baidu"
curl -s http://10.97.4.116:8001/services
curl -i -X DELETE http://10.97.4.116:8001/services/baidu/routes/testfor i in `seq 1 100`; do sh 1.sh ; donecurl http://10.97.4.116:8000/baidu2
伴随现象
- kong 实例的 cpu 跟 mem 都持续上涨,且当 admin 接口调用结束后此现象依然没有结束。mem 上涨到一定程度会到时 nginx worker 进程 oom 掉,然后重启,这个也许是访问慢的原因;
- 我们设置了
KONG_NGINX_WORKER_PROCESSES 为 4,并且为 pod 的内存为 4G 的时候,pod 的整体内存会稳定在 2.3G, 但是 调用 admin 接口试,pod 的内存就会一直上涨至超过 4G,触发 worker 的 OOM,于是我将 pod 的内存调整到了 8G。再次调用 admin 接口,发现 pod 的内存依然一直上涨,只是上涨到了 4.11 G 就结束了,这似乎意味着我们是要设置 pod 的内存为 KONG_NGINX_WORKER_PROCESSES 两倍,这个问题就解决了(但是还有个重要的问题是为什么调用一次 admin 接口,会导致内存涨了那么多);
- 另外,当我持续调用 admin 接口的时候, 最终的内存会持续增长并且稳定到 6.9G。
pmap -x [pid]

结论
- 该问题跟 kong 的升级(0.14 --> 2.2.0) 没有关系,直接使用 2.2.0 版本也会有这个问题;
- kong 每隔
worker_state_update_frequency 时间后会在内存中重建 router,一旦开始重建就会导致 内存上涨,看了下代码问题出在了 Router.new 的方法这里,会申请 lrucache 但是使用后没有 flush_all,根据最新的 2.8.1 版本的 lrucache 进行了释放问题依然存在;
- 也就是 kong 的
Router.new 方法里的其他逻辑到时的内存上涨;

- 这也就表明这个问题是 kong 存在的一个性能 bug,及时在最新的版本中依然存在,当 route 跟 service 达到某个量级的时候会出现调用 admin 接口,导致 kong 的 worker 内存迅速上涨,使得 oom 进而引发业务访问性能变差的现象,临时的解决办法可以是减少
NGINX_WORKER_PROCESSES 的数量并且增加 kong pod 的内存量,保证调用 admin 接口后需要的内存足够使用不触发 oom,才能保证业务的正常使用。
边栏推荐
- Change an ergonomic chair to relieve the old waist of sitting and writing code~
- 示波器的使用
- Using information entropy to construct decision tree
- Teach the big model to skip the "useless" layer and improve the reasoning speed × 3. The performance remains unchanged, and the new method of Google MIT is popular
- 马斯克被曝绿了谷歌创始人:导致挚友二婚破裂,曾下跪求原谅
- [five minute paper] reinforcement learning based on parameterized action space
- FOC电机控制基础
- 北京的大学排名
- 认识JS基础与浏览器引擎
- 使用verdaccio搭建自己的npm私有库
猜你喜欢

Paper:《All Models are Wrong, but Many are Useful: 所有模型都是错误的,但许多模型都是有用的:通过同时研究一整类预测模型来了解变量的重要性》翻译与解读

API 版本控制【 Eolink 翻译】

数仓:爱奇艺数仓平台建设实践

Tool skill learning (II): pre skills shell
![API version control [eolink translation]](/img/3a/8a78e57a2474f33d011d91631fde74.jpg)
API version control [eolink translation]

NAT/NAPT地址转换(内外网通信)技术详解【华为eNSP】

TI C6000 TMS320C6678 DSP+ Zynq-7045的ZYNQ PS + PL异构多核案例开发手册(1)

Continuous integration (I) brief introduction to basic concepts

kalibr标定realsenseD435i --多相机标定

一文搞懂│XSS攻击、SQL注入、CSRF攻击、DDOS攻击、DNS劫持
随机推荐
泰山OFFICE技术讲座:WORD的缩放比例与显示略有差异
promise,async-await 和 跨域问题的解决--代理服务器的原理
FOC motor control foundation
Pytorch installation CUDA corresponding
数据中台、BI业务访谈(四)—— 十个问题看本质
PS + PL heterogeneous multicore case development manual for Ti C6000 tms320c6678 DSP + zynq-7045 (2)
tensorboard多个events文件显示紊乱的解决办法
[dsctf2022] PWN supplementary question record
13年资深开发者分享一年学习Rust经历:从必备书目到代码练习一网打尽
如何将规划图转成带经纬度的矢量数据geojson
马斯克被曝绿了谷歌创始人:导致挚友二婚破裂,曾下跪求原谅
Interview with data center and Bi business (IV) -- look at the essence of ten questions
【LeetCode】33、 搜索旋转排序数组
2022你的安全感是什么?沃尔沃年中问道
数智转型,管理先行|JNPF全力打造“全生命周期管理”平台
单例模式
ROS问题及解决方案——依赖包安装以及无法修正错误
University rankings in Beijing
TI C6000 TMS320C6678 DSP+ Zynq-7045的PS + PL异构多核案例开发手册(4)
企业数字化转型需要深入研究,不能为了转型而转型