提高系统 10 倍性能的 10 个建议!

2020-06-02 09:41:00html

译者:为之漫笔
来源: http://www.zcfy.cc/article/10...
原文: https://www.nginx.com/blog/10...

升Web应用的性能从未像今天这样刻不容缓。java

在线经济活动的比例日益提升,就连发展中国家和地区的经济活动都已经有5%以上在线进行了(相关数据请参考本文后面的资源)。在这个超级连接、随时在线的现代世界,用户的指望也远非昔日可比。若是你的网站不能立刻响应,你的应用不能当即运行,用户转身就会投奔你的竞争对手。nginx

亚马逊大约10年前的一项研究代表,页面加载时间减小1/10秒,可以使其营收增加1%。另外一项近期的调查也显示,一多半受访站点全部者提到由于本身应用的性能不佳致使了收入减小或者用户流失。面试

一个网站到底多快才行?页面加载每花1秒钟,就有大约4%的用户走掉。排名最靠前的电商站点的首次交互时间为1至3秒,这个区间的转换率最高。显而易见,Web应用性能的重要性与日俱增。算法

提高性能其实不难,难的是怎么看到结果。本文给出可以提高大约10倍网站性能的10个建议供你们参考。如此全面地涵盖各类性能优化技术,这仍是头一回,但这些建议可能须要NGINX的一点支持。除了性能,这些建议也会涉及提高安全性。数据库

建议一:使用反向代理服务器让应用更快更安全后端

果你的Web应用只跑在一台机器上,那要提高其性能很是简单:换一台更快的,多配几个处理器,多加几条内存,磁盘阵列也要高速的。换了之后,这台机器上跑的WordPress服务器、Node.js或Java应用速度都会加快。(要是应用还会访问另外一台数据库服务器,那也简单:找两台更快的机器,用更快的网络连起来就好了。)浏览器

麻烦在于,机器速度并非问题。不少时候Web应用慢,是由于要在各类任务之间切换,一下子要处理数千个链接上的用户请求,一下子要向磁盘读写文件,一下子又要运行应用的代码,一下子又要去干别的。应用服务器所以可能出现各类情况,耗尽内存、交换文件,或者让不少请求等待一个硬盘I/O之类的任务。缓存

除了升级硬件,其实你还能够选择另一种彻底不一样的方法:加一台反向代理服务器,分担上述一些任务。反向代理服务器位于运行应用的机器以前,负责处理来自外网的请求。反向代理服务器直接连到互联网,它与应用服务器通讯使用的是快速的内部网络。安全

反向代理服务器可让应用服务器专一于构建页面,而后交给反向代理向外网发送,而没必要理会用户与应用的交互。因为没必要等待客户端的响应,应用服务器的运行速度能达到接近最优的水平。

增长反向代理服务器同时也能够为Web服务器增添灵活性。好比,假设执行某种任务的服务器过载了,那随时能够再增长一台同类服务器;而若是这台服务器挂了,替换它也很容易。

鉴于这种灵活性,反向代理服务器每每也是其余性能优化手段的先决条件,好比:

  • 负载均衡(参见“建议二”),反向代理服务器上运行负载均衡服务,把流量平均分配给几台应用服务器。有了负载均衡,添加应用服务器根本不须要修改应用。
  • 缓存静态文件(参见“建议三”),图片或代码之类的能够直接请求的文件,均可以保存在反向代理服务器中,以便直接发给客户端。这样不只能够更快地响应请求,还能减轻应用服务器的负担,加快其运行速度。
  • 保证站点安全,能够配置反向代理服务器提高其安全级别,经过它监控来快速识别和响应攻击,从而保存应用服务器安全。

NGINX专门为使用反向代理服务器作了设计,使其自然支持上述优化。因为使用事件驱动的处理机制,NGINX比传统服务器效率更高。NGINX Plus则增长了更高端的反向代理功能,如应用体检、特有的请求路由、高级缓存和售后支持。


传统服务器与NGINX Worker的比较

建议二:增长负载均衡服务器

加负载均衡服务器相对简单,但却能显著提高站点性能和安全性。经过它把流量分配给多个服务器,就能够没必要升级Web服务器了。就算应用自己写得不太好,或者难以扩展,负载均衡均可以在不作其余改变的状况下提高用户体验。

负载均衡服务器首先是一个反向代理服务器(参见“建议一”),负责把来自互联网的请求转发给其余服务器。这里关键在于负载均衡服务器能够支持两台以上的应用服务器,使用一种选择算法在不一样的服务器间分配请求。最简单的负载均衡算法是循环调度,即把新请求依次转发给可用服务器中的下一台服务器。其余算法还有把请求发给活动链接最少的服务器。NGINX Plus支持一种功能,就是把用户会话保持在同一台服务器上,叫作会话保持。

负载均衡服务器能够避免一台服务器过载而其余服务器过闲,从而极大提高性能。同时,有了它还可让Web服务器扩容更简单,由于能够选用比较便宜的服务器,同时保证物尽其用。

能够经过负载均衡调度的协议包括HTTP、HTTPS、SPDY、HTTP/二、WebSocket、FastCGI、SCGI、uwsgi、memcached,以及其余一些应用形式,包括基于TCP的应用和其余第四层的协议。为此,首先要分析Web应用,看性能短板在哪里,而后再肯定使用哪个。

同一台服务器或用于负载均衡的服务器也能够承担其余任务,好比SSL终止、视客户端不一样支持HTTP/1/x或HTTP/二、缓存静态文件。

NGINX常常被用来作负载均衡,更多信息请参考咱们之前发的介绍性文章、有关配置的文章、电子书和相关的在线视频,固然还有文档。咱们的商业版本NGINX Plus支持更多的负载均衡功能,如基于服务器响应时间路由负载和支持微软NTLM协议的负载均衡。

建议三:缓存静态及动态内容

存能提高Web应用性能,由于能够更快地把内容交付给客户端。缓存的策略包括预处理内容、在较快的设备上存储内容、把内容保存在靠近客户端的地方,以及同时运用这些策略。

缓存有两种。

  • 静态内容缓存,不常变化的文件,如图片(JPEG、PNG)和代码(CSS、JavaScript),能够保存在边缘服务器中,以便快速从内容或磁盘中获取。
  • 动态内容缓存,不少Web应用会为每一个页面请求生成全新的HTML,把生成的每一个HTML都缓存一小段时间,可能显著减小须要生成的页面总数,同时又能够保证交付的内容足够新鲜。

假设一个页面每秒被查看10次,而你缓存它1秒,那么90%针对这个页面的请求都未来自在缓存。若是你单独缓存静态内容,那么即便全新生成的页面,极可能大部分都来自缓存的内容。

缓存Web应用生成内容的技术主要分三种。

  • 把内容放到离用户近的地方。离用户近,传输时间少。
  • 把内容放到较快的机器上。机器快,检索速度快。
  • 把内容从过分使用的机器中拿走。有时候机器会比在专一执行特定任务时慢不少,那是由于太多任务让它们分心。这时候把内容拿到其余机器上,不只对缓存的内容有好处,对非缓存的内容一样有利,由于托管它们的主机的负担减轻了。

Web应用的缓存能够在Web应用服务器内部或外部实现。首先,考虑缓存动态内容,以减轻应用服务器的负载。其次,缓存用于静态内容(包括那些动态生成内容的临时副本),进一步减轻应用服务器的负担。而后,考虑把缓存转移到其余更快或更靠近用户的机器,给应用服务器减负,缩短传输时间。

用好缓存能显著加快应用的响应速度。对不少网页来讲,大图片之类的静态数据,每每占据一半以上的内容。不用缓存,查询和传输这类数据可能会花好几秒钟,而用缓存,则可能只要花几分之一秒。

能够举一个例子来讲明怎么使用缓存,NGINX和NGINX Plus经过两个指令来设置缓存:proxy_cache_path和proxy_cache指定缓存的位置和大小、最长缓存时间以及其余参数。使用第三个(也是很受欢迎的)指令proxy_cache_use_stale,甚至能够告诉缓存在原本应该提供新鲜内容的服务器太忙或宕机时,提供原来的旧文件,对客户端来讲,拿到内容总比拿不到强。从用户角度看,这样也能够树立你的站点或应用很是稳定的形象。

NGINX Plus支持高级缓存功能,包括缓存净化(caching purging)和经过控制板以可视化的形式展现缓存状态,实现实时监控。

要了解NGINX中关于缓存的更多信息,能够看看参考文档和NGINX Plus Admin Guide中的NGINX Content Caching。另外,关注微信公众号:Java技术栈,也能够获取我整理的 NGINX 教程,都是干货。

注意: 缓存涉及开发、决策和运维,完善的缓存策略,好比本文提到的这些,可以体现从DevOps角度考虑的价值。也说是说,开发人员、架构师、运维人员此时携手,共同保障一个网站的功能、响应时间、安全和业务目标。

建议四:压缩数据

缩一样能极大提高性能。图片、视频、音乐等文件都有很是成熟和高效的压缩标准(JPEG和PNG、MPEG-四、MP3),任何一个标准均可以把文件大小缩小一个数量级甚至更多。

文本文件,包括HTML(纯文本和HTML标签)、CSS和JavaScript代码,常常在不压缩的状况下传输。压缩这些数据对提高Web应用的感知性能有时候特别明显,尤为是移动用户的网络很慢又不稳定的状况下。

由于文本数据经过对于页面交互可以起到必要的支援做用,而多媒体数据则更可能是锦上添花的做用。聪明的内容压缩能够把HTML、JavaScript、CSS等文本内容的缩小30%以上,所以可以相应地减小加载时间。

若是你使用SSL,压缩又能够减小必须通过SSL编码的数据量,从而补偿了压缩这些数据的CPU时间。

压缩数据的方法很是多。好比,建议六中关于HTTP/2的部分就描述了一个新颖的压缩思路,特别适合首部数据压缩。还有一个关于文本压缩的例子,就是能够在NGINX中开启GZIP压缩。预压缩文本数据以后,可使用gzip_static指令直接发送.gz文件。

建议五:优化SSL/TLS

来越多的网站在使用Secure Sockets Layer(SSL)及后来的Transport Layer Security(TLS)协议。SSL/TLS经过加密从源服务器发送给用户的数据来提高网站安全性。Google会提高使用SSL/TLS的网站的搜索引擎排名,将有力地推进这一进程。点击这里了解SSL/TLS运行机制详解。另外,关注微信公众号:Java技术栈,也能够获取我整理的更多 HTTPS 教程,都是干货。

尽管采用率愈来愈高,但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(一般会下降性能),从响应速度方面看,多是一次倒退。点击这里了解HTTP/2详解。

谷歌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的大多数站点都在运行NGIN

X。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为例,能够从如下几方面考虑。另外,关注微信公众号:Java技术栈,也能够获取我整理的 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()被转载到了线程池。

提示 修改任何操做系统及周边设备的设置时,每次只修改一项,而后测试性能。若是该项修改致使了问题,或者并未提高性能,再改回去。

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

存应用高性能的关键是实时监控应用性能。必须实时监控特定设备及相应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服务器。使用优化的缓冲策略、使用活动链接,将耗时的任务转载至独立的线程池,能够显著提高性能。好比线程池能够将磁盘操做密集性任务的性能提高至少一个数量级。

但愿你们本身多尝试以上技术,也但愿你们分享本身在性能改进方面的心得。

推荐去个人博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

以为不错,别忘了点赞+转发哦!

相关文章
相关标签/搜索