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文件合并不至于对项目维护造成影响,那么最好将它们合并。

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

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

服务器端性能问题

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容