网站的性能测试指标:
1、响应时间:指应用执行一个操作需要的时间,包括从发出请求开始到收到最后响应数据所需要的时间。响应时间直观的反应了系统的快慢。
2、并发数:指系统能够同时处理请求的数目,这个数字也反应了系统的负载特性。并发数即网站并发用户数。
3、吞吐量:指单位时间内系统处理的请求数量,体现系统的整体处理能力。常用的有TPS(每秒事务数)、HPS(每秒http请求数)、QPS(每秒查询书)。
4、系统负载:指当前正在被CPU执行和等待被CPU执行的进程数目总和,是反应系统闲忙程度的重要指标。
性能测试可细分为性能测试、负载测试、压力测试、稳定性测试
性能测试反应的是系统在实际生产环境中使用时,随着用户并发访问数量的增加,系统的处理能力。与性能曲线相对应的是用户访问的等待时间。
在日常运行区间,可以获得最好的用户响应时间,随着并发用户数的增加,响应延迟越来越大,直到系统崩溃,用户失去响应。
注意:首先应该能区分清楚各个性能测试的范围,然后注意一下各个系统性能测试区间下与响应时间的关系。
性能优化策略:
首先性能分析,定位性能瓶颈的地方,定位问题。排查一个网站的性能瓶颈基本手法就是检查请求处理的各个环节的日志,分析那个环节响应时间不合理、超出预期;然后检查监控数据,分析影响性能的主要因素是内存?磁盘?网络?还是cpu?还是代码?还是架构设计?或是系统资源确实不足?
Web端的性能优化:
浏览器访问优化
1.减少http请求:http协议是无状态的应用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http都需要启动独立的线程去处理。这些通信和服务的开销都很昂贵,减少http请求的数目可有效提高访问性能。减少http的主要手段是合并CSS、javascript、图片等资源。将浏览器一次访问需要的javascript、css合并成一个文件。
2.使用浏览器缓存:对一个网站而言,css,javascript,图标这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次HTTP请求都需要的,如果将这些文件缓存在浏览器中,可以极好的改善性能。通过设置HTTP头中的Cache-control和Expires的属性,可设定浏览器缓存,缓存时间可以自定义。需要注意的是在使用浏览器缓存策略的网站更新静态资源时,应该采用批量更新的方法,否则可能会照成用户浏览器更新大量缓存失效。
3.启动压缩:在服务器端对文件压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量。但由于压缩会对浏览器和服务器照成一定的压力,需要在通信带宽和服务器资源之间做权衡考虑。
4.CSS放在页面最上面,javascript放在页面最下面:因为浏览器会在下载完全部CSS之后才对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。javascript则相反,浏览器在加载Javascript后立即执行,有可能会阻塞整个页面,因此最好放在页面的最下面。但如果页面解析时就需要javascript,这时就不能放在底部了。
5.减少Cookie传输:cookie包含在每次请求和响应中,太大的cookie会严重影响数据传输,因此那些数据需要写入Cookie需要慎重考虑。另一方面,对于某些静态资源的访问,cookie没有任何意义,可以考虑静态资源用独立的域名访问。
反向代理
传统代理服务器位于浏览器一侧,代理浏览器将HTTP请求发送到互联网上,反向代理服务器位于网站机房一侧,代理网站web服务器接受HTTP请求。反向代理也具有保护网站安全的作用,相当于在web服务器和可能的网络攻击之间建立了一个屏障。代理服务器也可以通过配置缓存功能加速web请求,当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上。当其他用户访问该静态内容的时候,就能直接用缓存的内容了。反向代理也可以实现负载均衡,从而来提供系统总体处理能力。
应用服务器性能优化(主要手段是缓存、集群、异步)
缓存一定要缓存读写比较高,很少变化的数据,如果缓存的数据变化太快就失去了缓存的意义了。在利用缓存的时候一定要缓存预热,就是说在系统启动时就把热点数据加载好。
缓存穿透:是指不恰当的业务,或恶意攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落在数据库上,从而数据库压力过大甚至崩溃。
分布式缓存是指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种,一种是以JBoss Cache为代表的需要更新同步的分布式缓存,一种是以Memcached为代表的不互相通信的分布式缓存。
异步操作(使用消息队列)
实用消息队列将调用异步化,可改善网站的扩展性。在不使用消息队列的情况下,用户请求数据直接写入数据库,高并发下会对数据库照成巨大的压力,同时相应延迟加剧。在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度远大于数据库,因此用户的响应延迟可得到有效改善。
需要注意的是在使用消息队列进行业务异步处理后,需要业务流程进程配合,如订单提交后,订单数据写入消息队列,不能立即返回订单提交成功,因为在消息队列入库的时候可能存在失败的问题。
使用集群
在网站高并发访问场景下,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,避免单一服务器负载过大。
代码优化
多线程的使用(其实大家都知道):使用局部对象,使用锁。
资源复用:基本上是数据库的连接、关闭,网络通信的链接等用线程池的概念。
垃圾回收(其实我也不是太懂有待进一步了解):
存储优化
存储介质:固态硬盘的引入
存储算法:B+树 vs LSM树(我只想说传统数据库大多用的B+树的算法,nosql更多的是用的LSM树)
RAID vs HDFS:RAID技术主要是为了改善磁盘的访问延迟,增加磁盘的可用性和容错性。一份数据并行写入多个磁盘中,或一份数据需要写入到多个磁盘中形成多个备份数据等。