介绍
各个系统都在追求性能,要做压力测试。
压力测试目的是要找到热点,性能瓶颈,然后解决它或者优化它,这边暂不讨论怎么解决和优化性能问题。如果不做大规模的性能测试,是否有其他方式在开发,单元测试和集成测试的时候就发现一些性能问题呢?
我个人比较喜欢在编码的各个阶段都去注意性能问题,并不希望在把问题留到大规模性能测试之后再发现。那样费时费力,在解决性能瓶颈和发现下一个性能瓶颈的过程中来来回回,压力测试的同学在叹气,开发的同学在抓头。
不说废话了。进入正题。假设我们能够通过DB查询出系统中各个方法的执行时间,那运用各种group by
,order by
。就能轻松知道当前系统的状态,有可能产生的瓶颈。不仅如此,还能清楚知道每一笔交易,对各个方法的执行次数。是否有大量不必要的循环等等。参考下表。
CREATE TABLE
service_method_record
(
id bigint NOT NULL AUTO_INCREMENT,
access_jnl CHAR(32), --流水号
start_time TIMESTAMP NULL, --开始时间
end_time TIMESTAMP NULL, --结束时间
method_name VARCHAR(100), --方法名称
use_time INT, --用时多久,毫秒
env_name VARCHAR(20), --环境名字,DEV,UAT,版本机等
PRIMARY KEY (id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
系统中方法太多,还有各种工具方法,根本没必要统计。如果在某个方法上给个注解@LogMethodTime
,这样就表示要统计这个方法的调用时长。岂不是美滋滋。
使用Aspect
做面向切面,拦截方法并且在方法入口和出口做时间统计操作。
看下示意图:
记录方式
1.可以记录到日志中,这样性能消耗比较小
2.可以记录到DB
中,但是性能消耗比较大,建议使用消息队列做异步记录。
记录到日志中
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @