线上项目并发问题,深夜在线求救

2022-10-16 01:28:41 +08:00
 cs3230524

环境 v14.x 框架 nestjs7 devops:k8s+docker

问题:并发不多的情况下 rt 高 复现:写一个接口不做任何操作直接返回,内网 1000 并发都要 2s 了,2000 并发的情况下,50%的接口 rt 就超过 10s 了。在这种情况出现的时候去容器内部 curl localhost 也会出现卡顿。通过增加 pod 并不能改善这个情况,感觉 4c8g 规格的一个实例和 10 个实例压测下来负载是一样的并没有增加。

所以,是我的写法有问题吗?如果不是有可能是 k8s 环境配置吗?跪求,要死了。

5910 次点击
所在节点    Node.js
21 条回复
liuhan907
2022-10-16 01:43:24 +08:00
横向扩展不能增加吞吐先观察一下流量是否正确分发了,其次考虑是否有全局单点,比如缓存和数据库等。以上都没问题那就本地开发环境开 profiling 观察热点和瓶颈。
cs3230524
2022-10-16 02:03:00 +08:00
@liuhan907 测试接口未访问任何服务,直接返回 null ,感觉是吞吐量不够。
cs3230524
2022-10-16 02:03:42 +08:00
开发环境复现不了问题
blackboom
2022-10-16 02:45:32 +08:00
LB 是不是有问题
akira
2022-10-16 05:59:43 +08:00
前端负载均衡是啥 是不是那里就挂了
des
2022-10-16 08:11:39 +08:00
系统负载情况呢?试试不用 docker 或者用 network host ?
lairdnote
2022-10-16 09:06:50 +08:00
加链路跟踪 。上线都不测试吗?
foam
2022-10-16 09:31:21 +08:00
容器内也对 localhost 跑下压测,先诊断 pod 内部有没有问题。若吞吐量符合正向预期再向前排查链路,网关,lb ,带宽等
Harry
2022-10-16 09:39:41 +08:00
按照之前都历史经验,这个是 Linux 服务上,TCP 相关的参数没有调整。因为这个参数有限制,所以并发低都时候 RT 也不高( 1000 的并发),并发高( 2000 并发)的时候 RT 和 成功率够不高。

你按照这两个帖子的思路处理这个 RT 和成功率就会上来了:
[1] https://cloud.tencent.com/developer/article/1521303
[2] https://netkiller.sourceforge.net/testing/performance/stress.html

(这两个链接是我按照关键字搜索的,你照着参考,把你的机器参数改大就行了)
Harry
2022-10-16 09:44:22 +08:00
具体的原理上,你参考一下这个文章[1]。十有八九的类似的性能问题都是出现在这里的。

[1] https://www.cnblogs.com/wx170119/p/12068005.html
seliote
2022-10-16 09:46:45 +08:00
一楼说的挺对的,链路追踪一下看到底从哪到哪了,怀疑并没有正确分发
winglight2016
2022-10-16 09:47:18 +08:00
看起来像是请求的服务器端使用了阻塞式处理,不过我不了解 nestjs 。lz 试一下在 k8s 搭一个 nginx 的 lb 服务,看看能不能处理 1w 以上的并发,如果可以,说明你的 service 配置不对,如果不行,那就是 k8s 有问题了。
wangritian
2022-10-16 09:47:37 +08:00
你在容器内都卡顿,看上去不像 k8s 的锅(也许是 pod 设置限制了 cpu ),单拉出来一台低配物理机调试吧
joApioVVx4M4X6Rf
2022-10-17 08:18:21 +08:00
楼主解决了吗,快来总结一下
lazyfighter
2022-10-17 09:30:34 +08:00
上面都在说啥, 一个空方法返回都会 10s , 还上链路追踪,还加缓存,背八股文也得看实际场景呀, 猜测线程池的问题,不懂 nestjs7 , 但是猜测类似于 tomcat 的线程池, 楼主用的默认配置
NeoZephyr
2022-10-17 10:17:12 +08:00
不了解你的那个,你写一个 go server 丢上去,看看并发能到多少
NeoZephyr
2022-10-17 10:20:55 +08:00
@Harry 我之前遇到一个问题就是 nginx 的连接没有保持,keepalive_timeout
bthulu
2022-10-17 14:07:30 +08:00
nestjs 非 io 操作只有一个线程在处理, 你开多大机器规格他都只有一个线程在干活.
你看看 cpu 占用, 如果有一个核心占用一直在 80%以上, 那不用想了, 就是 cpu 忙不过来了.
Seulgi
2022-10-17 14:19:12 +08:00
1000 并发, rt 要 2s, 这时候多少个 pod, 如果按负载是正常的情况看, 平均下去每个 pod 是多少请求. 按你 2000 并发看, 2000/10 个 pod,每个 pod 是 200, 大概率是 nestjs 的线程问题. Tomcat 默认线程也就 200. 负载情况可以通过 k8s 看流量或者自己加加日志统计.
cs3230524
2022-10-21 20:35:32 +08:00
@v2exblog
对方运维不配合,没办法排查。
升级了下 fastify 能抗到 2000 多 TPS ,后续流量也变小了就没管了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/887220

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX