建议1、利用反向代理服务器加速和保护应用 若是 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器、内存、快速磁盘阵列等等。而后在这台新电脑上运行 WordPress 服务、Node.js 应用、Java 应用等等,会比之前快不少。(若是应用须要访问服务器,方案仍是很简单:换两台更快的电脑,用更快速的链接把它们链接起来。) 但电脑速度可能不是问题所在。一般 Web 应用运行缓慢,是因为电脑一直在不一样的任务间切换:同成千上万的客户交互、访问磁盘上的文件、执行应用代码和其它的任务。应用服务器可能会由于下面这些问题而崩溃 —— 内存耗尽、把不少的数据从内存交换到磁盘上、以及不少请求都在等待一个相似磁盘 I/O 的单个任务。 你应该采用一种彻底不一样的方式,而不是升级硬件:增长一个反向代理服务器来分担这些任务。这台反向代理服务器设置在运行应用的电脑以前,用来处理网络流量。只有这台反向代理服务器直接连到网络上,它和应用服务器经过一个快速的内部网络进行通讯。 利用这台反向代理服务器,应用服务器就不用等着和 Web 应用的用户进行交互,它能够专一在创建网页,并经过反向代理服务器把它们发送到网络上。由于应用服务器没必要再等待客户的响应,因此能以最优的速度运行。 增长一台反向代理服务器也增长了 Web 服务器的弹性。若是一台服务器过载了,很容易增长另外一台同类型的服务器。若是一台服务器宕机,也很容易把它换掉。 由于反向代理服务器带来的灵活性,它也成为了不少其它性能提高方法的先决条件,好比: 负载均衡(查看 建议二)—— 反向代理服务器上运行一个负载均衡器,把流量平均分配给一堆应用服务器。因为负载均衡器的引入,在增长应用服务器时能够彻底不用修改应用程序。 缓存静态文件(查看 建议三)—— 直接请求的文件,好比图片或者代码文件,能够存在反向代理服务器上,并直接发送给客户端,这样能够更快地提供服务,分担了应用服务器的负载,可让应用执行得更快。 保护网站 —— 反向代理服务器能够设置较高的安全级别,经过监控进快速识别和响应攻击,这样就能够把应用服务器保护起来。 NGINX 软件是专门设计用作反向代理服务器的,具备上述这些附加功能。NGINX 利用事件驱动处理的方法,比其它传统的服务器更加高效。NGINX Plus 增长了更多反向代理的高级功能和支持,包含应用程序健康检查、特定请求路由和高级缓存等 建议2、增长一个负载均衡器 增长一个负载均衡器是一个相对简单的改动,并且会大幅度地改善网站的性能和安全性。你能够利用负载均衡器把业务分配给一些服务器,而不是建造一台更大更强的 Web 核心服务器。就算应用程序编写得很烂或者扩展性不好,负载均衡器都能提高用户体验而不须要任何其它的改动。 负载均衡器首先是一个反向代理服务器(查看建议一)—— 它接收网络流量,并把请求转交给另外一个服务器。一个窍门就是让负载均衡器支持两台以上的应用服务器,利用一个选择算法在服务器间分配请求。最简单的方法就是轮询,每一个新请求发送给列表中的下一台服务器。其它方法包括把请求发送给活动链接数量最少的服务器。NGINX Plus 能够在同一台服务器上维持一个给定的用户会话,这个功能被称为会话持久性。 负载均衡器能够极大地改善性能,由于它们避免让一台服务器过载,而其它服务器却处于空闲的状态。它们也很容易扩展 Web 服务器的能力,增长相对便宜的服务器并确保它们物尽其用。 负载均衡能够运用在不少协议上,包含HTTP、HTTPS、SPDY、HTTP/2、WebSocket、FastCGI、SCGI、uwsgi、memcache,还有一些应用程序,包含基于 TCP 的应用和 L4 协议。分析 Web 应用使用了什么技术和性能落后在什么地方。 同一台服务器或者用于负载均衡的服务器,还能处理其余任务,包含 SSL 终端、支持客户端使用的 HTTP/1/x 和 HTTP/2、以及缓存静态文件。 NGINX 一般被用于负载均衡:想了解更多,请参考这些资料,一篇介绍性的文章、一篇关于配置的文章、一本电子书和相关的网络课程和相关文档。咱们的商业版本(NGINX Plus),支持更多负载均衡的特殊功能,好比基于服务器响应时间的路由规划,和基于微软 NTLM 协议的负载均衡。(译者注:NTLM 是NT LAN Manager的缩写,NTLM 是 Windows NT 早期版本的标准安全协议。) 建议3、缓存静态和动态内容 缓存经过更快地向客户端提供内容来改善 Web 应用的性能。缓存包含一些策略:对内容预处理以便更快地发布、在更快的设备上保存内容、在更靠近客户端的地方保存内容,或者上述方法的组合。 有两种不一样类型的缓存须要考虑: 静态内容的缓存。不常常变化的文件,好比图像文件(JPEG,PNG)和代码文件(CSS,JavaScript),能够存在一个边缘服务器上,以便在内存或磁盘上进行快速检索。 动态内容的缓存。不少 Web 应用为每一个页面请求生成新的 HTML。经过简单地将已经生成 HTML的副本保存一小段时间,就能够大幅度减小须要生成页面的总数,发布这些已经生成的 HTML 副本已经足够知足需求了。 好比一个网页每秒有十次访问,把它缓存 1 秒钟,这个网页 90% 的请求均可以用缓存知足。若是你单独缓存静态内容,甚至最新生成的网页也会大量包含这些缓存的内容。 Web 应用生成缓存内容主要有三种技术: 让内容更靠近用户。内容副本靠近用户,能够减小传输时间。 把内容存在更快的电脑上。内容能够保存在更快的电脑上以便加快检索。 把内容移出过载的电脑。有时候电脑运行一个特定任务比基准性能要慢,这是由于它同时还在忙其余任务。把缓存设置在另外一台电脑上,都能提高有缓存资源和没有缓存资源的性能,由于这台主机再也不过载了。 设置 Web 应用的缓存从 Web 应用服务器开始,是从内到外来实现的。首先,缓存动态内容,减轻了应用服务器的负担。接下来,缓存静态内容(包括本来是动态内容的临时副本),进一步分担应用服务器的负担。而后把缓存从应用服务器移到更快的、距离用户更近的电脑上,这样卸下了应用服务器的负担,减小了检索和传输的时间。 提升缓存能够大大加快应用程序。大多数网页中,一半以上的内容都是静态数据(好比大的图像文件)。在没有缓存的状况下,检索和传输数据可能要花费好几秒钟,但若是数据缓存在本地,只须要几分之一秒就能够。 举一个例子说明实际上如何使用缓存,NGINX 和 NGINX Plus 用两条指令来建立缓存:proxy_cache_path 和 proxy_cache。你指定了缓存的位置和大小、文件保存在缓存的最长时间和其它参数。使用的第三条指令(也至关经常使用),proxy_cache_use_stale,甚至能够在服务器忙碌或挂掉而不能提供最新内容的状况下,由缓存直接提供过时的内容,给客户端提供一些东西总比什么都没有强。从用户的角度来看,这会大大改善网站和应用的正常运行时间。 NGINX Plus 有一些高级的缓存功能,包括支持缓存清除,和将缓存状态可视化并显示在 dashboard 上,用于监控实时活动。 关于 NGINX 缓存的更多信息,能够参考相关文档和 《NGINX Plus 管理指南》的「NGINX 内容缓存」章节。 注意:缓存跨越了组织间的界限,让从事应用开发的人、进行资本投资决策的人和维护网站的人都参与其中。成熟的缓存策略就像这里提到的,很好得体现了DevOps 方式的价值,也就是应用程序员、架构师和运维人员等各方力量都团结起来,努力达成对网站的功能、响应时间、安全性和业务结果(好比完成的交易量或销售额)的要求。 (译者注:DevOps 不只仅是一种软件的部署方法。 它经过一种全新的方式,来思考如何让软件的做者(开发部门)和运营者(运营部门)进行合做与协同。) 建议4、压缩数据 压缩是一个有巨大潜能的性能加速器。已经有不少精心设计和高效的压缩标准,有针对图像的(JPEG 和 PNG)、视频的(MPEG-4)、音乐的(MP3)等等。这些标准均可以大幅减小文件的大小。 文本数据 —— 包含 HTML(包含了纯文本和 HTML 标签)、CSS 和相似 JavaScript 的代码,这些数据一般不通过压缩就进行传输了。压缩这些数据会大大改善对 Web 应用性能的体验,特别是那些链接缓慢或受限的移动客户端。 这是由于用户在和网页交互时,文本数据一般已经足够了,而多媒体数据就须要更多的支持。智能内容压缩能够减小 HTML、Javascript、CSS 和其它文本内容对带宽的要求,一般是 30% 或者更多,从而减小加载时间。 若是使用 SSL,压缩能够减小 SSL 加密的数据量,从而减小一些 CPU 时间。(译者注:SSL,Security Socket Layer,加密套接字层,一种加密的通信协议,用在客户端与服务器之间。参考建议五。) 压缩文本数据的方法有所不一样。好比,本文的 HTTP/2 章节提到的一种新颖的文本压缩方案,专门用来压缩头部数据。另外一个例子是能够在 NGINX 中打开 GZIP。对文本数据进行预先压缩后,能够经过 gzip_static 指令直接提供 .gz 的压缩文件(给客户端)。 建议5、优化 SSL/TLS 加密套接字层(SSL)协议及其后继者 —— 传输层安全(TLS)协议,被愈来愈多得的网站所采用。SSL/TLS 加密了服务器发送给用户的数据,提高了网站的安全性。影响这一趋势的部分缘由是,Google 如今提高了启用 HTTPS 网站的搜索排名。 尽管 SSL/TLS 愈来愈广泛,它们倒是影响许多网站性能的症结所在。SSL/TLS 下降网站性能有两个缘由: 每当打开一个新的链接,最初的握手都须要创建加密密钥。浏览器使用 HTTP/1.x 和服务器创建多条链接,随着服务器的增多,链接会成倍增长。 服务器上加密数据,客户端解密数据,这些都是持续的开销。 为了鼓励使用 SSL/TLS,HTTP/2 和 SPDY (在下一章节详细介绍)的做者在设计协议时,让每一个浏览器会话只使用一个链接。这样大大减小了 SSL 开销的一个重要来源。可是,在提高基于 SSL/TLS 的应用性能方面,仍是有不少能够作的事情。 优化 SSL/TLS 的机制因 Web 服务器而有所差异。好比,NGINX 使用 OpenSSL,运行在标准硬件上,提供相似专用硬件解决方案的性能。NGINX SSL 性能解决方案有详细的文档、减小了 SSL/TLS 加解密对 CPU 和 时间的消耗。 此外,这篇文章中还详细介绍了提高 SSL/TLS 性能的各类方式。简单总结一下,这些技术包括: 会话缓存。使用 ssl_session_cache 指令,缓存 SSL/TLS 加密每一个新链接所使用的参数。 会话标签或 ID。这些特定 SSL/TLS 会话信息都存在一个标签或 ID 中,因此能够顺畅地重用一个链接,而不须要再次握手。 OCSP 封装。缓存 SSL/TLS 证书信息,来缩短握手时间。(译者注:OCSP,Online Certificate Status Protocol,在线证书状态检查协议(RFC6960),用来向 CA 站点查询证书状态,好比是否撤销。一般状况下,浏览器使用 OCSP 协议发起查询请求,CA 返回证书状态内容,而后浏览器接受证书是否可信的状态。这个过程很是消耗时间,由于 CA 站点有可能在国外,网络不稳定,RTT 也比较大。那有没有办法不直接向 CA 站点请求 OCSP 内容呢?OCSP 封装(stapling) 就能实现这个功能。简单原理就是浏览器发起 client hello 时会携带一个 certificate status request 的扩展,服务器看到这个扩展后将 OCSP 内容直接返回给浏览器,完成证书状态检查。因为浏览器不须要直接向 CA 站点查询证书状态,这个功能对访问速度的提高很是明显。 ) NGINX 和 NGINX Plus 能够用在 SSL 或 TLS 终端上 —— 当和其它服务器进行明文通讯时,对客户端流量进行加解密。按照这些步骤设置 NGINX 或 NGINX Plus,就能用在 SSL 或 TLS 终端上。当用在接受 TCP 链接的服务器上,NGINX Plus 还有特别的设定步骤。 建议6、实现 HTTP/2 或 SPDY 对于已经使用 SSL/ TLS 的网站而言,由于 HTTP/2 和 SPDY 中的一个链接只须要一次握手,因此它们颇有可能提高性能。对于没有使用 SSL/TLS 的网站,改到 SSL/TLS 会让性能变慢, 而 HTTP/2 和 SPDY 对 SSL/TLS 的性能改进,就和性能降低的效果抵消了。 (译者注:SPDY,一种开放的网络传输协定,由Google开发,用来传送网页内容。基于传输控制协议(TCP)的应用层协议 。Google最先是在Chromium中提出该协议。目前已经被用于Google Chrome浏览器中来访问Google的SSL加密服务。SPDY并非首字母缩略字,而仅仅是”speedy”的缩写。) Google 在 2012年 引入 SPDY ,以实现比 HTTP/1. x 更快的性能。HTTP/2 基于 SPDY,最近刚被采纳为 IETF 标准。SPDY 已被普遍支持,不过很快就要被HTTP/2 所取代。 SPDY 和 HTTP/2 的关键特性是仅用一条单一链接而不是多条链接。这条链接是被复用的,同时能够有多个请求和应答在上面传输。 这些协议充分发挥了单条链接的最大功效,避免了 HTTP/1.x 须要创建和管理多条链接的开销。使用单条链接对于 SSL 特别有帮助,由于这样最大程度地减小了 SSL/TLS 创建一个安全链接所需的握手次数,由于握手一般是比较耗时的。 SPDY 协议须要使用到 SSL/TLS,HTTP/2 的官方说法是不须要用到它们,可是目前支持 HTTP/2 的浏览器只有在 SSL/TLS 被打开的状况下,才会用到 SSL/TLS。也就是说,只有当一个网站使用 SSL 而且它的服务器接受 HTTP/2 流量时,一个支持 HTTP/2 的浏览器才可使用 SSL/TLS。不然,这个浏览器仍是基于 HTTP/1.x 进行通讯。 一旦实现了 SPDY 或者 HTTP/2,你就再也不须要传统的 HTTP 性能优化方法,好比区域切分、资源整合和雪碧图。(译者注:image spriting,工做原理是一堆的图像(称为“sprites”,精灵)合并成一张大的图像(国内称为雪碧图),以达到减小 HTTP 的请求数量)这些改动让代码和部署变得更加简单,也更容易管理。要了解 HTTP/2 上相关改动的更多信息,能够参考这篇白皮书。 NGINX 做为支持这些协议的一个例子,从一开始就支持 SPDY,目前不少使用 SPDY 的网站都在运行 NGINX。 NGINX 很早就支持 HTTP/2 了,2015 年 9 月 NGINX 的开源版本 和 NGINX Plus 就已经支持了。 咱们 NGINX 但愿有朝一日大部分网站均可以使用 SSL,并迁移到 HTTP/2。这会提高安全性,同时因为找到和实现了新的优化方法,代码会更加简洁并且性能更好。 建议7、更新软件版本 一个提高应用性能的简单方法,就是为软件技术栈选择稳定的、性能好的组件。此外,高质量组件的程序员愿意加班追求性能的提高和尽快修正 bug,因此最好使用软件最新的稳定版本。新的发布会获得程序员和用户社区的更多关注。新版本还会利用最新的编译器优化技术,包含对新硬件的优化。 稳定的新版本一般都兼容老版本,并且有更好的性能。若是你持续更新软件,很容易享受到性能优化、bug 修正和安全报警等诸多好处。 一直使用软件的老版本,还会让你不能使用到新功能。好比,上面提到的 HTTP/2 如今须要使用 OpenSSL 1.0.1。从 2016 年中开始,HTTP/2 就须要使用 OpenSSL 1.0.2,OpenSSL的这个版本是在 2015 年 1 月发布的。 NGINX 用户可使用最新版本的 NGINX 开源软件或者 NGINX Plus,新功能都包含其中,好比套接字切分和线程池(查看下面),并且性能还在持续优化中。接下来仔细查看技术栈的软件,并尽量快地使用最新的版本。 建议8、优化 Linux 性能 如今大多数 Web 服务器的底层操做系统都是基于 Linux 的,因此 Linux 做为基础设施的基础,在性能提高方面有很大的空间。默认状况下,不少 Linux 系统被优化成尽量少地占用资源,以便适应一般的桌面工做。这意味着 Web 应用程序用例至少须要进行最大性能的优化。 Linux 针对 Web 服务器所作的优化。以 NGINX 为例,在加速 Linux 时,须要考虑这些重要的改动: 缓冲队列。若是有的链接看上去没有响应了,试着增大 net.core.somaxconn 看看,这个参数表明能够排队等待的最大链接数。若是已存在的链接限制过小,你会看到错误消息,能够逐渐增大参数直至错误消息消失。 文件描述符。NGINX 在每一个链接上使用两个文件描述符。若是系统要服务不少链接,须要增大 sys.fs.file_max 和 nofile 这两个参数以应对增长的负载,前者是系统范围内文件描述符的限制,后者是用户文件描述符的限制。 临时端口。看成为代理时,NGINX 为每一个上行服务器建立了临时端口。你能够经过设定 net.ipv4.ip_local_port_range,来增长端口值的可用范围。你还能够设定 net.ipv4.tcp_fin_timeout,减小超时来从新使用一个不活跃的端口,以便更快地周转。 你能够查看《NGINX 性能优化指南》(伯乐在线正在翻译中),了解如何优化 Linux 系统,以便能绝不费力地处理大量的网络流量。 建议9、优化 Web 服务器的性能 不管你使用哪种 Web 服务器,都须要为 Web 应用性能对它进行优化。下面的建议广泛适用于任何一个 Web 服务器,但有一些是针对 NGINX 的特别设定。这些优化的关键点包括: 访问日志。能够把请求记录先缓存在内存中,而后一块儿写入磁盘,而不是把每笔请求马上写到磁盘上。NGINX 使用 access_log 指令和 buffer=size 参数,在内存缓冲填满时,把日志记录写入磁盘。可使用 flush=time 参数,在特定时间后将缓冲内容写入磁盘。 缓冲区。缓冲区能够将一部分应答保存在内存中,直至缓冲被填满了,这样会让与客户端以前的通讯更加高效。不能存入内存中的应答被写入磁盘,这样会致使性能的降低。当 NGINX 缓冲打开的时候,你能够经过 proxy_buffer_size 和 proxy_buffer 这两个指令来进行管理。 客户端保活时间。保持链接能够减小开销,特别是使用 SSL/TLS 的时候。在 NGINX 上,你能够经过增长 keepalive_request 的最大数量,来设定客户端在指定链接上的请求数量,这个参数的默认值是 100 ,你还能够增长 keepalive_timeout 让链接在打开状态上持续得更久一些,从而更快地响应后续的请求。 上行保活时间。上行链接也就是指连到应用服务器、数据库服务器等这些链接,它们也能够从保持链接中受益。对于上行链接,你能够增大 keepalive,这个参数表示每一个工做进程中有多少空闲的保活链接是处于打开状态的。这样会增长重用链接的数量,减小打开全新链接的需求。保活的更多信息,参考这篇文章。 限制。限制客户端所使用的资源也能提高性能和安全性。NGINX 能够经过 limit_conn 和 limit_conn_zone 指令限制一个给定源的链接数量,limit_rate 指令则用来限定带宽。这些设定能够阻止一个合法用户“占用”资源,也能够防止攻击。limit_req 和 limit_req_zone 指令限制客户端的请求。对于上行服务器的链接而言,能够在上行配置段中,使用 server 指令和 max_conns 参数。这样限制了链接到上行服务器的数量,能够防止过载。相关的 queue 指令建立了一个队列,当 max_conns 限制超过期,能够在必定时间内保存必定数量的请求。 工做进程。工做进程负责处理请求。NGINX 采用了基于事件的模型,以及和操做系统相关的机制,高效地把请求分配给工做进程。work_processes 的推荐值是在每一个 CPU 上设定为 1。绝大多数系统出于须要,会在保证安全的前提下提升 work_connections (默认值 512)的最大值,你能够经过实验来找到适合系统的值。 套接字切分。一般用一个单独的监听套接字将新链接分配给各个工做进程。套接字切分会为每一个工做进程建立一个监听套接字,当监听套接字可用时,内核会把链接分配给它们。这样在多核系统中能够减小对锁的竞争和提高性能。执行 listen 指令时配合 reuseport 参数,就能够打开套接字切分的功能。 线程池。任何一个计算机进程均可能被一个慢速操做所拖累。对 Web 服务器软件来讲,访问磁盘会拖累不少快速的操做,好比在内存上进行计算或者复制信息。当一个线程池被引入,能够把这个慢速操做分配给一个独立的任务,主进程仍然处理快速操做。磁盘操做完成后,结果再返回给主进程。 在 NGINX 中会把 read() 和 sendfile() 这两个系统调用分散到线程池上。 小提示:当改动任何系统或服务上的设定时,一次只修改一个设定,而后再测试性能。若是这个改动形成问题,或者没有让网站变快,把它改回来就行了。 关于优化 NGINX 的更多信息,请参考这篇文章。 建议10、监控实时活动来解决问题和瓶颈 开发和发布高性能应用的关键,在于密切和实时地关注应用程序在现实状况下的性能。你必须可以监控特定设备的活动和网站的基础设施。 大多数监控网站的活动都很被动 —— 它只告诉你将会发生什么,让你本身去发现问题和解决问题。 监控能够抓到不一样类型的问题。它们包含: 服务器宕机。 服务器不稳定,容易掉线。 服务器大几率出现缓冲失效。 服务器发送的内容不正确。 你可使用 New Relic 或 Dynatrace 这种全球性的应用性能监控工具,来监控遥远地方加载页面的时间,也能够利用 NGINX 监控应用程序的发布。当你考虑是否须要给基础设施扩容来维持流量时,应用性能数据能够告诉你这些优化是否真能给用户带来很大的改善。 NGINX Plus 增长了检查应用程序健康的功能 —— 综合一些按期重复性的操做,以及在问题发生时报警,这样能够快速地定位和解决问题。NGINX Plus 还有会话耗尽功能 —— 当任务完成后终止新的链接,以及慢启动的能力 —— 容许负载均衡集群中的一台服务器,从刚修复的状态慢慢遇上来。若是使用得当,健康检查能够在发生影响用户体验的重大问题前,就定位出问题。会话耗尽和慢启动,容许更换服务器,并保证在过程当中不会对性能和正常的运行时间形成很差的影响。下图是一个在 NGINX Plus 中集成了实时活动监控的 dashboard,上面显示了Web 基础设施和服务器、TCP 链接以及缓存等相关信息。 总结:如何看到性能提高 10 倍 能用在每一个 Web 应用上的性能提高方法千差万别,而且最后的效果也取决于预算、付出的时间和已有的实现等等。那么如何让你本身的应用达到性能提高 10 倍的目标呢? 虽然大家遇到的状况确定会不同,为了帮助理解每种优化方法的影响,这里列出一些上面详细讨论的要点: 反向代理服务器和负载均衡。若是没有作负载均衡,或者负载均衡作得很烂,都会形成性能不好。增长一个反向代理服务器,好比 NGINX,就能够防止 Web 应用在内存和磁盘间往复切换。负载均衡能够将处理从过载的服务器移到其余可用的服务器上,而且很容易进行扩展。这些改动能够大幅度地提高性能,和如今实现的最差状况相比,很容易实现 10 倍的性能提高,但实质上总体性能的提高可能没有这么大。 缓存动态和静态内容。若是有一个服务器已通过载了,它既是 Web 服务器又是应用服务器,经过缓存动态内容就能够在峰值时刻提高 10 倍的性能。缓存静态文件也能实现个位数字的性能提高。 压缩数据。利用多媒体文件的压缩格式,好比图片采用 JPEG 格式、图像采用 PNG 格式、电影采用 MPEG-4 格式、音乐采用 MP3 格式,这样就能在很大程度上提高性能。一旦这些格式都用上,压缩文本数据(代码和 HTML)的页面加载速度能够提高 2 倍。 优化 SSL/TLS。安全握手对性能有很大影响,因此优化它们能够带来 2 倍的改善,特别是文本不少的网站。在 SSL/TLS 条件下,优化多媒体文件改善很小。 实现 HTTP/2 和 SPDY。当和 SSL/TLS 一块儿使用时,这些协议会让整个网站的性能大幅度地提高。 优化 Linux 和 Web 服务器软件(例如 NGINX)。优化缓冲区、保持链接、将耗时的任务分散到一个独立的线程池上都能大幅提高性能。好比线程池运用在对磁盘操做频繁的任务上会带来指数级的提速。