性能瓶颈定位&调优思路

性能瓶颈定位思路
整体思路:从前到后,从表象到内部
1、首先排除压力机自身的问题,如CPU、内存、网络、脚本编写等
2、监控中间件的访问日志,观察响应时间,大体确定耗时处于哪一段
3、排查网络问题,监控压力机到后端服务器的网络,以及各服务器之间的网络,是否达到网络上限
4、监控服务端所有机器的的操作系统负载,如CPU、内存、网络、磁盘是否达到瓶颈
5、监控应用服务器的日志,查看是否存在ERROR日志,比如tiomeout或者其他类型报错
6、监控各中间件的连接数,如nginx/tomcat/mysql等,是否达到上限
7、监控应用程序线程状态,使用jstack或者jvisualvm查看是否有死锁、阻塞等情况
8、监控应用程序jvm,使用jstat或者jmap查看GC情况,是否存在内存泄露等
9、使用Jprofile监控应用程序,可以查看耗时比较长的代码
10、监控数据库,是否存在慢查询,一般数据库CPU高都是因为SQL语句效率低造成的
11、检查数据库执行计划,是否有全表扫描以及索引不生效的情况
12、检查系统外部依赖情况,如果外部依赖性能差,也会造成本系统性能低
13、对于不好定位的问题,可以考虑采用模块隔离法来确定问题
 
数据库架构优化
1、读写分离,主从配置
2、分库分表,根据一个固定的算法来路由库名和表名,如id%10:
  user_1
  user_2
  user_3
  ...
  user_10
 
常见的一些SQL优化方案
1、在where及order by 涉及的列上建立索引,避免全表扫描,索引不要太多,一个表一般不要超过4个索引
2、避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
3、查询语句中不要使用*,减少内存使用
4、尽量减少子查询,使用关联查询(left join, right join, inner join)替代
5、减少使用IN或者NOT IN,使用exists, not exists或者关联查询语句替代
6、or的查询尽量用union或者union all替代(在确认没有重复数据或者不用删除重复数据时,union all会更好)
7、合理的增加冗余的字段(减少表的联接查询)
8、建表的时候能使用数字类型的字段就是用数字类型(type, status...),数字类型的字段作为条件查询比字符创的快
 
代码优化原则
1、使用对象连接池减少对重复对象的创建;
2、调整对后端的连接
3、增加本地缓存
4、如果不涉及事务的情况下,考虑使用Nosql进行存储
5、一次请求合并多次操作
6、又串行修改为并行操作
7、同步修改为异步
 
硬件调优
使用更好额物理磁盘介质,如SSD、fusionIO卡等
posted @ 2022-05-15 11:20  阳光倾林  阅读(205)  评论(0编辑  收藏  举报