陈显铭(山丘)

读完需要

6

分钟

速读仅需 2 分钟

陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构、服务化、性能优化等有深入的理解。参与支付宝支付链路核心系统,设计、调优应用系统关键能力, 高效、稳定保障系统平稳支撑大促。曾历经多年双十一大促,对于性能调优、构建高可用系统有丰富的实战经验。熟悉常见的性能优化模式,比如应用结构优化、链路级、单系统优化等多种优化方式。对于常见的压测模式,如单机压测、链路级压测都有深厚的积累。作为一名性能专家,以追求性能最大化为己任,与之相伴的自然是高技巧、高难度的代码优化。这也是一名性能专家的毕生追求。

本章希望通过对性能优化的模式进行总结,使读者了解常见的性能招式,并能通过这些招式,找到自己系统中的性能瓶颈点,或者当前应用所处的发展阶段及下一步可能演进的模式。

性能是驱动应用结构演进的主要动力之一,本文会通过应用结构的变化揭示性能是如何在不同阶段、以不同的结构驱动应用结构朝着下一个结构演进的。通过应用结构的发展也可以揭示,如何不做过度的设计,在应用尽量简化且不浪费企业资源的情况下支撑企业业务的发展。首先说明性能优化的价值。

1

性能优化的优缺点

对性能进行优化有如下几个优点:

  • 降低业务成本。

  • 提升系统稳定性。

  • 提升用户体验。

性能优化的缺点是可能会使维护成本增加,增加代码、结构及技术栈的复杂度。以上所讲到的性能优化的优缺点如图 17.1 所示。

图 17.1

2

性能优化的两种模式

纵观性能优化案例,性能优化整体上可以分为两类:单应用优化和结构型优化。

  • 单应用优化:关注单系统瓶颈,通过解决单系统瓶颈提升性能。

  • 结构型优化:通过改造链路结构和配比进行整体性能的优化。

3

单应用优化

3.1

优化基本思路

图 17.2

如图 17.2 所示,优化基本思路包含如下几个方面。

  • 确定性能瓶颈/热点。

  • 确定优化方案。

  • 实施优化方案并反馈优化情况。

3.2

确定性能瓶颈点/热点的常见方法

确定性能瓶颈点/热点的常见方法有如下两种。

  • 性能压测:通过工具、人工等方式量化运行时的性能情况。

  • 业务/代码梳理:通过代码走读发现资源消耗热点,通过统计代码对资源的操作量化代码对资源的消耗(比如一个业务操作会进行多少次数据库调用,进行多少次服务运算等方式)。

3.3

压测时通常观察的内容及其所使用的工具

以 Java 环境为例,压测时通常使用 JMeter 及 LoadRunner 发起压力测试并收集压测指标,使用 nmon 来检测 Linux 的性能情况。nmon 是一种在 AIX 与各种 Linux 操作系统上被广泛使用的监控与分析工具。除此之外,压测时通常观察的内容及其所使用的工具如下:

  • 内存的使用情况:MAT、GC 日志、vmstat。

  • I/O 情况:iostat。

  • 网络情况:Netstat。

  • 热点代码:JProfiler、BTrace、JStack、JStat。

  • CPU 情况:Linux top 命令。

3.4

常见的优化手段及模式

常见的优化手段及模式大概有如下几种。

  • 静态化:动态数据和静态数据分离。

  • 异步化:使用异步化减少主流程中的非关键业务逻辑。

  • 并行化:使用多线程并发处理,缩短响应时间。

  • 内存优化:减小对象所占空间,减少对象创建的数量,优化数据模型。

  • 去重复运算:优化业务逻辑,或者使用缓存。

  • 减少数据库操作:为此,需要减少数据冗余、数据缓存等。

  • 缩短数据库事务:可以考虑使用短事务、异步化、最终一致性等方式。

  • 精简代码逻辑:去除冗余代码,诸如重复判断的代码。

  • 精简日志操作:要关注日志大小,注意 I/O 上的瓶颈。日志太多,说明生成的 String 也会很多,会增加 GC 的负担。

4

结构型优化

此部分介绍的内容在很多网站架构变迁的文章中都会提到,下面通过图示的方式展现出来。每个阶段都有适用的软件架构,出于对建设复杂度、维护成本的考虑,不必强求一开始就建设出很完整的技术体系。个人认为,性能是驱动应用体系演进的重要驱动力,可以通过下面的应用结构演进看出来。单应用时代的常见瓶颈先发生在数据库上。由于所有的业务都存储在一个数据库(DB) 上,因此数据库的读写和性能是可能遇到的第一个问题,如图 17.3 所示。

图 17.3

单应用时代对此问题的第一个常见解决办法是使用缓存(偏向应用级别的缓存)。为了防止所有的数据读写都集中在数据库上进行,首先想到的就是通过缓存减少对数据库的压力,比如将配置数据全部加载到缓存(某些场景可以使用类似 LRU 的缓存)中,如图 17.4 所示。

图 17.4

单应用时代解决此问题的第二个办法是使用独立缓存服务(集中式缓存,如 MemCache),如图 17.5 所示。

图 17.5

单应用集中式部署带来了应用集群处理能力的提升,可以使应用进行水平扩展,如图 17.6 所示。

图 17.6

单应用集中式部署后的数据库瓶颈如图 17.7 所示。

图 17.7

单应用集中式部署后的数据库瓶颈的解决办法是对数据库进行拆分及读写分离,如图 17.8 所示。

图 17.8

为了应对更大范围的请求量,需要进行服务化拆分,由此进入多应用分布式服务化时代,如图 17.9 所示。

图 17.9

随着业务及数据的规模不断扩大,又逐渐进入多应用分布式服务集群化时代,此时依然存在一些问题需要解决,如图 17.10 所示。

图 17.10

5

两个结构优化的案例

5.1

处理单点/网络瓶颈的可行方式

通过去分布式调用进行去中心化,可以规避网络设备成为瓶颈和单点故障,如图 17.11 所示。

图 17.11

5.2

处理数据库连接池瓶颈的可行手段

增加数据处理中间层可以缓解数据库连接池的瓶颈,最好的处理方式是对架构进行服务化和单元化,将数据量大的数据库进行拆分,分散压力,如图 17.12 所示。

图 17.12

6

总结

对于小型企业的业务,通过进行较为简单的单系统优化,并辅助结构性优化,便能满足大部分企业的要求,如图 17.13 所示。但随着企业的业务量不断增加,单独的单机优化已经不能满足需求。分布式部署是中大型企业的必经之路,水平扩展、垂直拆分、服务化等方式是实现分布式部署的方式。

图 17.13

近年来,像阿里巴巴这类的大型一线互联网公司已经不再满足固定模式的水平扩展, 那么当一个机房的容量不足时要如何应对呢?一个城市的机房容量不足时又要如何应对?综合不断增长的业务述求,阿里巴巴这类公司正在实施单元化进程,根据一定的数据分片规则,使特定分片规则下的用户访问到特定单元化的应用系统,并通过不同城市的单元实现流量的自由切换和容灾。技术总是在不断更迭,今天的解决办法是明天的问题,也许单元化也不是最终的解决办法,总会涌现出越来越多的新挑战和应用模式。

- EOF -想要加入中生代架构群的小伙伴,请添加群合伙人大白的微信
申请备注(姓名+公司+技术方向)才能通过哦!扩展阅读
阿里专家马飞翔:一文读懂架构整洁之道2020-10-16DDD专家张逸:构建领域驱动设计知识体系2020-10-13
京东架构师闫文广:订单系统高可用架构及演变过程2020-10-12
架构师,是否需要写代码?2020-09-18
阿里高级技术专家箫逸:如何画好一张架构图?2020-09-07
大神手把手教你设计秒杀架构模型2020-09-06
阿里巴巴闲鱼架构负责人王树彬:万亿交易规模技术架构实践2020-09-05
阿里高级技术专家张建飞:应用架构分离业务逻辑和技术细节之道2020-08-31
波波老师大解密:如何成为优秀的架构师?2020-06-25
微信支付软件架构重构之旅2020-06-08
一个思维习惯,让你成为架构师2020-06-03
阿里P9专家右军:以终为始的架构设计2020-04-27END
#架构师必备#点分享点点赞点在看

蚂蚁集团技术专家山丘:性能优化的常见模式及趋势相关推荐

  1. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  2. 蚂蚁集团技术专家山丘:性能优化常见压测模型及优缺点

    陈显铭(山丘) 读完需要 6 分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高 ...

  3. mysql根据排序取前百分之二十_MySQL 性能优化 MySQL常见SQL错误用法

    1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样 ...

  4. Android 应用性能优化-StrictMode(严格模式)

    为什么80%的码农都做不了架构师?>>>    UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题. 如何防止应用程序出现AN ...

  5. strictmode android,Android 应用性能优化-StrictMode(严格模式)

    UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题. 如何防止应用程序出现ANR,怎么分析查看导致ANR问题的原因? 我们来介绍Android的 ...

  6. 资深架构师手把手教你性能优化

    图片来源:pexels.com 孔庆龙,一线架构师,具有多年的金融架构经验,具备 SOA 服务化.服务治理.系统优化.分布式系统项目经验.目前关注于互联网金融技术架构设计.分布式架构.微服务架构.De ...

  7. 没做性能优化,系统说炸就炸...

    航母哥 读完需要 2 分钟 速读仅需 1 分钟 目前就职于 58 研发中心担任资深架构师,负责消息中间件与全链路压测的实施与落地.前阿里巴巴消息中间件资深研发,架构师.擅长 Java 编程,对主流中间 ...

  8. 蚂蚁资深技术专家王旭:开源项目是如何让这个世界更安全的?

    王旭 蚂蚁资深技术专家 读完需要 10 分钟 速读仅需 1 分钟 在前不久的上海外滩大会上,蚂蚁资深技术专家.Kata Containers 创始人王旭向参会者分享了开源.开放协作与软件安全可信的话题 ...

  9. 蚂蚁集团俞仁杰:金融级云原生之多活容器集群高可用建设实践

    本文整理自蚂蚁集团金融云产品技术部SOFAStack产品专家俞仁杰在2020 GIDC全球互联网数据大会的分享.详细讲解了云原生架构下的多活高可用平台和产品建设相关经验和观点. 过去几年是云原生理念高 ...

最新文章

  1. 使用arthas采集火焰图
  2. X86/ARM 模拟器
  3. Linux中几个实用快捷键
  4. 连接驱动_在jdbc中完成对于jdbc参数、jdbc变量,加载驱动,创建连接的封装
  5. MySQL Replication需要注意的问题
  6. 详谈Hibernate框架关系映射!
  7. PKMS的queryIntentActivities分析
  8. sqlite的联表查询-转
  9. 提交表单上传照片预览
  10. DOS常用命令(和Linux对比)
  11. c#调用摄像头进行二维码扫码
  12. linux安装程序时Cannot uninstall XXX. It is a distutils installed project and thus we cannot accurately
  13. 手把手教你用GAN实现半监督学习
  14. 红帽linux安装intel(R) wifi link 5100 AGN总结
  15. 8086汇编(7、80x25彩色缓冲区)
  16. 福州大学866信号与系统初试经验分享
  17. Vue Echarts绘制世界地图
  18. Beaver‘s Calculator
  19. 这可能是未来第三大搜索引擎
  20. Pycharm如何打断点

热门文章

  1. python中shift函数rolling_【邢不行|量化小讲堂系列18-Python量化入门】简易波动指标(EMV)策略实证...
  2. for in range语句_Python 之旅5——for循环
  3. web 三联发票针式打印_不要买二手激光打印机,公开咸鱼卖家套路
  4. 计组之存储系统:2、SRAM(区别、栅极电容、双稳态触发器、DRAM刷新、地址复用)和DRAM(MROM、PROM、EPROM、EEPROM)
  5. 数据结构之图的应用:拓扑排序
  6. LeetCode:2. 两数相加(中等)
  7. (王道408考研操作系统)第三章内存管理-第二节1:虚拟内存管理基本概念
  8. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
  9. shell 获取字符串前两个字符串、获取字符串最后一个字符、去掉字符串最后一个字符、去掉末尾一个字符、去掉末尾两个字符
  10. shell 判断字符串最后一个字符