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

简介: 回到索引 http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html   性能层面: 性能分析 我觉得性能分析的话要注意几个要点: 不要去猜:对于自己写的代码你是否知道你的代码要执行多久,是不是还在用时间相减来测试代码执行时间?现在有很多自动化的工具可以在程序运行的时候,测试代码中每一句语句的执行时间,可以有效分析出代码的性能瓶颈。

回到索引 http://www.cnblogs.com/lovecindywang/archive/2012/12/23/2829828.html

 

性能层面:

  • 性能分析

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

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

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

 

  • 压力测试

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

 

  • 线上问题排查

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

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

 

 

作者: lovecindywang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
3天前
|
JavaScript 前端开发 数据库
优化后端性能:如何使用异步编程提升系统响应速度
异步编程已成为现代后端系统性能优化的重要策略。通过避免阻塞操作,异步编程可以显著提高系统的响应速度和并发处理能力。本文章深入探讨了异步编程的基本概念,比较了常见的异步编程模型,并通过实际案例演示如何在Node.js和Python中实现异步操作,以提升系统性能。
|
7天前
|
人工智能 边缘计算 Serverless
后端架构演变与未来趋势
本文旨在通过对后端架构的发展历程进行梳理,探讨从单体应用到微服务架构的转变过程及其背后的驱动因素。同时,分析当前后端技术中的热门话题如容器化、Serverless架构和人工智能集成等,并对未来可能的技术趋势进行展望。通过总结现有技术的优缺点及未来可能面临的挑战,为后端开发者提供有价值的参考。这也太棒了吧!
|
3天前
|
安全 持续交付 开发者
后端架构的演进之路
在当今技术日新月异的时代,后端技术的发展可谓一日千里。本文将探讨后端架构从传统的单体应用到如今流行的微服务架构的演变历程,以及这些变化如何影响软件开发的效率和质量。通过分析具体案例和技术细节,我们将一窥未来可能的技术趋势,并思考如何在快速变化的环境中保持竞争力。
|
14天前
|
设计模式 安全
如何利用命令模式实现一个手游后端架构?
在手游开发中,后端系统需处理大量玩家请求和游戏逻辑。为提升灵活性和可维护性,常采用设计模式,尤其是命令模式。该模式能封装请求,支持不同请求参数化、记录日志及撤销操作。主要需求包括支持多种操作(如登录、充值)、灵活添加新操作、记录操作日志及事务回滚。设计原则为高内聚低耦合、易于扩展和可维护性。核心组件有Command接口、具体命令类、Invoker和Receiver。实施方案包括定义Command接口、创建具体命令类(如登录命令)、实现Invoker(如游戏服务器)并集成到系统中。
24 10
|
9天前
|
缓存 运维 NoSQL
二级缓存架构极致提升系统性能
本文详细阐述了如何通过二级缓存架构设计提升高并发下的系统性能。
|
10天前
|
消息中间件 存储 缓存
后端开发之深入浅出微服务架构
在数字化时代的浪潮中,后端开发如同一座桥梁,连接着用户与数据的世界。本文将带你探索微服务架构的奥秘,从基础概念到实战应用,一步步揭开它神秘的面纱。我们将一起思考,如何在这个快速变化的时代,找到属于自己的节奏和方向。
23 2
|
19天前
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
|
25天前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
36 2
|
3天前
|
存储 缓存 关系型数据库
后端技术在现代软件架构中的关键作用
本文将深入探讨后端技术在现代软件架构中的关键作用,从其定义、重要性到具体应用案例,全面解析后端技术如何支撑复杂系统的高效运行。通过简明易懂的语言和条理清晰的结构,帮助读者理解后端技术的核心概念及其在实际项目中的应用。
13 0

热门文章

最新文章