性能瓶颈定位&调优思路


性能瓶颈定位思路 整体思路:从前到后,从表象到内部 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卡等