我的架构经验系列文章 - 后端架构 - 性能层面

性能层面:

  • 性能分析

我觉得性能分析的话要注意几个要点:

  1. 不要去猜:对于自己写的代码你是否知道你的代码要执行多久,是不是还在用时间相减来测试代码执行时间?现在有很多自动化的工具可以在程序运行的时候,测试代码中每一句语句的执行时间,可以有效分析出代码的性能瓶颈。对于比较重要的业务逻辑建议采用类似的工具来进行性能分析,有的时候性能慢的代码不一定是自己写的还可能是框架内提供的,如果没有一个丰富的编码经验是不太可能知道这些点的,但是通过这样的分析工具你就能知道这个地方会慢,虽然框架的代码我们不能改,但是我们可以进行缓存或者是可以换一种方法写。打个比方你可能认为获取当前机器的名字是很快的操作,但如果框架内部通过一定的操作系统接口访问这个操作需要5毫秒的话就很夸张了,很可能这个操作在你整个请求中运行了10次获取了10次机器名,那么不知不觉50毫秒就耗去了,这个时候你还以为是数据库慢,这就永远找不到问题所在了(解决就相对简单了只要缓存机器名就好了)。因此,除了加点方式来测算代码性能,更科学的是采用一些工具来测算,或许这个工具本身就是通过植入无数个加点代码来实现这种测算,但这总比自己一次又一次手动改代码来的好。总而言之,有一些性能问题不是你自己写代码引起的,或者是外部代码或者是框架内的代码,猜是猜不出来的。Web前端框架最佳选择!
  2. 注意区分优先级:一般我们可以认为硬件由CPU、内存和IO构成,其中IO分网络和磁盘,不管是网络还是磁盘其性能是最差的也是最可能达到系统中性能瓶颈的地方,知道这一点我们就知道了性能分析的优先级了,忽略数据库层面、网络层面的问题把时间浪费和纠结在for/foreach的性能这种纯语言层面的东西则不是那么有效果。这里举几个例子典型的立竿见影的性能相关的例子,同时也可以反映出通过一定的手段看到问题而不是去猜是多么有效:
    • 遇到过在使用ORM的时候ORM是乐观并发机制的,把所有的字段的值都作为where条件传了过去,有一个表有近百个字段当然更新的效率低了,通过查看体积到数据库的SQL语句就可以查明这个问题,解决的办法是不把相关字段列入检查或采用悲观并发。
    • 遇到过在使用Memcached客户端的时候没有把应该作为静态单例的工厂对象作为单例而是每次使用都创建一遍,导致每次都会花2秒创建一个连接池,性能极其低下,而且导致占用了几万个网络端口,通过基本的操作系统命令检查磁盘网络相关的参数即可查明这个问题,解决的办法是把工厂单例。
    • 遇到过一个程序只运行几个小时就会占用到10GB内存导致崩溃,看代码无法查明问题,通过在运行性能监视工具检测虚拟机不久就可以查明问题,解决的办法是修复这个BUG。
    • 一个网站使用的模板每次都是从网络上获取的,导致每次请求其实都在服务端再发起一次请求到其它网站去下载页面然后再处理,性能极其低下秒并发只能在10左右。要查明这个问题其实不难,运行一次就耗时1秒,对模板进行缓存即可解决问题。

  3. 注意观察日志:对于很多组件(比如Mongodb),在其初始化的时候都会对系统基本的配置进行检测,如果发现因为某个配置不合理组件无法达到最优会给出提示,因此要注意这些组件的日志,以便及早发现性能问题。Web前端框架最佳选择!

  • 压力测试

虽然说某些工具可以帮助我们分析程序性能,但是有一些性能问题必定是在高压力下才会产生的。很典型的就是为了线程安全使用的锁,不管是程序层面的锁还是数据库层面的表锁行锁,锁意味着串行,串行意味着在压力增大的情况下压力越大排队越厉害越慢。当然,压力测试还可能测试出因为多线程环境带来的线程安全问题。系统整体的性能是受最差的那个点拖累的,如果系统各个模块抗压能力差距很大的话,压力测试比较容易测出问题。作为网站开发我们应该有意识,对于普通的服务器,一般每秒能处理多少请求,一般每秒数据库能处理多少操作,有一个熟练级的认识,如果你发现经过压力测试,Web服务器每秒最大只能处理10个并发,那么系统肯定存在性能问题的。压力测试不但可以测试出系统的问题,还可以测试出一定的硬件条件下,系统可以承受的最佳的访问人数在多少,低于这个人数系统跑不满,超过这个人数系统的响应走下坡路,根据这个结果可以有理有据去选择集群的数量。

  • 线上问题排查

对于已经在线上的代码不太可能去运行什么性能分析工具,因为这些通过这些工具执行的代码会比直接运行代码慢好几倍,在线上这么做可能导致网站直接崩溃。Web前端框架最佳选择!

  1. 简单的办法可以通过加点,然后把代码灰度部署到某些机器查看日志来分析原因。
  2. 或者还可以直接到某台机器抓取进程样本来做静态分析(特别适合有虚拟机的语言)。通过抓取一个进程的样本可以了解进程中哪些对象占用了绝大部分内存,垃圾回收各个区的状态来分析内存性能问题。通过抓取多个进程样本可以比较哪些线程耗时比较厉害,耗时厉害多线程主要集中在执行什么代码来分析CPU性能问题。
  3. 除了这种内在的分析办法还可以通过外部来分析,比如通过Fiddler之类的工具来观察慢是因为网络原因还是因为并发数的原因还是因为服务端的原因。比如通过数据库的监控工具来监控每一个SQL语句的执行时间抓出最慢的SQL。比如通过观察虚拟机的状态,观察操作系统的性能指标,观察Windows的性能计数器等可以帮助判断大概存在的性能问题。
时间: 2024-08-01 17:10:42

我的架构经验系列文章 - 后端架构 - 性能层面的相关文章

我的架构经验系列文章 - 后端架构 - 框架层面

框架层面: SOA 在这一篇中会逐个介绍一下自己对这些XXX的理解,其实每一个理念都不是莫名其妙产生的而是有产生背景的,这些时髦的名词不是用来炫耀的,而是真正要理解它们是干什么的,并且框架千万不能乱用理念也千万不能乱用,并不是把所有的这些都用上你的系统才是一个牛逼的系统,一定要适合才是最好的,并且要保持简单可靠的原则.所谓SOA,字面上来说是面向服务的架构.有的人不说SOA其实他已经SOA了,有的人大谈SOA但其实只是在用Web服务,SOA可大可小.你可以认为服务调用就是SOA了,也可以认为服务

我的架构经验系列文章 - 后端架构 - 架构层面

架构层面: 日志集中 所谓日志集中就是把程序的所有日志和异常信息的记录都汇总到一起,在只有一台服务器的时候我们记录本地文件问题也不是最大,但是在负载均衡环境下再记录本地日志的话就出现问题了.在想查看网站日志的时候到哪台机器去查都不知道,难道有100台机器就100台机器逐一远程连上去看?因此,把这些数据汇总在一起保存对于大型网站系统来说是很必要的,这样我们就可以直接进行查看.搜索,也很明确可以知道是哪台机器的业务出了问题.至于这种日志数据是写到RDBMS还是NOSQL甚至是搜索引擎这就看需要了,总

我的架构经验系列文章 - 后端架构 - 设计层面

设计层面: 分层架构 分层架构是项目设计中很重要的一点,从根本的目的上来说就是为了职责的分离.最经典的三层架构,到四层五层六层,甚至有人开玩笑说十八层的分层,根据项目的需要可以分不同的层.这里说的层其实是逻辑层,从物理层的角度来说也有三层.四层五层的分层架构.之所以三层架构这么流行是因为它的分层把大的关注点进行了分离,层数恰到好处,表现层.业务逻辑层和数据访问层,分别处理面向用户呈现的.面向逻辑处理的和面向数据库存取数据的三大关注点.UI前端框架最新力作!有奖试读! 在分层架构中除了分层之外还需

我的架构经验系列文章 - 后端架构 - 系统层面

系统层面: 高可用性 所谓高可用性也就是通过避免单独故障加上快速故障转移实现一旦某台物理服务器出现故障能实现故障快速恢复.一般来说,可以采用两种方式,如果可以做业务可以做负载均衡则通过负载均衡实现集群,然后针对每一台服务器进行监控,一旦发生故障则从集群中移除:如果业务只能有单点入口那么可以通过实现Standby机加上虚拟IP机制,实现Active机在出现故障之后虚拟IP转移到Standby的快速故障转移.一般可以使用KeepAlived或HeartBeat实现高可用(当然,硬件手段实现也可以,这

我的架构经验系列文章 - 后端架构 - 语言层面

语言层面: 运行时元数据获取 所谓运行时元数据获取也就是在程序 运行的时候通过代码动态 获得类型.方法.属性的信息,然后可以动态获得属性的值,执行方法等等,在有的语言中称为反射.反射不一定是高效的,但是在写框架程序的时候反射是一种很有用的技术 ,并且反射的性能开销往往是可以通过诸如缓存等手段来最小化的.比如在ORM中,根据实体类的信息动态获得所有的属性,然后取得其值,生成要到数据库 中执行的SQL语句.理解反射熟练掌握反射的使用以及性能优化是编写框架类代码很重要的一点. 错误处理 任何后端语言都

我的架构经验系列文章 - 后端架构 - 安全层面

安全层面: SQL注入 SQL注入是一个古老的安全问题,现在任何程序都不应该再出现这样的问题了,其原理非常简单,在过去大多数程序都是直肠子通数据库的,因此如果拼接SQL并且在参数上没有做好过滤或者没有使用参数形式来生成SQL语句的话可能会导致用户在页面上输入的恶意代码直接在数据库中执行.SQL注入的危害点在于整个网站有1000个数据点,如果其中有1个点有漏洞那么整站的数据其实都有危险了,很多开发会注重资金相关的模块但是忽略新闻相关的模块,如果都是使用一套数据库的话那么一个不重要模块的漏洞就会影响

我的架构经验系列文章 - 前端架构

框架层面:近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越来越多框架性的东西出现了.越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情. MVC MVC实现职责分离是很好的,大多数网站在后端都会引入MVC框架,对于一个前端负责所有呈现和前端业务逻

mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)

一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/redhat-release 操作系统用户名和密码 root  js*2015 IP地址 172.168.18.201 ip addr 网关Gateway 172.168.18.1 cat /etc/sysconfig/network-scripts DNS 172.168.16.11 mysql 版本

NET架构设计、框架设计系列文章总结

NET架构设计.框架设计系列文章总结 从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以在发挥点价值作用. 架构设计: ElasticSearch大数据分布式弹性搜索引擎使用 (推荐) DDD实施经验分享-价值导向.从上往下进行(圈内第一个吃螃蟹DDD实施方案)(推荐) 软件工程-思考项目开发那些事(一)(推荐) SOA架构设计经验分享-架构.职责