目录
网站性能简介
网站性能是客观的指标,可以具体体现到响应时间,吞吐量等技术指标,同时也是主观的感受,用户的感受。
用户视角下的网站性能
用户在浏览器上直观的感受到网站响应速度快慢。用户感受到的时间包括用户计算机和网站服务器通信的时间,网站服务器处理的时间,用户计算机浏览器构造请求解析响应数据的时间。
在实践中,使用一些前端优化架构优化手段,通过优化HTML样式,利用浏览器端的并发和异步特性,调整浏览器缓存策略,使用CDN服务,反向代理等手段,使用户感兴趣的内容尽可能快的展示,这样即使不优化应用程序和架构,也可以很大程度改善用户视角下的网站性能。
开发人员视角下的网站性能
开发人员关注的主要是应用程序本身及其相关子系统的性能,包括响应延迟,系统吞吐量,并发处理能力,系统稳定性等技术指标。主要优化手段有:使用缓存加速数据读取,使用集群提高吞吐能力,使用异步消息加快请求响应以及实现削峰,使用代码优化手段改善性能。
运维人员视角下的网站性能
运维人员更关注基础设施性能和资源利用率,如网络运营商的带宽能力,服务器硬件配置,数据中心网络架构,服务器和网络带宽的资源利用率等。主要优化手段有:建设优化骨干网,使用高性价比定制服务器,利用虚拟化技术优化资源利用等。
性能测试指标
从开发和运维的角度来看,网站性能测试的主要指标有响应时间,并发数,吞吐量,性能计数器等。
响应时间
指执行一个操作需要的时间,包括从发出请求开始到最后收到响应数据所需要的时间。响应时间是系统最重要的性能指标,直观反映系统的快慢。
实践中通常采用重复请求的方法测试,比如一个请求操作重复执行一万次,测试一万次执行所需的总时间,然后除以一万即可得到单词请求的响应时间。
并发数
指系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。
测试程序一般通过多线程模拟并发用户的方法来测试系统的并发处理能力。为了真实模拟用户行为,一般不是启动多线程不断地发送请求,而是两次请求之间加一个随机等待时间,这个时间被称作思考时间。
吞吐量
指单位时间内系统处理的请求数量,体现系统的整体处理能力。
- TPS:每秒事务数,是吞吐量的一个常用量化指标。
- HPS:每秒HTTP请求数。
- QPS:每秒查询数。
在系统并发数有小到大逐渐增大的过程中,系统的吞吐量一般是先逐渐增加,达到一个极限后,随着并发数的增加反而下降,达到系统崩溃点后,资源耗尽,吞吐量为0.
性能计数器
它是描述服务器或操作系统性能的一些数据指标。包括系统负载,对象与线程数,内存使用,CPU使用,磁盘和网络IO等指标。
性能测试方法
性能测试是一个总称,具体可细分为性能测试,负载测试,压力测试,稳定性测试。
- 性能测试
以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期。
-
负载测试
对系统不断地增大并发请求以增加系统压力,直到系统的某项或多项性能指标达到安全临界值。
- 压力测试
超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力。
- 稳定性测试
被测试系统在特定硬件,软件,网络环境条件下,给系统加载一定业务压力,使系统运行一段时间,以此检测系统是否稳定。
性能优化策略
- 性能分析
大型网站结构复杂,用户从浏览器发送请求到数据库完成操作事务,中间需要经历很多环节,如果测试或者用户报告网站响应缓慢,存在性能问题,必须对请求经历的各个环节进行分析,排查可能出现性能瓶颈的地方,定位问题。
排查一个网站的性能瓶颈和排查一个程序的性能瓶颈手法基本相同:检查请求处理的各个环节的日志,分析哪个环节响应时间不合理,然后检查监控数据,分析影响性能的主要因素是内存,磁盘,网络还是CPU,是代码问题还是架构设计不合理,或者系统资源不足。
- 性能优化
定位产生性能问题的原因后,就需要进行性能优化,根据网站分层架构,可分为Web前端性能优化,应用服务器性能优化,存储服务器性能优化。
Web前端性能优化
主要优化手段有优化浏览器访问,使用反向代理,CDN等。
浏览器访问优化
- 减少http请求:合并CSS,JS,图片等
- 使用浏览器缓存:将静态资源文件缓存在浏览器。当某些新的静态资源文件需要及时应用到客户端时,可以通过改变文件名来实现,最好分批更新,避免一次全部更新导致大量缓存失效,服务器负载骤增,网络拥塞
- 启用压缩:在服务端对文件进行压缩,浏览器对文件解压,可有效减少通信传输的数据量
- CSS放在最上面,JS放在最下面:浏览器会在加载完所有CSS后才对页面进行渲染,因此将CSS放在最上面去加载。
- 减少Cookie传输
CDN加速
CDN:内容分发网络,本质上是一个缓存,而且将数据缓存在离用户最近的地方,使用户以最快的速度获取数据。
CDN部署在网络运营商的机房。用来缓存一些静态资源文件。
反向代理
部署在服务端,所有请求先经过代理服务器,然后由代理服务器来进行请求的转发,在代理服务器上可以缓存一些静态资源,还可以缓存之前接受过的请求,下次遇到直接返回。
反向代理还可以实现防火墙的作用,保护网站安全,还可以实现负载均衡,通过负载均衡构建集群提高系统整体能力。
应用服务器性能优化
应用服务器就是处理网站业务的服务器,优化手段主要有缓存,集群,异步等。
分布式缓存
缓存的基本原理:将数据存储在相对较高访问速度的存储介质上,供系统处理。
缓存一般都用Hash表实现。
使用缓存的前提:存在热点数据,大量的请求访问少量的热点数据,这时可以将热点数据缓存起来。
缓存的缺点:会导致数据不一致与脏读,因此应该使用很少修改的缓存。
缓存雪崩:当缓存不可用时,数据库由于突然承受巨大的压力而宕机,导致系统不可用。
缓存预热:新启动的缓存系统如果没有任何数据,在重建缓存数据的过程中,系统的性能和数据库负载都不会太好,那么最好在缓存系统启动时就把热点数据加载好。
缓存穿透:由于不恰当的业务或者恶意攻击,频繁访问某个不存在的数据,导致所有请求落在数据库上,增加数据库压力。
分布式缓存的架构:
- 以JBoss Cache为代表的需要同步更新的分布式缓存
- 以Memcached为代表的不相互通信的缓存
第一种所有缓存服务器存储一样的数据,需要同步更新,可以提供高可用性。
第二种是每个缓存服务器中存储一部分数据,利用一致性Hash等路由算法来选择使用哪个服务器,具有良好的扩展性。
Memcached流行,特点如下:
- 简单的通信协议
- 丰富的客户端程序
- 高性能的网络通信
- 高效的内存管理
- 互不通信的服务器集群架构
异步操作
使用消息队列将调用异步化,改善网站的扩展性。
消息队列的主要功能:
- 分布式系统结构
- 异步处理
- 流量削峰
使用集群
在高并发的访问情况下,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问分发到多台服务器上处理,避免单一服务器压力过大而响应缓慢。
负载均衡有硬件(F5)实现,也有软件(Nginx)实现。
代码优化
- 多线程
- 将对象设计为无状态的,如Servlet
- 使用局部对象
- 并发资源访问使用锁
- 资源复用
- 单例:减少对象的创建和资源的消耗,如目前Java服务端开发的service,dao等都是无状态单例的
- 对象池:线程池,连接池等
- 使用合理数据结构
- 垃圾回收