环境 v14.x 框架 nestjs7 devops:k8s+docker
问题:并发不多的情况下 rt 高 复现:写一个接口不做任何操作直接返回,内网 1000 并发都要 2s 了,2000 并发的情况下,50%的接口 rt 就超过 10s 了。在这种情况出现的时候去容器内部 curl localhost 也会出现卡顿。通过增加 pod 并不能改善这个情况,感觉 4c8g 规格的一个实例和 10 个实例压测下来负载是一样的并没有增加。
所以,是我的写法有问题吗?如果不是有可能是 k8s 环境配置吗?跪求,要死了。
1
liuhan907 2022-10-16 01:43:24 +08:00
横向扩展不能增加吞吐先观察一下流量是否正确分发了,其次考虑是否有全局单点,比如缓存和数据库等。以上都没问题那就本地开发环境开 profiling 观察热点和瓶颈。
|
3
cs3230524 OP 开发环境复现不了问题
|
4
blackboom 2022-10-16 02:45:32 +08:00 via iPhone
LB 是不是有问题
|
5
akira 2022-10-16 05:59:43 +08:00
前端负载均衡是啥 是不是那里就挂了
|
6
des 2022-10-16 08:11:39 +08:00 via iPhone
系统负载情况呢?试试不用 docker 或者用 network host ?
|
7
lairdnote 2022-10-16 09:06:50 +08:00
加链路跟踪 。上线都不测试吗?
|
8
foam 2022-10-16 09:31:21 +08:00 via Android
容器内也对 localhost 跑下压测,先诊断 pod 内部有没有问题。若吞吐量符合正向预期再向前排查链路,网关,lb ,带宽等
|
9
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 (这两个链接是我按照关键字搜索的,你照着参考,把你的机器参数改大就行了) |
10
Harry 2022-10-16 09:44:22 +08:00
|
11
seliote 2022-10-16 09:46:45 +08:00
一楼说的挺对的,链路追踪一下看到底从哪到哪了,怀疑并没有正确分发
|
12
winglight2016 2022-10-16 09:47:18 +08:00
看起来像是请求的服务器端使用了阻塞式处理,不过我不了解 nestjs 。lz 试一下在 k8s 搭一个 nginx 的 lb 服务,看看能不能处理 1w 以上的并发,如果可以,说明你的 service 配置不对,如果不行,那就是 k8s 有问题了。
|
13
wangritian 2022-10-16 09:47:37 +08:00
你在容器内都卡顿,看上去不像 k8s 的锅(也许是 pod 设置限制了 cpu ),单拉出来一台低配物理机调试吧
|
14
joApioVVx4M4X6Rf 2022-10-17 08:18:21 +08:00
楼主解决了吗,快来总结一下
|
15
lazyfighter 2022-10-17 09:30:34 +08:00
上面都在说啥, 一个空方法返回都会 10s , 还上链路追踪,还加缓存,背八股文也得看实际场景呀, 猜测线程池的问题,不懂 nestjs7 , 但是猜测类似于 tomcat 的线程池, 楼主用的默认配置
|
16
NeoZephyr 2022-10-17 10:17:12 +08:00
不了解你的那个,你写一个 go server 丢上去,看看并发能到多少
|
18
bthulu 2022-10-17 14:07:30 +08:00
nestjs 非 io 操作只有一个线程在处理, 你开多大机器规格他都只有一个线程在干活.
你看看 cpu 占用, 如果有一个核心占用一直在 80%以上, 那不用想了, 就是 cpu 忙不过来了. |
19
Seulgi 2022-10-17 14:19:12 +08:00
1000 并发, rt 要 2s, 这时候多少个 pod, 如果按负载是正常的情况看, 平均下去每个 pod 是多少请求. 按你 2000 并发看, 2000/10 个 pod,每个 pod 是 200, 大概率是 nestjs 的线程问题. Tomcat 默认线程也就 200. 负载情况可以通过 k8s 看流量或者自己加加日志统计.
|
20
cs3230524 OP |
21
joApioVVx4M4X6Rf 2022-10-21 20:52:49 +08:00
@cs3230524 难过,当场失去绝佳提高自身经验的机会
|