网站性能优化的三重境界

news/2024/5/14 1:26:59/文章来源:https://blog.csdn.net/szu030606/article/details/7534458

这篇文章是关于网站性能优化体验的,性能优化是一个复杂的话题,牵涉的东西非常多,我只是按照我的理解列出了性能优化整个过程中需要考虑的种种因素。点到为止,包含的内容以浅显的介绍为主,如果你有见解能告知我那再好不过了。无论如何,希望阅读它的你有所收获。

 

我眼中的网站性能问题都反映了一个网站的“Availability”(中文叫做可用性,但是这个翻译也不足够达意),以往我的认识是,这个网站如果全部或者部分不可用,那是功能问题,但是如果响应慢、负载差,这才是性能问题;可是后来我逐渐意识到,性能问题涵盖的范围更广,我还没法给出一个准确定义,但是许多非业务逻辑错误引起的网站问题都可能可以算做性能问题,比如可扩展性差,比如单点故障问题。

 

 

在网站性能优化的最初阶段,也就是所谓的“第一重境界”,做局部的定位、分析和修正,考虑的仅仅是“优化”,这也是初涉性能优化问题的大多数人的认识。在问题发生以后,发现它和业务逻辑没有太大关系,就开始尝试寻找问题产生的原因并加以解决。

 

无论是网站无响应还是响应缓慢,还是响应曲线异常波动,比如,可以围绕CPU的使用问自己这样几个问题:

 

  • 从CPU使用看系统是否繁忙?
  • 如果系统繁忙,系统在做什么,为什么?(典型问题:HashMap不安全并发导致的死循环)
  • 如果系统空闲,那么瓶颈在哪里?(典型问题:IO无响应)
  • 如果响应波动,是否存在周期,周期是什么?(典型问题:连接迅速占满,每一周期批量超时断开一批)
  • 如果响应波动,性能到波谷时系统在做什么?
  • 是否有背景CPU使用?(即无压力下观察CPU的使用情况。典型问题:正执行的定时任务占用过多系统资源)

在这些问题中,情况虽然千变万化,简单地说,CPU的使用是核心,CPU使用率高,说明可能系统在实实在在地做事,反之,需要寻找其他瓶颈。通过结合进程、线程的快照,来初步确定问题的范围。CPU使用率低的情况居多而且容易定位,只需要寻找其他的系统瓶颈;CPU占用率偏高的问题往往比较不容易定位,虽然也有一些办法。关于具体性能问题的定位技术,这里不着过多笔墨,后续有机会详细介绍。

 

对于一个刚开始做性能优化的网站系统,下面的事情不妨都做一做,会有立竿见影的效果(如果你需要更多的建议,不妨参考这张图):

 

  • 对于使用的成熟的技术,技术社区、官方文档,往往会给出这种技术的白皮书或者优化指导,请参考。比如 Struts2的官方性能调优指南、Java6性能优化白皮书。
  • 平台和虚拟机调优。对于使用平台和虚拟机的项目来说,这是必须要做的,一个JVM的参数可以对系统有显著的影响。比如Linux下连接管理的参数,JVM关于堆大小分布的参数等等。
  • 前端审查。这里的审查指的是通过Page speed、YSlow等工具,以及一些业界通用的法则和经验(比如yahoo的若干条前端性能优化法则)来评估现有页面的问题。

从使用的工具上说,性能问题的定位很大程度上是面向操作系统、虚拟机系统的问题定位(这里有一些定位方法介绍)。从问题定位的时机上说,又可以分为:

 

  • 截取型:截取系统某个层面的一个快照加以分析。比如一些堆栈切面和分析的工具,jstack、jmap、kill -3、MAT、Heap Analyser等。
  • 监控型:监视系统变化,甚至数据流向。比如JProfiler、JConsole、JStat、BTrace等等。
  • 验尸型:系统已经宕机了,但是留下了一些“罪证”,在事后来分析它们。最有名的就是JVM挂掉之后可能会留下的hs_err_pid.log,或者是生成的crash dump文件。

 

 

好,暂时说到这里,下面来看第二重境界。达到这重境界意味着已经能够跳出“事后优化”的局限了,在设计和编码的过程当中,能够正式和全面地考虑性能的因素,比如:

 

  • 减少使用时间敏感的容器管理,而使用容量或数量敏感的容器管理。比如我往一个缓冲里面存放若干数据,一种设计是每10分钟flush入库一次,还有一种设计是数据到达10M大小的时候flush入库一次,通常情况下,你觉得哪个方案更可靠?
  • 线程的统一管理使用。我的经验是,10次对线程创建或者线程池的使用,往往就有5次是会出问题的。
  • 避免使用同步Ajax。同步Ajax会造成浏览器假死,直至响应返回。
  • 分析对同步、锁的使用。即便在一些有名的开源库中,我们也不止一次发现过不合理的同步设计,N多数据,单一的全局同步块(这是一种性能设计层面上的“中心化”),结果它就成为了瓶颈,改动还不容易下手,很麻烦。

对于不成熟的团队,建议能安排有经验的程序员把关设计文档和编码中的性能问题,把常见的问题列出来参考学习。

 

达到第二重境界还有一个明显的特征就是在软件流程的前中期就开始做性能目标的论证和性能问题的验证:

 

  • 性能切面分析。这指的是在系统设计初期,为了评估一个系统的性能表现,做出一个性能类似的系统原型,并对其做性能测试和评估,这时候因为性能问题而涉及到方案的变更,影响较小。据我所知,能够做到这一点的项目极少。在大多数团队中,依赖于架构师和掌握话语权的设计者依靠经验来避免性能问题带来的大的方案变更(或者,干脆摔一次跤,再进行痛苦的“重构”)。
  • 性能的自动化测试验证。这一步必须伴随着Coding进行才有较大的意义,以便尽早发现性能问题。
  • 设计和代码层面的评审。我的博客里面一再地强调评审的价值,不妨看看这篇和这篇。其实功能问题考虑得多、暴露得早,真正有危险的往往都是那些被忽视的非功能性问题,比如性能问题。

 

最后是第三重境界。达到这重境界的团队能够在早期规划构想阶段就将性能作为一个必备因素包含在内,这可不是随口说说的经验的估计,而是要有数据驱动的理论设计,比如做性能建模,根据市场大小、业务量、服务等级等等计算出性能的具体指标,并且在此要求下做合理的架构设计

 

这里涉及的东西有很多,除了数据,还需要有大量的思考,对于一个网站来说,不妨问问如下的问题:

 

  • 数据量会有多大,我该设计什么样的存储?一致性的要求又如何?
  • 实时性要求是怎么样的?用户可以接受多少时间的数据延迟?
  • 网站需要考虑到什么程度的可伸缩性?
  • 哪些流程的数据处理有性能风险,数据量是什么级别的?怎么解决这个问题?
  • 主要的业务时间消耗是怎样的,我需要设计怎样的业务流来满足?

所有的性能问题和其他一切非功能性问题一样,都是一定程度上的trade off,所以越优秀的设计者越需要思考,来规划这些问题的解决方案。在规划中因为性能问题而涉及到的因素有哪些,太多太多了,这里列了一些供参考。

 

要达到第三重境界还要能够预测性能问题。这就需要成熟的监控体系,监控系统的变化,尽快做出反应。

 

比如国内发生了重大事件,用户量陡增,监控系统能够及时识别出用户量监控曲线一个非常明显的跳跃过程(比如持续事件超过某个值,且曲线斜率超过某个值),发出告警,并且自动扩容来应付潜在的风险。这些,都是建立在常规的业务运营数据收集基础之上的,然后需要做数据挖掘,给出关键点。

 

再比如互联网应用“缓存为王”。对于缓存的设计,甚至很大程度上决定了应用的成败(如果你很有钱,靠大量的CDN这种非常规路线的另说,呵呵)。缓存的设计需要考虑到缓存的大小、分级、队列、命中率计算、生命周期、更新换页、数据分发、数据一致性和数据持久化等等问题,这些东西往往被很多只重视那些页面展示效果和功能的人所忽视,但如果你是优秀的设计者,你需要积累这些思考。

 

Think big。有这样一个真实的例子,我们曾经发现页面模板的OGNL性能不高(两次反射之故),遂在项目中把大部分OGNL表达式都改成了EL表达式,花了很多时间精力,性能也确实提高了,但是能提高多少呢?大概只有30%,这是一种细水长流的改进,对系统的破坏性不大,但是收效也不足以令人沾沾自喜,还失去了一些OGNL的灵活性。之后,我们换了一个思路,从大局入手,给页面划分区域,定制缓存框架,引入页面缓存能力,虽然整套方案有些复杂,但是这种架构上的进化,由于页面的生成或者部分生成直接命中了缓存文件,性能一下有了飞跃,提高了600%~800%。这就是Think big,从大处着想,见得到工程大块的结构,需要足够的视野、足够的经验和积累,可以带来显著的效果。

 

通常系统容量的设计都会要求到峰值容量以上,如果是像秒杀、抢购之类对性能要求非常高的系统,往往还存在一个问题:设计了这么大的容量,平时大部分时间业务量都比较小,这些资源浪费怎么办?(题外话:这大概也是Amazon涉足云存储和云计算的初始缘由吧)

 

同时,也要看到,性能因素也是一个网站系统发展的最大推动力,再细致的思考也难以兼容那么多未知的场景,不妨多在扩展性和兼容性上下下功夫,避免网站冷清痛苦,网站大热更痛苦。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_708070.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO艺术

SEO艺术 编辑推荐 在本书中,四位搜索引擎优化(SEO)领域最受瞩目的专家阐述了制订以及执行一个完善的SEO策略时应遵循的一些实用指南与最新技术。 基本信息 原书名: The Art of SEO原出版社: OReilly作者: (…

[个人网站搭建]·Django增加评论功能(Python3)

[个人网站搭建]Django增加评论功能 个人主页--> https://xiaosongshine.github.io/ 个人网站搭建github地址:https://github.com/xiaosongshine/djangoWebs 安装django插件 pip install django-contrib-comments配置settings.py INSTALLED_APP(#...,django_com…

阿里云官方网站免费套餐怎么抢

阿里云推出包含云服务器 ECS、负载均衡、云数据库 RDS、云数据库 Redis 版、云数据库 Mongodb 版、弹性公网 IP、CDN、对象存储 OSS、文件存储 NAS等40核心云产品,6个月免费使用何为免费套餐,其实就是让你先体验,觉得好用,易用&am…

IIS新建站点服务器,localhost能登录但是IP访问登录不了。

IIS服务器新建站点之后,浏览页面,服务器本地是可以登录,但是localhost换成IP就无法访问。其他站点IP却可以访问。 1.如果浏览直接失败,说明端口号需要更换。 2.如果出现IP不能访问,localhost能访问,需要在高…

解决: 网站访问报错 AccessDenied (阿里云 OSS + CDN )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 使用阿里云 OSS服务 CDN 服务后&#xff0c;直接用顶级域名访问个人站点失败&#xff0c;报错如下&#xff1a; <Code>Acces…

.NET技术+25台服务器怎样支撑世界第54大网站

摘要&#xff1a;同时使用Linux和Windows平台产品&#xff0c;大量使用静态的方法和类&#xff0c;Stack Overflow是个重度性能控。同时&#xff0c;取代横向扩展&#xff0c;他们坚持着纵向扩展思路&#xff0c;因为“硬件永远比程序员便宜”。 【编者按】StackOverflow是一个…

网站盈利的10种方式

如果你有自己的网站&#xff0c;而且已经有了不少的流量&#xff0c;你肯定会开始考虑如何通过这个网站来挣一些钱。 在这篇文章中&#xff0c;我会向大家介绍网站最常见的10种盈利方式。 1.按点击付费广告 在网站上展示一个按点击付费的广告横幅是最简单的盈利方式&#xff…

基于Ubuntu环境使用docker搭建对于中文识别的chineseocr_lite项目

光学字符识别&#xff08;OCR&#xff09; 光学字符识别&#xff08;OCR&#xff09;目前已经有了很广泛的应用&#xff0c;很多开源项目都会嵌入OCR 来扩展原有的能力&#xff0c;例如身份证识别、出入停车场的车牌识别、拍照翻译等等本文介绍的开源的中文 OCR 项目&#xff…

Ubuntu环境使用conda安装轻量级中文ocr开源项目chineseocr_lite,最简单的方式

问题 接使用docker的方式来创建项目所报的错误选中文件之后&#xff0c;界面不停的绕圈&#xff0c;显示不了对于图片的识别结果&#xff0c;并且监控界面上出现错误提示如下ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory&a…

基于Ubuntu使用docker的方式来搭建基于Yolo3+crnn的Chineseocr识别

Docker Docker简单易用&#xff0c;具体的安装和配置可以看我的或者其他人的博客 安装完之后&#xff0c;输入以下命令安装chineseocr并且开启服务 docker pull zergmk2/chineseocr docker run -d -p 8080:8080 zergmk2/chineseocr 在浏览器输入http://127.0.0.1:8080/ocr网…

实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建

Github地址 Github源码地址 支持系统:mac/ubuntu python3.6 实现功能 文字检测&#xff1b; 文字识别&#xff1b; 支持GPU/CPU&#xff0c;CPU优化&#xff08;opencv dnn&#xff09; docker镜像服务&#xff08;CPU优化版本&#xff09; 下载镜像 链接:https://pan.baidu…

使用javascript实现对于chineseocr的API调用

ChineseOCR在线API 网页地址 界面 提供多种接口调用方式&#xff0c;比如在线调用、Javascript api调用、curl api调用和python api调用四种方式&#xff0c;本次使用javascript api调用的方式进行OCR识别在线Javascript工具 在线工具网页链接在线Base64 转化工具 在线工具…

使用python实现对于chineseocr的API调用

ChineseOCR在线API 网页链接 界面 提供多种接口调用方式&#xff0c;比如在线调用、Javascript api调用、curl api调用和python api调用四种方式&#xff0c;本次使用javascript api调用的方式进行OCR识别在线Base64 转化工具 Base64在线小工具代码修改 新增一个变量fill_w…

使用多线程的方式调用chineseocr_API

ChineseOCR在线API 网页链接 界面 提供多种接口调用方式&#xff0c;比如在线调用、Javascript api调用、curl api调用和python api调用四种方式&#xff0c;本次使用javascript api调用的方式进行OCR识别代码 import glob import base64 import os import requests import …

PaddleOCR和ChineseOCR的对比

PaddleOCR和ChineseOCR的对比 ChineseOCRPaddleOCR 对比 识别时间 chineseOCR识别的速度相对于PaddleOCR较慢&#xff0c;单纯使用CPU对于单张图片的识别时间可以达到20秒&#xff0c;如果使用GPU识别的时间一般控制在5秒以内&#xff08;图片包含的文字比较少的情形&#x…

window电脑查看ssh公钥,以及将自己的公钥添加到Github等类似网站

查看本机的ssh公钥 使用命令 cd ~/.ssh使用命令 ls 可以看到 id_rsa id_rsa.pub known_hosts 三个文件&#xff0c;此处需要的是id_rsa.pub文件使用命令 cat id_rsa.pub 查看文件的内容拷贝这段内容 添加自己的公钥 进入账户的设置页面参照如下步骤&#xff0c;进入SSH Key…

Linux系统运维1 运维 项目研发 网站 服务器 计算机基础 Linux操作系统

运维的基本概念 运维行业前景 企业运作模式 四大部门 项目研发流程 职责描述&#xff1a; 运维的作用&#xff1a; 网站的相关概念 网站运行流程&#xff1a; IP<–>域名 重要概念&#xff1a; 服务器图片&#xff1a; 服务器&#xff1a;为用户提供服务的机器&…

postman 不安全网站_接口工具分析(apipost、jmeter、postman)

一、接口都有哪些类型&#xff1f;接口一般分为两种&#xff1a;1.程序内部的接口 2.系统对外的接口系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把 数据库共享给你&#xff0c;他只能给你提供一个他们写好的方法来获取数据…

北大青鸟java y2_Struts-2 北大青鸟 Y2学年 项目案例使用 2框架开发租房网站 Java Develop 249万源代码下载- www.pudn.com...

文件名称: Struts-2下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 10225 KB上传时间: 2016-01-03下载次数: 0提 供 者: 姜鹏详细说明&#xff1a;北大青鸟 Y2学年 项目案例使用Struts 2框架开发租房网站-My English LOW文件列表(点击判断是否您需要的文件&#xff0c…

危险!!!也许你的web网站或服务正在悄无声息地被SQL注入

2010年秋季,联合国官方网站遭受SQL注入攻击。 2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故…