-
影响系统性能的方方面面
- 响应时间
- 并发数
- 吞吐量
- 关系
-
常用的性能优化手段
- 避免过早优化
- 进行系统性能测试
- 寻找系统瓶颈,分而治之,逐步优化
-
前端优化常用手段
- 浏览器/APP
1)减少请求数:合并Css,Js,图片
2)使用客户端缓存:静态资源文件缓存在浏览器或APP,Cache-Controle和Expire
3)启用压缩:服务器端文件压缩,浏览器端解压缩,gzip。会给浏览器和服务器带来性能上的压力,需要权衡
4)资源文件加载顺序:css>html>js
5)减少cookie传输:静态资源不要使用cookie - CDN加速:Content Dipatch Net,部署在网络运营商的机房
- 反向代理缓存:譬如Nginx,把前端资源放在Nginx里
- WEB组件分离:js.xxx.com/js,css.xxx.com/css.....同一个域名同一个时刻请求的线程数量有限
- 浏览器/APP
-
应用服务性能优化
- 缓存:离用户越近越好
a, 基本原理和本质:提高访问速度,减少计算次数
b, 合理使用的缓存的原则:
c, 分布式缓存与一致性哈希1)频繁修改的数据,尽量不要使用缓存,读写比要在2:1以上 2)缓存一定是热点数据 3)应用就要容忍一定时间的数据不一致 4)缓存的可用性问题:缓存服务器宕机 5)缓存预热:LRU和预先将一些热点数据放入缓存中 6)缓存击穿:1)布隆过滤器;2)不存在数据也缓存起来
1) jboss缓存,每个缓存服务器都缓存所有的数据 2) redis,memcached。每个服务器只缓存一部分数据,一致性哈希(0-2的32次方),虚拟的一致性哈希,一个节点虚拟多个节点
- 集群
a, F5硬件负载均衡,昂贵
b,使用软件做负载均衡,如Nginx - 异步
a, 同步和异步:关注的是结果消息的通信机制
b, 阻塞和非阻塞:关注的是等待结果返回给调用方的状态
c, bio 同步阻塞,方法调用
d, nio 同步非阻塞
e, aio 异步非阻塞
f, 常见的异步手段1)Servlet异步 2)多线程 3)消息队列
- 程序
a, 代码级别1)选择合适的数据结构 2)选择更优的算法 3)编写更少的代码 4)并发编程 5)资源的复用:单例模式,池化技术
- JVM
a, 与JIT编译器相关的优化1)热点编译的概念 2)选择编译器类型 -server,-client,-XX:!TieredCompilation -Xint 禁用JIT -Xcomp 最快 -Xmixed 混合 3)代码缓存相关 -XX:ReservedCodeCacheSize=N jdk7 32-48 jdk8 240m 4)编译阈值 a)方法调用计数器 b)循环回边计数器 c)-UseCounterDecay 启用衰减 d)-XX:CounterHalfLifeTime 参数 控制半衰减的周期 5)编译线程 6)方法内联 -XX:Inline 字节码小于325个字节才会内联 -XX:MaxFreqInlinesSize=N 方法小于35个字节,一定会内联 -XX:MaxInlineSize=N 7) 逃逸分析
b, GC调优
1)目的:GC的时间够小,GC的次数够少 2)调优的原则和步骤: 3)原则: a)大多数的java应用不需要GC调优 b)需要GC调优的,不是参数问题,是代码问题 c)GC调优其实是最后的手段,而且是逼不得已才用 d)选择合适的GC回收器 e)选择合适的堆大小 f)选择年轻代在堆中比重 4)步骤: a)监控GC的状态 b)分析结果,判断是否要优化 c)miniorGC 时间 <50ms ,10s 一次 d)fullGC 执行时间1s以下,频率10分钟以上 5)GC相关参数 -XX:+PrintGCDetails -Xlogger:loggerPath= -XX:+HeapDumpOnOutOfMemoryError -XX:HeadDumpPath= -XX:PrintHeapAtGC 当发生GC时打印堆的信息 -XX:TraceClassLoading 类的加载顺序
- 缓存:离用户越近越好
-
存储性能优化
- 尽量使用SSD
- 定时清理数据或者按数据的性质分开存放
- 结果集处理 mysql: setFetchSize
网友评论