基准场景
基准场景是为了找到系统中明显的配置及软件 Bug
线程数应该如何确定?
压力线程的连续递增的重要性
如何分析
性能场景分类:
验证:评估当前系统容量;针对当前的系统、当前的模型、当前的环境,验证一下版本是否有性能的变化。不性能分析,不调优。
基准场景
容量场景
稳定性场景
异常场景
调优:评估并优化当前系统;针对当前的系统、当前的模型、当前的环境,做性能监控+性能分析+性能调优+调优后的结论
注意:我们所说的结论不仅仅是给出TPS多少,资源消耗多少,而且是应该有业务含义的,比如支持1000万用户在线,支持1万用户并发等
基准场景
容量场景
稳定性场景
异常场景
推算:评估并推算未来系统容量。业务增长模型分析 性能监控+性能分析+性能调优+调优后的结论
基准场景
容量场景
稳定性场景
异常场景
按过程分类:
递增
连续
基准场景:
1. 首先做单接口的基准场景
线程数 = 目标TPS / 单线程稳定TPS = 500TPS/20TPS=25 线程数
注意:我们这里的目标TPS=500TPS是一个经验值,对于一个8C16G的机器,如果是写操作达到500TPS是没问题的,如果是读操作可以达到1000TPS。
duration 场景时间持续放长一点,产生一个明显的连续的递增的过程
总结一下整个思路:
<1>. 先确定单线程运行时的 TPS 值;上面的20TPS
<2>. 根据系统最大的预估容量设置场景中的线程数、递增参数等。强调一下,如果你不会预估容量,可以直接多加一些线程,然后在递增的过程中查看曲线的变化;
<3>. 确定正式基准场景的压力参数。
<4>. 在测试过程中不断地修正。
基准场景的目的:
<1>. 获得单接口最大 TPS:如果单接口最大 TPS 没有超过容量场景中的要求,那就必须要调优。那如果超过了,看能否优化到最高TPS?
<2>. 解决单接口基准场景中遇到的性能问题
遇到性能瓶颈一定要分析,可以分两个阶段
1. 硬件资源用完--CPU/内存/网络/IO等资源中任何一个用尽
2. 优化到最高TPS
分析过程
1. 针对响应时间长的问题,我们首先要做的就是拆分时间。
2. 找到具体慢在哪一步,然后
打印一个完整的栈,看看调用链路,
或者不打印栈,直接连接到Java进程中看看方法消耗时间,工具包括JDB/JvisualVM/Arthas
我们使用Arthas 进行跟踪
trace com.dunshan.mall.auth.controller.AuthController postAccessToken '#cost > 1000' -n 3
trace org.springframework.security.oauth2.provider.endpoint.TokenEndpoint postAccessToken '#cost > 1000' -n 3
trace org.springframework.security.oauth2.provider.token.AbstractTokenGranter getOAuth2Authentication '#cost > 1000' -n 3
trace org.springframework.security.authentication.AuthenticationManager getOAuth2Authentication '#cost > 500' -n 3
trace org.springframework.security.authentication.ProviderManager authenticate '#cost > 500' -n 3
trace org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider authenticate '#cost > 500' -n 3
然后翻到代理看看具体做了啥