建议五:优化SSL/TLS

  越来越多的网站在使用Secure Sockets Layer(SSL)及后来的Transport Layer Security(TLS)协议。SSL/TLS通过加密从源服务器发送给用户的数据来提升网站安全性。Google会提升使用SSL/TLS的网站的搜索引擎排名,将有力地推动这一进程。

  尽管采用率越来越高,但SSL/TLS造成的性能损失也困扰着很多网站。SSL/TLS拖慢网站的原因有两个。

  每次打开新连接的初次握手都必须创建加密密钥,而浏览器使用HTTP/1.x对每个服务器建立多个连接的方式进一步加剧了这个问题。

  服务器端加密数据和客户端解密数据的操作同样也是开销。

  为了鼓励人们使用SSL/TLS,HTTP/2和SPDY(参见建议六)的作者将这两个协议设计为只让浏览器针对一次会话建立一个连接。这样就把SSL导致性能降低的两个主要原因之一消灭掉了。然而,说到优化SSL/TLS性能,还是有很多事情可做。

  优化SSL/TLS的方法因Web服务器而异。以NGINX为例,NGINX使用OpenSSL,运行于普通机器上,能够提供接近定制机器的性能。NGINX SSL performance详细介绍了如何将SSL/TLS加密和解密的开销降至最低。

  此外,这里还有一篇文章,介绍了很多种提升SSL/TLS性能的方法。简单总结一下,涉及的技术主要有如下几种。

  会话缓存。使用ssl_session_cache指令开启缓存,缓存每次SSL/STL连接时用到的参数。

  会话票或ID。把特定SSL/TLS会话的信息保存为一个会话票或ID,以便连接重用,而不必重新握手。

  OCSP封套。通过缓存SSL/TLS证书信息减少握手时间。

  NGINX和NGINX Plus都可以来终止SSL/TLS,即处理客户端信息的加密和解密,同时与其他服务器保持明文通信。在NGINX或NGINX Plus中设置处理SSL/TLS终止可以采取这几个步骤。而对于在接受TCP连接的服务器上使用NGINX Plus而言,可以参考这里的设置步骤。

   建议六:实现HTTP/2或SPDY

  已经使用SSL/TLS的站点,如果再使用HTTP/2或SPDY则很可能提升性能,因为一个连接只要一次握手。尚未使用SSL/TLS、HTTP/2和SPDY的站点切换到SSL/TLS(通常会降低性能),从响应速度方面看,可能是一次倒退。

  谷歌2012年开始SPDY项目,致力于在HTTP/1.x之上实现更快的速度。HTTP/2则是IETF最近批准的基于SPDY的标准。SPDY得到了广泛支持,但很快就将被HTTP/2取代。

  SPDY和HTTP/2的关键在于只用一个连接,而非多个连接。这一个连接是多路复用的,因此可以同时承载多个请求和响应。

  只维持一个连接,可以省掉多个连接所需的设置和管理消耗。而且一个连接对SSL特别重要,因为可以将SSL/TLS建立安全连接所需的握手时间降至最少。

  SPDY协议要求使用SSL/TLS,HTTP/2并没有正式要求,但目前所有支持HTTP/2的浏览器都只会在启用SSL/TLS的情况下才会使用它。换句话说,支持HTTP/2的浏览器只有在网站使用SSL且服务器接受HTTP/2流量的情况下才会使用HTTP/2。否则,浏览器会基于HTTP/1.x通信。

  实现了SPDY或HTTP/2之后,域名分片、资源合并、图片精灵等之前针对HTTP的性能优化措施就用不着了。因此也可以简化代码和部署。关于HTTP/2会带来哪些变化,可以参考我们的这个白皮书。

NGINX很早就开始支持SPDY,而且今天使用SPDY的大多数站点都在运行NGINX。NGINX同样率先支持了HTTP/2,2015年9月,NGINX开源和NGINX Plus开始支持 HTTP/2。

  随着时间推移,NGINX希望大多数站点启用SSL并迁移到HTTP/2。这样不仅可以让网站更安全,而且随着新的优化技术不断涌现,也可以通过简单的代码实现更高的性能。

  建议七:升级软件

  提升应用性能的一个简单的方法,就是根据可靠性及性能选择软件。此外,高质量组件的开发者更可能不断提升性能和修复问题,因此使用最新的稳定版本是划算。新发布的版本会得到开发者和用户更多的关注,同时也会利用新的编译器优化技术,包括针对新硬件的调优。

  相对旧版本,新发布的稳定版本明显性能更高。坚持升级,也可以保证在调优、问题修复和安全警报方面与时俱进。

  不升级软件也会妨碍利用新能力。比如,HTTP/2目前要求OpenSSL 1.0.1。从2016年下半年开始,HTTP/2会要求OpenSSL 1.0.2,该版本发布于2015年1月。

  NGINX用户可以从NGINX开源软件的最新版本或NGINX Plus开始,它们支持套接字共享、线程池(参见下文),而且都会持续优化性能。因此,检查一下自己的软件,尽量把它们升级到最新的版本。

  建议八:调优Linux

  Linux是今天大多数Web服务器的底层操作系统,作为一切基础设施的基础,Linux对提升性能至关重要。默认情况下,很多Linux系统都比较保守,仅以桌面办公为需求,以占用少量资源为调优目标。对于Web应用而言,为达到性能最佳,肯定需要重新调优。

  Linux优化因Web服务器而异。以NGINX为例,可以从以下几方面考虑。

  存量队列。如果发现有一些连接得不到处理,可以增大net.core.somaxconn,即等待NGINX处理的最大连接数。如果这个连接数限制过小,应该可以看到错误消息,可以逐步提高这个值,直到错误消息不再出现。

  文件描述符。NGINX对每个连接最多使用两个文件描述符。如果系统服务于很多连接,可能需要增大sys.fs.file_max这个对描述符的系统级限制,以及nofile这个用户文件描述符限制,以支持增大后的负载。

  临时端口。在作为代理使用时,NGINX会为每个上游服务器创建临时端口。可以设置net.ipv4.ip_local_port_range,增大端口值的范围,以增加可用的端口量。此外,还可以减小net.ipv4.tcp_fin_timeout的值,它控制非活动端口释放重用的等待时间,加快周转。

  对NGINX而言,请参考NGINX性能调优指南,了解如何不费吹灰之力将你的Linux系统优化为能够支持更大的吞吐量。

  建议九:调优Web服务器

  无论使用什么Web服务器,都需要针对应用对其调优。以下建议适用于任何Web服务器,但会给出只有NGINX的设置说明。

  访问日志。不要每个请求的日志都马上写到磁盘,可以在内存里做个缓存,然后批量定入。对NGINX而言,将buffer=_size_参数添加到access_log指令,等内存缓冲区写满后再把日志写到磁盘。如果你添加了**flush=_time_**参数,那么缓冲区的内容也会按照指定时间写入磁盘。

  缓冲。缓冲用于在内存里保存部分响应,直到缓冲区被填满,可以实现对客户端更有效的响应。无法写入内存的响应会被写到磁盘,从而降低性能。在NGINX的缓冲启用时,可以使用proxy_buffer_size和proxy_buffers指令来管理它。

  客户端活动连接。活动连接可以减少时间消耗,特别是在使用SSL/TLS的情况下。对NGINX而言,可以针对客户端提高keepalive_requests的数值,默认值为100;也可以增大keepalive_timeout的值,让活动连接持续时间更长,从而让后续请求得到更快响应。

  上游活动连接。上游连接,即连接到应用服务器、数据库服务器的连接,同样可以从活动连接的设置中获得好处。对上游连接来说,可以增加活动连接,也就是每个工作进程可用的空闲活动连接的数量。这样可以增进连接重用,减少重开连接。关于活动连接的更多信息,请参考这篇博客。

  限制。限制客户端使用的资源可以提升性能和安全性。对NGINX而言,limit_conn和limit_conn_zone指令限制指定源的连接数,而limit_rate限制带宽。这些设置可以防止合法用户“侵吞”资源,同时也有助于防止攻击。limit_req和limit_req_zone指令限制客户端请求。对于到上游服务器的连接,可以在上游配置区的服务器指令中使用max_conns参数,它限制对上游服务器的连接,防止过载。相关的队列指令会创建一个队列,在max_conns限制到达后将指定的请求数保存指定的时间。

  工作进程。工作进程负责处理请求。NGINX采用基于事件的模型和OS相关的机制有效地在工作进程间分配请求。建议将worker_processes的值设置为每个CPU一个工作进程。如果需要,大多数系统都支持提高worker_connections的值(默认为512)。可以通过试验找到最适合你系统的这个值。

  套接字分片。通常,一个套接字监听器向所有工作进程分发新连接。套按字分片则为每个工作进程都创建一个套接字监听器,由内核在套接字监听器可用时为其指定连接。这样可以减少锁争用,提升多核系统上的性能。要启用套接字分片,在listen指令中包含reuseport参数。

  线程池。一个费时的操作会阻塞任何计算机进程。对Web服务器软件来说,磁盘访问可能阻碍很多较快的操作,比如内存中的计算和复制。在使用线程池的情况下,慢操作会被指定给一组独立的任务,而主处理循环会继续运行较快的操作。磁盘操作完成后,结果会返回到主处理循环。在NGINX中,read()系统调用和sendfile()被转载到了线程池。

提示 修改任何操作系统及周边设备的设置时,每次只修改一项,然后测试性能。如果该项修改导致了问题,或者并未提升性能,再改回去。

  关于调优NGINX的更多内容,请参考这篇博客。

  建议十:监控实时动态以发现问题和瓶颈

  保存应用高性能的关键是实时监控应用性能。必须实时监控特定设备及相应Web基础设施中应用的动态。

  监控站点活动多数情况下是被动的,它只告诉你发生了什么,至于如何发现和解决问题,则是你自己的事情。

  监控可以捕获以下几种问题:

  服务器停机

  服务器不稳,漏处理连接

  服务器出现大面积缓存失效

  服务器发送的内容不对

  New Relic或Dynatrace等全局性的性能监控工具,可以帮我们监控远程加载页面的时间,而NGINX则可以帮你监控应用交付这一端。应用的性能数据可以告诉你优化手段什么时候真正给用户带去了不同的体验,以及什么时候需要扩容以满足越来越多的流量。

  为了帮助用户尽快发现问题,NGINX Plus增加了应用程序体检功能,会报告经常重复出现的问题。NGINX Plus还具备session draining特性,会在已有任务完成前阻止新连接,以及慢启动容量,从而让恢复的服务器在负载均衡集群中达到应有的速度。使用得当的情况下,健康体检会在问题显著影响用户体验之前帮你定位问题,而session draining和慢启动则让你替换服务器时不影响感知的性能和在线时间。这张图展示了NGINX Plus内置的实时活动监控的控制板,涵盖了服务器、TCP连接和缓存。

结论:10倍性能提升

  性能提升因Web应用不同会有巨大差异。实际的提升取决于预算、时间,以及现有实现的与理想性能的差距。那么怎么让你的应用获得10倍的性能提升呢?

  为了帮大家理解每项优化建议的潜能,下面再针对之前的建议给出一些实施方针,希望大家各取所需。

  反向代理服务器及负载均衡。没有负载均衡或池负载均衡,可能导致极低的性能。添加一个反向代理服务器,比如NGINX,可以减少Web应用在内存和磁盘之间的往返。负载均衡可以把任务从过载的服务器转移到空闲的服务器,也便于扩展。这些改变能极大地提升性能,与原有的部署方式最差的时候相比,10倍性能提升是很轻松的事,即使不到10倍那也在总体上有了质的飞跃。

  缓存动态和静态内容。如果你的Web服务器同时又充当了应用服务器,那么通过缓存动态内容就可以达到高峰期10倍的性能提升。缓存静态内容也可以有几倍的性能提升。

  压缩数据。使用JPEG、PNG、MPEG-4以及MP3等压缩格式能显著提升性能。如果这些手段都用上了,那么压缩的文本数据(代码及HTML)可以将初始页面加载时间提升两倍。

  优化SSL/TLS。安全握手对性能有很大影响,因此对其进行优化可以让初次响应加快两倍,对于文本内容较多的网站尤其如此。优化SSL/TLS下的媒体文件带来的性能提升很小。

  实施HTTP/2和SPDY。在使用SSL/TLS的情况下,这两个协议有可能提升网站的整体性能。

  调优Linux和Web服务器。使用优化的缓冲策略、使用活动连接,将耗时的任务转载至独立的线程池,可以显著提升性能。比如线程池可以将磁盘操作密集性任务的性能提升至少一个数量级。

  希望大家自己多尝试以上技术,也希望大家分享自己在性能改进方面的心得。如果有好的想法和实现方案,欢迎留言。

做好这几点,web应用性能将极大提高(二)相关推荐

  1. WEB前端性能优化,提高页面加载速度

    可能有人会说:网站的性能是后端工程师的事情,与前端并无多大关系.我只能说,too young too simple.事实上,只有10%~20%的最终用户响应时间是用在从Web服务器获取HTML文档并传 ...

  2. 香侬科技Service Streamer:加速深度学习Web服务、极大提高GPU利用率。| 百万人学AI评选

    2020 无疑是特殊的一年,而 AI 在开年的这场"战疫"中表现出了惊人的力量.站在"新十年"的起点上,CSDN[百万人学AI]评选活动正式启动.本届评选活动在 ...

  3. 前端性能优化——如何提高页面加载速度?

    1.将样式表放在头部 首先说明一下,将样式表放在头部对于实际页面加载的时间并不能造成太大影响,但是这会减少页面首屏出现的时间,使页面内容逐步呈现,改善用户体验,防止"白屏". 我们 ...

  4. 提高 Web 站点性能的最佳实践

    原文地址:http://developer.yahoo.com/performance/rules.html 本文在尊重原文基础上,尽量翻译得通俗易懂一些. 本文内容 提高 Web 站点性能的最佳实践 ...

  5. Web必备性能压力测试工具WebBench与ApcheBench(ab)详解

    在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力测试的结果 ...

  6. web前端性能优化指南

    读过的最简洁,最直接,也最有价值的web前端性能文章 http://www.dbanotes.net/web/high_performance_web_site.html <高性能网站建设指南& ...

  7. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

  8. WEB前端性能优化小结

    1. 请减少HTTP请求 基本原理: 在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出. 一个正常HTTP请求的流程简述:如在浏览器中输 ...

  9. Web服务器性能压力测试工具http_load、webbench、ab、Siege使用教程

    Web服务器性能压力测试工具http_load.webbench.ab.Siege使用教程 作者: feng 日期: 2012/07/25 发表评论 (0) 查看评论 一.http_load 程序非常 ...

最新文章

  1. Linux修改主机名永久生效
  2. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
  3. webservice restful类型接口的调用实例
  4. STM32开发 -- Secure CRT 自动记录日志和时间戳功能配置
  5. Spring-Data-JPA 动态查询黑科技
  6. P5631-最小mex生成树【线段树,并查集】
  7. 2016版单词的减法_在2016年最大的电影中,女性只说了27%的单词。
  8. 疑惑?人工智能兴起为什么带火了Python,看完这篇你就明白了
  9. JDK源码系列(2)-Object类
  10. 东大OJ-1391-Big big Power
  11. [Android Studio] Android Studio如何快速生成get,set,tostring,构造函数
  12. DSP之时钟与定时器之三RTC
  13. KVM虚拟化技术(理论知识+搭建虚拟化平台实验步骤)
  14. 遥感或DEM像素深度如何降为8bit
  15. CCRC信息安全服务资质审核费用是多少?
  16. 为什么我劝90%的人不要转行数据分析?数据岗真没你想的那么香
  17. 使用 WebSphere ILOG JRules 开发保险应用系统【六】——同步BOM、Rule项目到teamserver,并部署Rule到bres上
  18. python 离群值_数据预处理初学者宝典:360° 掌握离群值识别
  19. 安装与使用IPy模块
  20. office2016激活后还显示激活页面的解决办法

热门文章

  1. 3D建模需要什么电脑配置?
  2. 神经网络的数据预处理,神经网络模型数据处理
  3. 技术委员会主席杨勇:下一代操作系统展望|2022云栖龙蜥实录
  4. 项目自动打包部署脚本
  5. 多线程之线程池的拒绝策略,以及生产环境如何合理设置参数(十二)
  6. Sumologic的Log Search语法及日志监控事件通知的设置
  7. p6spy——数据库日志追踪打印
  8. 2023年春国家开放大学思想道德与法治/思想道德修养与法律基础大作业答案
  9. 如何快速从几千封简历中筛选出适合的简历 ?
  10. gre计算机考试成绩查询,gre机考成绩查询