首页 科技正文

阳江海陵岛:性能优化有感

admin 科技 2020-04-26 7 0

性能优化有感

性能优化是个死板,却又有趣的历程
性能优化我大致分为几个方面

  • 代码优化
  • 线程优化、异步
  • JVM优化
  • 数据库优化
  • 缓存优化
  • 架构优化

下面来睁开谈谈感悟,也可以参考美团手艺团队常见性能优化

代码优化

代码是跟我们接触最多的器械,代码优化主要有

  1. 代码结构优化,可以利便日后扩展和代码尺度化
    • 是否可以举行抽象制止冗余代码
    • 是否可以行使设计模式
    • 代码是否遵照阿里巴巴Java开发手册

这里可以接纳阿里巴巴Java开发规范插件

  1. 代码是否有多重循环,无效的查询等
    • 多重循环可以凭据数据量接纳HashMap举行查询,属于行使空间换取时间
    • 无效的查询等可以举行删除
      这里推荐Findbugs

线程优化

线程优化是一个庞大的历程,多线程若何运用,若何制止死锁、饥饿、活锁等问题

  1. 线程使用的地方

    • 在查询中可以运用到多线程,把串行化操作变化为并行化操作
    • I/O壅闭的操作,最经典的莫过于BIO
    • 盘算量大的操作,使用多线程可以更好的运用CPU的运算能力
  2. 线程池
    需要领会线程池的状态,线程池的参数,以及内部原理,并选择合适的线程池
    这里推荐一篇文章Java线程池实现原理及其在美团营业中的实践 再次谢谢美团手艺团队

    • 线程池分为
      • newCachedThreadPool
      • newFixedThreadPool
      • newSingleThreadExecutor
      • newScheduleThreadPool
      • forkjoinPool
        注重:这里不建议使用Executors来建立线程池,方式OOM等问题,参考阿里巴巴开发规范,建议使用new ThreadPoolExecutor()
  3. 异步
    异步建议接纳MQ,使用范围例如insert、update操作,可以丢到MQ,这里要注重MQ新闻丢失问题,同时MQ也可以实现延迟行列,例如30分钟关闭订单,接纳Job的方式并不是一个好的解决方案,可以接纳MQ延时行列实现,这里推荐rocketmq(阿里巴巴牛逼)

  4. 并发容器的选择
    concurrenthashmap和synchronizedmap性能差距很大,建议选择合适的并发容器

JVM优化

JVM优化这里本人也不是稀奇的熟练,只是讲一些自己所知道的

  1. 无日志不优化
    在没有日志的情形下,该怎么优化,若何优化,哪些方面需要优化,这里都是未知的,以是需要日志才气举行优化
  2. 工具
    优化要有趁手的工具,幸亏JDK自己就为我们提供了不少,在JDK的bin目录下有一堆自带的工具,这里先容几个我熟悉且用过的
    • jps:查看当前机械上的java程序
    • jcmd:跟jps差不多然则能看到启动下令
    • jstat:查看JVM信息,例如GC信息
    • jinfo:查看JVM参数
    • jmap:JVM在内存中的情形,可以导出Dump
    • jstack:栈信息,可以用来查看死锁等
    • jconsole:一个可视化工具
    • jvisualvm:也是一个可视化工具比jconsole功效强一些,然则都有局限性,在服务器上无法使用
    • eclipse memory analyer:剖析dump文件
  3. 参数优化
    使用上面的工具对服务器举行监控,可以凭据信息适当的调整堆巨细,GC收集器等。建议开启-XX:+HeapDumpOnOutOfMemoryError

数据库优化

数据库是优化中主要的一环,详细优化方式如下

  1. SQL优化:是否可以去掉不必要的查询,使用explain对sql举行剖析,制止回表等
  2. 分库分表:一台数据库可能存在性能瓶颈,可以接纳分库分表的方式,拆分主要接纳冷热数据星散、日期支解、HASH取模等。
  3. 读写星散:对数据的修改可以操作主库,对数据的查询可以操作从库,举行读写星散
    分库分表以及读写星散后可能会泛起分布式事务、读写星散操作的庞大性等问题这里需要引入中间件例如:MyCat sharding jdbc

缓存优化

缓存是个优化的好办法然则也有坏处

  1. 缓存分类
    • JVM缓存:concurrenthashmap、guava缓存
    • Redis等NoSQL数据库
  2. 缓存拆分
    可以在代码中对接口举行拆分,可以缓存的和不可以缓存的写成多个方式,对可以缓存的举行缓存
  3. 缓存带来的坏处
    缓存并不是越多越好,缓存给系统带来了庞大性,例如:何时添加缓存、何时删除缓存、缓存雪崩、缓存击穿、缓存穿透、缓存预热、Redis集群若何实现、Redis哨兵、Redis脑裂等问题

架构优化

架构优化实在就程序员来说能做的并不是许多

  1. 限流:GateWay举行限流,限流方式有滑动窗口、漏桶、令牌桶算法,这里建议接纳合适的方式举行限流防止应用溃逃
  2. 熔断:可以接纳hystrix防止服务雪崩
  3. CDN优化:对静态资源接纳CDN可以提交响应速率
  4. DNS优化:这个暂时不熟可以交给运维处置
  5. 服务扩容:可以接纳K8S和Docker的手艺对服务举行动态扩容,这里也是运维实现

测试

优化了这么多,体现当然是压力测试,这里由于不熟悉性能指标,单机TPS部门接口可以到达800+ RT在300ms以内,希望人人提供一个单机性能尺度,以上接纳的是LoadRuner测试的效果

洋洋洒洒写了这么多,主要的照样平时的积累以及思索,也希望您对内容举行弥补。

,

Sunbet 申博

Sunbet 申博www.sunbet88.us是Sunbet指定的Sunbet官网,Sunbet提供Sunbet(Sunbet)、Sunbet、申博代理合作等业务。

版权声明

本文仅代表作者观点,
不代表本站Sunbet的立场。
本文系作者授权发表,未经许可,不得转载。

评论