性能测试之性能测试调优
- 格式:docx
- 大小:17.74 KB
- 文档页数:5
1. 性能测试调优
1) 性能调优原则
1. 在应用系统的设计、开发过程中,应始终把性能放在考虑的范围内;
2. 确定清晰明确的性能目标是关键;
3. 必须保证调优后的程序运行正确;
4. 性能更大程度是取决于良好的设计,调优技巧只是一个辅助手段;
5. 调优过程是迭代渐进的过程,每次调优的结果要反馈到后续的代码开发中去;
6. 性能调优不能以牺牲代码的可读性和维护性为代价。
2) 性能调优基本步骤
1. 确定清晰的性能目标,并按优先级排列;
2. 利用科学的测试工具对应用程序进行测试,定位出性能瓶颈,列举出可能造成该系统瓶颈的因素;
3. 把服务系统拆分成组件: Web 层、业务层、集成层、持久层,分别进行调优;
4. 有系统的科学调优
➢ 遵循一定的程序:测试性能→找出瓶颈→假设造成瓶颈的因素→测试假设是否
成立→修改应用→再次测试性能。
➢ 确定影响性能的因素: CPU、 Memory、 JVM、 JDBC 还是其它因素。
➢ 找出主要的瓶颈,首先解决最容易的,再重复测试。
➢ 一次修改一个瓶颈,不要对不需要的地方进行调优。
5. 优化完成之后,进行性能回归测试; 2. DB常见性能问题
随着开源框架越来越成熟,开发人员在写代码的时候,更多的情况下会去参考其它人员的写法,所以代码层面的问题其实所占的性能问题比例并不会太高,更多的可能是开发框架的选择及使用上会出更多的问题(比如配置问题)。但是大量的问题会集中在SQL上。现在的ORM层更多的是把数据库操作当成对像来使用,最大的好处就是开发人员能通过很少的代码量就完成数据库层面的操作,大大提示了开发效率,不需要去写很多JDBC代码。但是数据库毕竟不能只当作对象来看来,它有自己的组织方式,有自己的索引机制,当你数据库量到一定程度的时候,这类框架就会相当吃力,因为当通过对象的方式来组织对象之间的关系,就会导致映射到数据库层面的SQL会非常的复杂。恰恰这种复杂并不是数据库执行引擎所期待的时候,就会导致各种慢查询。常见的DB问题主要有以下几种类型(以mysql为例):
1) 引擎的选择
mysql 常用的存储引擎包括 MYISAM、Innodb 和 Memory,其中各自的特点如下:
MYISAM : 全表锁,拥有较高的执行速度,一个写请求请阻塞另外相同表格的所有读写请求,并发性能差,占用空间相对较小,mysql 5.5 及以下仅 MYISAM
支持全文索引,不支持事务。
Innodb:行级锁(SQL 都走索引查询),并发能力相对强,占用空间是 MYISAM
的 2.5 倍,不支持全文索引(5.6 开始支持),支持事务。 Memory : 全表锁,存储在内存当中,速度快,但会占用和数据量成正比的内存空间且数据在 mysql
重启时会丢失。
综上,建议绝大部份都设置为 innodb 引擎,特殊的业务再考虑选用 MYISAM
或 Memory ,如全文索引支持或极高的执行效率等
2) 索引问题
索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。 mysql 有四种不同的索引类型:
主键索此 ( PRIMARY )
唯一索引 ( UNIQUE )
普通索引
( INDEX )
全文索引(FULLTEXT , MYISAM 及
mysql 5.6 以上的
Innodb )
建立索引的目的是加快对表中记录的查找或排序,索引也并非越多越好,因为创建索引是要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间维护索引。
在设计表或索引时,常出现以下几个问题:
a) 少建索引或不建索引。这个问题最突出,建议建表时 DBA 可以一起协助把关。
b) 索引滥用。滥用索引将导致写请求变慢,拖慢整体数据库的响应速度(5.5 以下的 mysql 只能用到一个索引)。 c) 从不考虑联合索引。实际上联合索引的效率往往要比单列索引的效率更高。
d) 非最优列选择。低选择性的字段不适合建单列索引,如 status 类型的字段
3) SQL编写不规范引起的慢SQL
针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。我们在编写 SQL 时就需要注意与索引相关的规则:
字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;
mysql
不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;
不要在字段前面加减运算;
字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;
like % 在前面用不到索引;
根据联合索引的第二个及以后的字段单独查询用不到索引;
不要使用 select *;
排序请尽量使用升序 ;
or 的查询尽量用 union 代替 (Innodb);
复合索引高选择性的字段排在前面;
order by / group by 字段包括在索引当中减少排序,效率会更高。
除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:
➢ 尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步; ➢ 分页语句 limit
的问题;
➢ 删除表所有记录请用 truncate,不要用 delete;
➢ 不让 mysql 干多余的事情,如计算;
➢ 输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的
➢ 在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;
➢ 慎用 Oder by rand()。
4) 分析工具
针对SQL问题,常用的工具有:
➢ mysqldumpslow
➢ mysql profile
➢ mysql explain
具体使用及分析方法在此就不赘述,网上有丰富的资源可以参考。