V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cs3230524
V2EX  ›  Node.js

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

  •  
  •   cs3230524 · 2022-10-16 01:28:41 +08:00 · 5962 次点击
    这是一个创建于 798 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    21 条回复    2022-10-21 20:52:49 +08:00
    liuhan907
        1
    liuhan907  
       2022-10-16 01:43:24 +08:00
    横向扩展不能增加吞吐先观察一下流量是否正确分发了,其次考虑是否有全局单点,比如缓存和数据库等。以上都没问题那就本地开发环境开 profiling 观察热点和瓶颈。
    cs3230524
        2
    cs3230524  
    OP
       2022-10-16 02:03:00 +08:00
    @liuhan907 测试接口未访问任何服务,直接返回 null ,感觉是吞吐量不够。
    cs3230524
        3
    cs3230524  
    OP
       2022-10-16 02:03:42 +08:00
    开发环境复现不了问题
    blackboom
        4
    blackboom  
       2022-10-16 02:45:32 +08:00 via iPhone
    LB 是不是有问题
    akira
        5
    akira  
       2022-10-16 05:59:43 +08:00
    前端负载均衡是啥 是不是那里就挂了
    des
        6
    des  
       2022-10-16 08:11:39 +08:00 via iPhone
    系统负载情况呢?试试不用 docker 或者用 network host ?
    lairdnote
        7
    lairdnote  
       2022-10-16 09:06:50 +08:00
    加链路跟踪 。上线都不测试吗?
    foam
        8
    foam  
       2022-10-16 09:31:21 +08:00 via Android
    容器内也对 localhost 跑下压测,先诊断 pod 内部有没有问题。若吞吐量符合正向预期再向前排查链路,网关,lb ,带宽等
    Harry
        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

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

    [1] https://www.cnblogs.com/wx170119/p/12068005.html
    seliote
        11
    seliote  
       2022-10-16 09:46:45 +08:00
    一楼说的挺对的,链路追踪一下看到底从哪到哪了,怀疑并没有正确分发
    winglight2016
        12
    winglight2016  
       2022-10-16 09:47:18 +08:00
    看起来像是请求的服务器端使用了阻塞式处理,不过我不了解 nestjs 。lz 试一下在 k8s 搭一个 nginx 的 lb 服务,看看能不能处理 1w 以上的并发,如果可以,说明你的 service 配置不对,如果不行,那就是 k8s 有问题了。
    wangritian
        13
    wangritian  
       2022-10-16 09:47:37 +08:00
    你在容器内都卡顿,看上去不像 k8s 的锅(也许是 pod 设置限制了 cpu ),单拉出来一台低配物理机调试吧
    joApioVVx4M4X6Rf
        14
    joApioVVx4M4X6Rf  
       2022-10-17 08:18:21 +08:00
    楼主解决了吗,快来总结一下
    lazyfighter
        15
    lazyfighter  
       2022-10-17 09:30:34 +08:00
    上面都在说啥, 一个空方法返回都会 10s , 还上链路追踪,还加缓存,背八股文也得看实际场景呀, 猜测线程池的问题,不懂 nestjs7 , 但是猜测类似于 tomcat 的线程池, 楼主用的默认配置
    NeoZephyr
        16
    NeoZephyr  
       2022-10-17 10:17:12 +08:00
    不了解你的那个,你写一个 go server 丢上去,看看并发能到多少
    NeoZephyr
        17
    NeoZephyr  
       2022-10-17 10:20:55 +08:00
    @Harry 我之前遇到一个问题就是 nginx 的连接没有保持,keepalive_timeout
    bthulu
        18
    bthulu  
       2022-10-17 14:07:30 +08:00
    nestjs 非 io 操作只有一个线程在处理, 你开多大机器规格他都只有一个线程在干活.
    你看看 cpu 占用, 如果有一个核心占用一直在 80%以上, 那不用想了, 就是 cpu 忙不过来了.
    Seulgi
        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 看流量或者自己加加日志统计.
    cs3230524
        20
    cs3230524  
    OP
       2022-10-21 20:35:32 +08:00
    @v2exblog
    对方运维不配合,没办法排查。
    升级了下 fastify 能抗到 2000 多 TPS ,后续流量也变小了就没管了
    joApioVVx4M4X6Rf
        21
    joApioVVx4M4X6Rf  
       2022-10-21 20:52:49 +08:00
    @cs3230524 难过,当场失去绝佳提高自身经验的机会
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:55 · PVG 13:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.