1 文章概述
技术系统有一个发展过程,在业务初期主要是实现业务功能和目标,由于数据和访问量都不大,所以性能问题并不作为首要考虑。
但是随着业务发展,随着数据和访问量增大甚至激增,造成例如首页五秒钟才能展示等问题,这种不佳体验会造成用户流失,此时性能就是必须面对之问题。我们把技术系统分为早期、中期、后期三个阶段:
- 早期:主要实现业务需求,性能非重点考虑
- 中期:性能问题注解显现,影响业务发展
- 后期:技术迭代性能与业务必须同时考虑
如何发现性能问题,并且最终如何解决性能问题就是本文讨论之要点。
2 什么是性能
我们可以从四个维度介绍什么是性能:
- 两个维度定义性能:
- 速度慢
- 压力大
- 两个维度描述性能:
- 定性:直观感受
- 定量:指标分析
3 发现性能问题
3.1 定性 + 速度
一个页面需要长时间打开,一个列表很慢才能加载完成,一个接口访问导致超时异常,这些显而易见之问题可以归为此类。
3.2 定量 + 速度
3.2.1 速度指标
一个公司有7200名员工,每天上班打卡时间是早上8点到8点30分,每次打卡时间系统执行时长5秒,那么RT、QPS、并发量分别是多少?
RT表示响应时间,问题已经包含答案:
- RT = 5秒
QPS表示每秒访问量,假设行为平均分布:
- QPS = 7200 / (30 * 60) = 4
并发量表示系统同时处理请求数:
- 并发量 = QPS x RT = 4 x 5 = 20
根据上述实例引出公式:
- 并发量 = QPS x RT
3.2.2 QPS VS TPS
QPS(Queries Per Second):每秒查询量
TPS(Transactions Per Second):每秒事务数
需要注意此事务并不是指数据库事务,而是包括以下三个阶段:
- 接收请求
- 处理业务
- 返回结果
QPS = N * TPS (N>=1)
N=1表示接口有一个事务:
public class OrderService {
public Order queryOrderById(String orderId) {
return orderMapper.selectById(orderId);
}
}
N>1表示接口有多个事务:
public class OrderService {
public void updateOrder(Order order) {
// transaction1
orderMapper.update(order);
// transaction2
sendOrderUpdateMessage(order);
}
}
3.2.3 发现问题
(1) 打印日志
public class FastTestService {
public void test01() {
long start = System.currentTimeMillis();
biz1();
biz2();
long costTime = System.currentTimeMillis() - start;
System.out.println("costTime=" + costTime);
}
private void biz1() {
try {
System.out.println("biz1");
Thread.sleep(500L);
} catch (Exception ex)