web项目瓶颈优化思路

Web网站优化三部曲:应用程序优化、系统结构优化、网络优化。

应用程序优化

一个Web应用,不管是何种语言开发,粗略的结构无非是三层:

页面模板

可以是JSP、ASP、PHP等页面技术,根据数据生成最终的HTML页面,性能关键指标只有一个,页面的渲染速度。综合各种页面技术而言,渲染速度相差不会太大,10倍以内。

业务逻辑

用于根据业务需要将数据库中的数据读取到内存中,以便通过页面模板渲染成HTML页面。这里面可能还包括缓存、连接池等技术。

数据库

就是数据库,负责执行SQL查询并返回查询结果。

我们假设用户访问一个页面,也就是请求一个URL地址,然后得到内容,所需要的时间是3秒钟。其中大部分时间可能用在网络传输上,而真正页面执行并生成HTML内容所需的时间是很小的,这里假设需要100毫秒。相当于用户花了两秒多钟在传输数据上,这部分时间如果能缩减,可以大大提升访问的速度,但是这部分一般也难以提升了,因为取决于用户本身的网络情况,服务器的网络情况以及中间整个路由的情况。对于一个网站来说,能做的就是尽可能的提升服务器的带宽,或者使用CDN来减少中间路由环节,很不幸的是,这个成本很高。

找出应用的性能瓶颈?

前面我们提到的结构中的三层:页面模板,业务逻辑和数据库,根据经验值,在这100毫秒中,三个部分占用的时间差不多为:页面模板(5%)、业务逻辑+数据库(95%)。

几个准则

少优化页面模板或使用合适的模版引擎技术

这都是一些很成熟的技术,就算你好不容易提升了10%的性能,这10%在整个页面的执行过程中只占了0.5%的比例,微乎其微。

一般瓶颈所在以及相应处理办法

数据库连接:使用连接池来减少连接次数

重复的数据库查询:使用缓存来避免重复的数据库查询

慢查询:使用索引来提升查询速度,使用连接查询替换子查询等

系统结构优化

在系统进行优化前,必须先对应用程序进行优化。

常用系统级别优化

1.静态文件和动态页面分开处理

2.应用服务器的集群

3.数据库的集群

4.利用反向代理服务器加速和保护应用

因为反向代理服务器带来的灵活性,它也成为了很多其它性能提升方法的先决条件,比如:

负载均衡—— 反向代理服务器上运行一个负载均衡器,把流量平均分配给一堆应用服务器。由于负载均衡器的引入,在增加应用服务器时可以完全不用修改应用程序。

缓存静态文件—— 直接请求的文件,比如图片或者代码文件,可以存在反向代理服务器上,并直接发送给客户端,这样可以更快地提供服务,分担了应用服务器的负载,可以让应用执行得更快。

保护网站 —— 反向代理服务器可以设置较高的安全级别,通过监控进快速识别和响应攻击,这样就可以把应用服务器保护起来。

NGINX 软件是专门设计用做反向代理服务器的,具有上述这些附加功能。NGINX 利用事件驱动处理的方法,比其它传统的服务器更加高效。NGINX Plus 增加了更多反向代理的高级功能和支持,包含应用程序健康检查、特定请求路由和高级缓存等

5.增加负载均衡器

增加一个负载均衡器是一个相对简单的改动,而且会大幅度地改善网站的性能和安全性。你可以利用负载均衡器把业务分配给一些服务器,而不是建造一台更大更强的 Web 核心服务器。

负载均衡器首先是一个反向代理服务器—— 它接收网络流量,并把请求转交给另一个服务器。一个窍门就是让负载均衡器支持两台以上的应用服务器,利用一个选择算法在服务器间分配请求。最简单的方法就是轮询,每个新请求发送给列表中的下一台服务器。其它方法包括把请求发送给活动连接数量最少的服务器。NGINX Plus 可以在同一台服务器上维持一个给定的用户会话,这个功能被称为会话持久性。

6.缓存静态和动态内容

缓存通过更快地向客户端提供内容来改善 Web 应用的性能。缓存包含一些策略:对内容预处理以便更快地发布、在更快的设备上保存内容、在更靠近客户端的地方保存内容,或者上述方法的组合。

静态内容的缓存-----不经常变化的文件,比如图像文件(JPEG,PNG)和代码文件(CSS,JavaScript),可以存在一个边缘服务器上,以便在内存或磁盘上进行快速检索。

动态内容的缓存-----很多 Web 应用为每个页面请求生成新的 HTML。通过简单地将已经生成 HTML的副本保存一小段时间,就可以大幅度减少需要生成页面的总数,发布这些已经生成的 HTML 副本已经足够满足需求了。

比如一个网页每秒有十次访问,把它缓存 1 秒钟,这个网页 90% 的请求都可以用缓存满足。如果你单独缓存静态内容,甚至最新生成的网页也会大量包含这些缓存的内容。

Web 应用生成缓存内容主要有三种技术:

让内容更靠近用户------内容副本靠近用户,可以减少传输时间。

把内容存在更快的服务器上------加快检索。

把内容移出过载的服务器------有时候运行一个特定任务比基准性能要慢,这是因为它同时还在忙其他任务。把缓存设置在另一台电脑上,都能提升有缓存资源和没有缓存资源的性能,因为这台主机不再过载了。

设置 Web 应用的缓存从 Web 应用服务器开始,是由内到外的。

首先,缓存动态内容,接下来,缓存静态内容(包括原本是动态内容的临时副本),然后把缓存从应用服务器移到更快的、距离用户更近的电脑上,这样卸下了应用服务器的负担,减少了检索和传输的时间。提高缓存可以大大加快应用程序。大多数网页中,一半以上的内容都是静态数据(比如大的图像文件)。在没有缓存的情况下,检索和传输数据可能要花费好几秒钟,但如果数据缓存在本地,只需要几分之一秒就可以。

7.压缩数据

压缩是一个有巨大潜能的性能加速器。已经有很多精心设计和高效的压缩标准,有针对图像的(JPEG和 PNG)、视频的(MPEG-4)、音乐的(MP3)等等。这些标准都可以大幅减少文件的大小。

文本数据 —— 包含 HTML(包含了纯文本和 HTML 标签)、CSS 和类似JavaScript 的代码,这些数据通常不经过压缩就进行传输了。压缩这些数据会大大改善对 Web 应用性能的体验,特别是那些连接缓慢或受限的移动客户端。

这是因为用户在和网页交互时,文本数据通常已经足够了,而多媒体数据就需要更多的支持。智能内容压缩可以减少 HTML、Javascript、CSS和其它文本内容对带宽的要求,通常是 30% 或者更多,从而减少加载时间。

如果使用 SSL,压缩可以减少 SSL加密的数据量,从而减少一些 CPU 时间。(译者注:SSL,Security Socket Layer,加密套接字层,一种加密的通讯协议,用在客户端与服务器之间。参考建议五。)

8.优化SSL/TLS

加密套接字层(SSL)协议及其后继者—— 传输层安全(TLS)协议,被越来越多得的网站所采用。SSL/TLS加密了服务器发送给用户的数据,提升了网站的安全性。影响这一趋势的部分原因是,Google 现在提升了启用 HTTPS 网站的搜索排名。

尽管 SSL/TLS 越来越普遍,它们却是影响许多网站性能的症结所在。SSL/TLS 降低网站性能有两个原因:

每当打开一个新的连接,最初的握手都需要建立加密密钥。浏览器使用 HTTP/1.x 和服务器建立多条连接,随着服务器的增多,连接会成倍增加。

服务器上加密数据,客户端解密数据,这些都是持续的开销。

总结:如何看到性能提升

能用在每个 Web 应用上的性能提升方法千差万别,并且最后的效果也取决于预算、付出的时间和已有的实现等。那么如何让你自己的应用达到性能提升的目标呢?

(1)  反向代理服务器和负载均衡。

增加一个反向代理服务器,比如 NGINX,就可以防止 Web 应用在内存和磁盘间往复切换。负载均衡可以将处理从过载的服务器移到其他可用的服务器上,并且很容易进行扩展。很容易实现性能提升,但实质上整体性能的提升可能没有这么大。

(2)  缓存动态和静态内容。

(3)  缓存静态文件。

(4)  压缩数据。(2倍提升)

(5)  优化 SSL/TLS。

安全握手对性能有很大影响,所以优化它们可以带来 2 倍的改善,特别是文本很多的网站。在 SSL/TLS 条件下,优化多媒体文件改善很小。实现 HTTP/2 和 SPDY。当和 SSL/TLS 一起使用时,这些协议会让整个网站的性能大幅度地提升。

(6)  优化 Linux 和 Web 服务器软件。优化缓冲区、保持连接、将耗时的任务分散到一个独立的线程池上都能大幅提升性能。比如线程池运用在对磁盘操作频繁的任务上会带来指数级的提速。

网络优化

主要是增加服务器带宽,cup性能、内存等。

(1)   OSPF

(2)   LVS四层

(3)   接入层

(4)   服务层

这里先不不作说明。

其它

前端性能问题

雅虎专门研究网页性能问题的工程师发现,一个页面从请求到加载完,80%的时间都花在前端上。事实也是如此,所以优化一个网站首先应从前端性能优化下手。

使用多域名增加最大并发数

浏览器只对单个域名限制并发数,而不对单个IP限制并发数,所以可将一个IP地址映射到多个域名,然后使用这些域名访问网站资源,这样原本浏览器的并发数为6,使用两个域名并发数就可以达到12个了。但需要注意的是,域名并不是越多就越好的,因为域名解析也需要花费时间,而且并发数太多也会耗费客户端太多的CPU,域名数量到了一定程度,网页性能就会开始下降,所以在应用中需要根据实际情况寻找一个平衡点。如果不是特别需要,一般2到4个为佳。

通过文件压缩等方式降低单个文件的大小

对于JS文件,可以通过工具对其进行压缩,去除不必要的空格、换行符等。对于图片文件,优先考虑使用CSS来代替,实在不行可以考虑对图片进行裁剪。对于页面文件,尽可能使用Html标签而不使用服务器控件以减少ViewState长度,将内联的javascript和CSS放到单独的文件中,尽可能使用长度较小的字符串来作为控件ID值。

合并JS和CSS文件减少并发数

如果将两个JS文件合并不至于对项目维护造成影响,那么最好将它们合并。

使用图片延迟加载技术减少并发数

所谓图片延迟加载,就是每次只加载当前屏幕可见区域的图片,其余的图片在用户滚动页面到该位置后才开始加载。

服务器端性能问题

影响服务器端的性能是多方面的,包括软件架构、服务器硬件配置等等各方面,如果编码的时候多注意一下,也能够给性能提升带来帮助。

推荐阅读更多精彩内容