zoukankan      html  css  js  c++  java
  • 性能测试四十四:性能优化思路

    性能瓶颈定位整体思路,从前到后,从表象到内部
      1,首先排除压力机的性能情况,包括cpu、内存
      2,应用服务器的硬件指标,cpu,内存,网络IO(ethtool eth0),磁盘IO,如果发现某台机器的这四项中的任何一项到达瓶颈,那么这台机器在这一方面就到达瓶颈了
      3,其他服务器,比如数据库服务器,依赖的其他应用服务器
      4,看应用服务器的日志,tomcat下看的是catalina.out,用tail -200 catalina.out ,看cause by:xxx TimeOut
      5,tps比较低,应用服务器cpu比较高,jvisualvm、jprofiler看下java进程,消耗cpu的方法
      6,tps比较低,应用服务器cpu也比较低,可能是java程序的线程阻塞或死锁,也用jvisualvm看,如果红色的线程比较多,就是阻塞的原因(blocked、timed_waiting),jstack pid
      7,tps比较低,响应时间比较长,首先要先弄清楚请求的流向,比如:LR-->nginx-->tomcat-->java-->数据库-->缓存-->外部依赖--返回,如果排除到其他的问题,可以在java代码加时间戳的方法来定位响应时间比较长的问题
      8,tps缓慢降低,或大幅降低,tps大幅波动,用jmap或者jvisualvm进行堆内存dump,用jstat -gcutil,看看是否有内存泄露趋势,Jvm的FullGC是否频繁(单次FullGC消耗的时间FGCT/FGC,最好不要超过200毫秒)
      9,排查连接数相关的内容,包含tomcat的连接数、mysql的连接数,某端口的连接数:netstat -an|grep 8080 | wc -l

    Tomcat连接数相关
    关于连接数,要看2方面,首先是中间件最大配置的连接数,然后就是当前连接数
    tomcat的当前连接数用netstat可以看,略。最大连接数在
    一般tomcat需要设置的参数,第一个就是连接数在conf/server.xml里配置
    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

    mysql连接数:
    maxThreads="200" 表示最多同时处理200个连接,默认值是200,可以改为2000,一般都是上千的,看具体配置
    acceptCount="100" 当同时连接的人数达到maxThreads时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接。默认值为100 ,可以改为500,看具体配置
    第二个jvm的参数,在bin目录下的catalina.sh第二行插入就行


    数据库架构的调优
      --读写分离:主从配置,AB主从关系,写A同步到B,读B
      --分库分表:根据一个id来路由库名和表名,id%10,1202922292
        user_1
        user_2
        user_3
        ...
        user_10

      --硬件调优
        普通磁盘
        SSD
        fusionIO卡

    常见的一些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、同步修改为异步

  • 相关阅读:
    [易学易懂系列|rustlang语言|零基础|快速入门|(18)|use关键词]
    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
    [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化]
    区块链行业访谈:《创世访谈录》
    波卡简介
    [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]
    GIT分布式代码管理系统
    jenkins介绍及部署tomcat环境、部署Maven项目及密码忘记修改
    Docker安装、命令详情、层级架构、docker服务启动失败解决方法
    ELK日志分析系统部署
  • 原文地址:https://www.cnblogs.com/malinalian/p/10583313.html
Copyright © 2011-2022 走看看