代码改变世界

《性能之巅:洞悉系统、企业与云计算》笔记——应用程序

2025-10-23 11:25  第二个卿老师  阅读(0)  评论(0)    收藏  举报

《性能之巅:洞悉系统、企业与云计算》笔记——应用程序

作者: Brendan Gregg 第一版


性能调整离工作所执行的地方越近越好——最好在应用程序里


第五章 · 应用程序(Applications)

  • 基础概念: 需要理解应用程序活动的上下文,包括它的职能、特征、业界的生态

    • 性能目标:延时、吞吐量、资源使用率
    • 分析应用类型:CPU密集型或I/O密集型
    • 大O标记法:
      标记法 示例
      O(1) 布尔判断
      O(log n) 顺序队列的二分查找
      O(n) 链表的线性搜索
      O(n log n) 快速排序(一般情况)
      O(n^2) 冒泡排序(一般情况)
      O(2^n) 分解质因数;指数增长
      O(n!) 旅行商人问题的穷举法
  • 常用性能技术:

    • 选择合理的I/O大小
    • 使用缓存技术:提高读性能,需解决缓存一致性问题
    • 使用缓冲技术:提供写性能
    • 轮询机制:基于事件轮询,如Linux的epoll()
    • 并发和并行:使用多线程、多进程、协程技术,通过同步原语、哈希表来保障完整性与性能
    • 非阻塞I/O:协程技术
    • 处理器绑定。
  • 语言与运行时:

    • 编译语言:通过编译器优化
    • 解释语言:通过打印时间戳来研究
    • 虚拟机:通过自带工具集或第三方工具
    • 垃圾回收:调整相关参数,如Java虚拟机的垃圾回收
  • 方法与分析:

    • 线程状态分析:6种状态,执行(在CPU上);可运行(等待轮到上CPU);匿名换页((可运行,因等待匿名换页受阻);睡眠(等待包括网络、块设备和数据/文本换入在内的I/O);锁(等待获取同步锁);空闲(等待工作)
      • 执行:检查执行的是用户态还是内核态时间,剖析CPU资源消耗分析,使用top命令
      • 可执行:应用程序需要更多的CPU资源,看看是否存在资源控制,可使用perf sched工具
      • 匿名换页:使用内核的延时核算来测量(getdelay.c)
      • 睡眠:阻塞时间的测量,用pidstat -d判断、iotop观察阻塞时间
      • 锁:使用跟踪工具
    • CPU剖析:包括栈跟踪、函数采样等方法
    • 系统调用分析:
      • 断点跟踪:设置系统调用的入口和返回的断点,使用strace命令
      • 缓冲跟踪:不中断目标程序运行,数据缓冲在内核中,使用Dtrace跟踪
    • I/O剖析:检查I/O相关的系统调用执行的原因和方式,使用DTrace进行栈跟踪
    • 工作负载特征归纳:分析工作负载来验证问题
    • USE方法:可对应用程序组件中软件资源进行使用率、饱和度、错误的测量
    • 向下挖掘法:深入探究应用程序的内部操作,可使用跟踪工具
    • 锁分析:通过检查竞争、检查过长的持续时间来定位问题
    • 静态性能调优:主要关注环境配置,主要从版本、历史问题、配置参数、设计方式、运行机制、程序特征等方面

📌 总结感悟

根据个人理解,这里的应用程序应该指运行在操作系统之上的程序,包括应用软件、中间件、程序库与算法等等,由于应用的质量依赖各种因素,我们可以先从上到下依次分解,然后再自下向上测试

应用架构分析

  1. 应用组成分析,应用是属于单应用(单个程序组件)或是集成应用(由多个程序组件构成),比如一个网站由负载均衡器、web服务器、数据库、后端服务等多个程序组件构成
  2. 应用类型分析,它的表现是I/O密集型还是CPU密集型,单应用能简单的看出来,而集成应用可能需要结合业务模型,不同输入或者不同操作可能是不同的表现
  3. 应用生态分析,主要是了解当前版本的应用支持哪些操作?是否存在什么问题?,这些信息可能会提供额外的测试思路与方向

这一步我们需要针对应用从上到下梳理业务逻辑,找出相关的程序组件、用到的性能技术、对应的配置参数等等,即定义好我们的测试范围,另外这里能得到高楼老师提到的性能决策树中的组件清单

测试分析

  1. 单应用性能技术分析,了解应用所采用的性能技术,如算法、缓存、轮询机制、并发、配置参数等方面,来指导测试数据的生成与完善
  2. 确定测试方法,针对应用的环境设定、输入与负载情况,制定测试工具与脚本,并结合上一步分析,生成有效的测试输入数据

这一步我们需要针对单应用的特点,定义好我们的测试方法与策略,一般是根据数据链路的最下层开始依次向上分析,另外这里能得到高楼老师提到的性能决策树中的模块与计数器清单

性能分析

  1. 对于单应用,首先要找到应用最耗时的地方,通过线程的状态、占用的资源、执行的方法、相关的系统调用来定位性能问题
  2. 对于集成应用,在各单应用性能问题解决后,组合这些应用作为一个整体来进行分析,可以模拟工作负载来进行测试,找到整个链路中可优化的性能点

这一步我们先要解决单应用的瓶颈,即去掉集成应用中的性能短板,然后测试集成应用目前的性能情况是否符合当前目标,来指导后续任务进行,比如容量规划,另外这里要结合监控工具,即全局监控—>定向监控的瓶颈证据链