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、同步修改为异步

  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/malinalian/p/10583313.html
Copyright © 2011-2022 走看看