04 高性能架构
压力测试, 不断地增加并发数量.
性能测试: 日常的运营 a - b, b点是日常的最高值.
负载测试: b-c, 模拟的是访问高峰, 可以看到系统最大负载是 c 点.
压力测试: 超过 c 点, 系统资源继续增加, 但是TPS却在走下坡路. 直到 d 点(耗费资源到达极限, 系统崩溃)
性能优化策略
如果性能测试结果不能满足设计或业务需求,就需要寻找系统瓶颈,分而治之,逐步优化。
1. 性能分析
必须对请求经历的各个环节进行分析,排查可能存在的性能瓶颈。
检查请求处理的各个环节的日志,分析哪个环节响应时间不合理,监控数据,分析主要因素 如 内存,磁盘I/O, 网络, CPU, 还是代码架构不合理。
定位到问题后,要进行优化
2. web 前端优化
浏览器加载,网站视图模型,图片服务,CDN服务,主要优化手段有 浏览器访问,反向代理,CDN等.
浏览器优化
- 减少 http 请求次数, HTTP是无状态的应用协议,意味着每次 HTTP 请求都需要建立通信链路,数据传输,而在服务器端都需要独立线程去处理.减少 http 的主要手段是 合并 css, 合并 javascript, 合并图片, 将浏览器一次访问需要的 javascript, css 合并成一个文件,这样浏览器只需要请求一次 图片也可以合并,多张图片合并成一张.
- 用浏览器缓存, 对一个网站, css, javascript, Logo, 图标这些静态资源更新频率比较低,而这些文件几乎是每次 HTTP 请求都需要的,如果将这些文件缓存在浏览器中,可以极好的改善性能,通过设置 HTTP 头中 Cache-Control 和 Expires 的属性, 可设定浏览器缓存.
- 启用压缩, 在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量.
- CSS 放在网页最上面,javascript 放在最下面,浏览器会在下载完全部 CSS 之后才对整个页面进行渲染
- 减少 Cookie 传输,哪些数据需要写入 Cookie 需要慎重考虑,减少 Cookie 中传输的数据量, 另外, 对于某些静态资源的访问, 如 CSS, JavaScript 等,发送 Cookie 没有意义,可以考虑静态资源使用独立域名访问,避免请求静态资源时发送Cookie, 减少 Cookie传送的次数.
CDN 加速
CDN 能够缓存静态资源,如图片,文件,css, JavaScript脚本,静态网页等, 但这些文件访问频度很高,将其缓存在 CDN可极大改善网页的打开速度。
反向代理
反向代理也可以缓存静态资源.
3. 应用服务器性能优化
这部分是我们的优化范围(重点), 主要手段有 缓存,集群,异步
分布式缓存
对数据缓存,对文件缓存,对页面片段缓存(网站性能优化第一定律:优先考虑缓存优化性能)
网站数据访问通常遵循二八定律, 即80%的访问落在20%的数据上.
合理使用缓存, 频繁修改的数据,没有热度访问的数据 都不适合使用缓存. 另外缓存有可能造成数据的不一致性(脏读),一般会设置缓存的有效期
缓存高可用, 可以通过缓存服务器集群, 当一台缓存服务器宕机时,只有部分缓存数据丢失,重新从数据库加载对数据库影响不大。
缓存预热: 在缓存启动时,加载热点数据。
缓存穿透: 在缓存中没有,请求都是直接访问DB.
异步操作
使用消息队列
消息队列具有很好的削峰作用-异步处理, 将高并发保存在消息队列里。
使用集群
利用负载均衡,将任务发送到不同的web服务器上(组成集群)
优化代码
业务逻辑主要在应用服务器上,合理优化代码,可以很好改善性能。
- 多线程 (注意线程安全,并发访问资源时加锁)
- 资源复用 (尽量减少哪些开销很大的系统资源的创建和销毁,比如数据库连接,网络通信连接 等) 从编程角度,复用主要有两个形式: 单例(Singleton) 和 对象池(Object Pool). 对于数据库连接对象,每次创建连接,数据库服务端都需要创建专门资源以应对,因此频繁的关闭数据库连接,对数据库服务器而言是灾难性的,因此实践中,应用程序的数据库连接基本都使用连接池(connection pool)的方式,数据库连接对象创建好后,将连接对象放入对象池容器中,应用程序要连接的时候,就从对象池中获取一个空闲的连接使用,使用完毕归还对象到对象池中,不需要重新创建连接. (也不需要关闭连接), 对于每一个 Web请求, Web 应用服务器都需要创建一个独立的线程去处理,应用服务器也是采用线程池的方式,本质上都是对象池.
- 数据结构
- 垃圾回收, JVM 合理设置各个内存区域的大小,减少 Full GC 的运行次数,某些 Web应用在整个运行期间可以做到从不 Full GC.
4. 存储优化
存储介质的速度(机械硬盘, 普通硬盘, SAN,NAS)等, 存储冗余备份的优化( RAID0, HDFS 等)
架构师要做的,就是从上面各个方面,尽可量的对网站进行优化, 提高网站性能.