V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yestodayHadRain
V2EX  ›  问与答

大家平时是怎么做压力测试的?

  •  1
     
  •   yestodayHadRain · 2018-12-11 09:19:49 +08:00 · 4350 次点击
    这是一个创建于 2166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周项目在线上使用的时候发生了个问题,一两秒内 300 个并发时服务器就死掉了,tomcat 没有崩溃但是就是请求没有响应不知道为什么?昨天用 jmeter 尝试复现,由于之前没有 jmeter 做过压力测试用,不知道是不是配置的不对,500 个并发服务都没有事情,最后和同事对接了下才发现压错了接口,崩溃的接口对数据库读写比较多所以死掉了,后来去压那个接口发现果然抗住不,看了下数据库连接池发现竟然是 c3p0,后来果断改成了 druid 然后就没事了.

    关于这件事让我产生了一个疑问,做压力测试时如何根据测试的情况来推断出服务器在线上能抗住多少的并发呢?

    25 条回复    2018-12-14 13:50:38 +08:00
    yestodayHadRain
        1
    yestodayHadRain  
    OP
       2018-12-11 09:21:31 +08:00
    补充一下,项目是传统项目平时用户量比较少只有特殊的情况下才会有几百年的并发,另外线上使用的时候是直接部署在 win 上面的,虽然我也想部署在 linux 上但是公司是这样要求的,最后的最后 代码不是我写的......
    hflyf123
        3
    hflyf123  
       2018-12-11 09:23:33 +08:00
    压力测试目的是在软件投入使用以前或软件负载达到极限以前,通过执行可重复的负载测试,了解系统可靠性、性能瓶颈等,以提高软件系统的可靠性、稳定性,减少系统的宕机时间和因此带来的损失(压到崩为止)
    SoulSleep
        4
    SoulSleep  
       2018-12-11 09:27:26 +08:00
    看了下数据库连接池发现竟然是 c3p0,后来果断改成了 druid 然后就没事了.

    替 c3p0 伸冤,这锅我不背,是你不会用
    然后 druid 也有 bug 1.0.10 版本之前,不告诉你,等你踩坑。。。昂~
    yestodayHadRain
        5
    yestodayHadRain  
    OP
       2018-12-11 09:33:51 +08:00
    @SoulSleep 那麻烦大佬告诉我下 c3p0 的正确使用姿势 还有 druid 的 bug
    yestodayHadRain
        6
    yestodayHadRain  
    OP
       2018-12-11 09:34:34 +08:00
    @SoulSleep 这个坑踩的成本太高了,万一以后线上在出问题了,就是我的锅了,会影响好多人的
    SoulSleep
        7
    SoulSleep  
       2018-12-11 09:39:43 +08:00
    @yestodayHadRain #6 你用最新版本就行了,已经修复了,我们就被坑过,即使我们的数据库做了高可用,但是这个 bug 会导致 druid 的连接异常
    lingll
        8
    lingll  
       2018-12-11 09:41:53 +08:00
    开发兼做测试? 没有专门的测试人员吗?
    luosuosile
        9
    luosuosile  
       2018-12-11 09:49:37 +08:00
    好文收藏
    loveCoding
        10
    loveCoding  
       2018-12-11 09:51:51 +08:00
    那你从 c3p0 换成 druid 连接池参数变化了什么? 还是没有找到导致崩溃的原因啊
    tt67wq
        11
    tt67wq  
       2018-12-11 10:21:33 +08:00
    站在电脑上测试,给它一点压力
    yestodayHadRain
        12
    yestodayHadRain  
    OP
       2018-12-11 11:37:12 +08:00 via Android
    @lingll 公司没有测试,因为我之前做测试的老大就让我搞了,可是我之前没搞过压力测试
    yestodayHadRain
        13
    yestodayHadRain  
    OP
       2018-12-11 11:39:16 +08:00 via Android
    @loveCoding 老大说那天用的时候 tomcat 并没有崩溃,只是卡住了所有请求都是 loading,所以我认为是之前的数据库连接池性能不够好前面的资源还没释放后面排队的就来了,就这样一直堆积最后阻塞了。当然这只是我的猜测,我是个小白
    yestodayHadRain
        14
    yestodayHadRain  
    OP
       2018-12-11 11:42:41 +08:00 via Android
    @SoulSleep 我今天又去压昨天的那个接口,发现有系统异常大致意思是线程池达到了最大,但是把 jmeter 关掉就能正常访问了(用 c3p0 的时候关掉了 jmeter 访问也是一直 loading),能不能分享下你们的 druid 参数设置呢?初始化,最多,最少 只要这三个就成
    saltxy
        15
    saltxy  
       2018-12-11 14:31:30 +08:00
    直接压线上的接口吗?不应该是压测试环境的接口,然后估算线上可承受的压力吗。
    不知道大厂是怎么做的
    yestodayHadRain
        16
    yestodayHadRain  
    OP
       2018-12-11 17:17:18 +08:00
    @saltxy 是在测试环境压的接口,但是用 jmeter 模拟出来的线程和线上真实用户操作还是有区别的,另外我在线下用 jmeter 做压力测试,单机版 tomcat 部署在 win 上面,2000 个线程并发 服务都没事,这样讲就能说 线上单机版 tomcat 能抗住 2000 的并发吗?这样肯定是不合理的
    sagaxu
        17
    sagaxu  
       2018-12-11 17:24:39 +08:00 via Android
    推荐 hikariCP,阿里的开源项目,我是不敢用的。还有那个 fastjson,并不 fast,坑还很多,阿里自己一些项目也不用它。
    yestodayHadRain
        18
    yestodayHadRain  
    OP
       2018-12-11 18:47:43 +08:00 via Android
    @sagaxu 大家好像有些跑题了,title 是关于大家平时是如何做压力测试的,说着说着变成连接池讨论了
    linil
        19
    linil  
       2018-12-11 22:00:13 +08:00 via Android
    我们以前是布了一套和生产差不多的环境。
    另外分布式的情况是测试一台的能力,然后后面不够了就加服务器布置多一个节点,当然前提是确保入口抗得住(如用 Nginx 的话就先测 Nginx 的能力)
    yestodayHadRain
        20
    yestodayHadRain  
    OP
       2018-12-12 08:59:08 +08:00
    @linil 你们做压测的时候是用什么来做的呢?
    linil
        21
    linil  
       2018-12-12 19:17:36 +08:00 via Android
    @yestodayHadRain 你是指工具吗?公司没要求,我是用 JMeter 的。
    yestodayHadRain
        22
    yestodayHadRain  
    OP
       2018-12-12 19:24:42 +08:00 via Android
    @linil 我也用的是 jmeter,但是我开 2000 个线程去压接口,服务没挂,就能说明服务能抗住 2000 的并发吗?而且我用 druid 的监控平台看,虽然是 2000 个线程去压但是接口的最大并发才只有 200 这是为什么呢?
    linil
        23
    linil  
       2018-12-12 19:52:56 +08:00 via Android   ❤️ 1
    @yestodayHadRain 服务没挂代表短时间内抗住了 2000 线程(可认为是 2000 用户),但不代表 2000 并发,而且你看并发看 JMeter 的 TPS 那个值而不是设置的线程数。
    linil
        24
    linil  
       2018-12-13 12:44:30 +08:00 via Android   ❤️ 1
    有点忙,上面匆匆回复了。
    比如你是开了 200 个窗口处理业务,每个窗口一秒可以处理一件业务,也就是最大业务处理速度就是 200TPS。
    现在来了 2000 个客户,这个时候你总的处理速度还是 200TPS 的,其他客户就必须排队,结果导致的是平均每个用户的等待时间变长了(就是响应时间)。
    yestodayHadRain
        25
    yestodayHadRain  
    OP
       2018-12-14 13:50:38 +08:00 via Android
    @linil
    1.我从 jmeter 的聚合报告看并没有看到 TPS 参数,请问这个是算出来的吗?
    2.第二个问题,既然 jmeter 的并发线程数不能够说明系统的最大并发,那么请问如何根据测试数据估算出线上能抗住的最大并发呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1239 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:17 · PVG 02:17 · LAX 10:17 · JFK 13:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.