《性能之巅:洞悉系统、企业与云计算》第一章(绪论)和第二章(方法)的笔记,请参考Part 1,第三章(操作系统)的笔记,请参考Part 2,第四章(观测工具)的笔记,请参考Part 3,本文是第五章——应用程序。
性能调整离工作所执行的地方越近越好:最好在应用程序里。应用程序包括数据库、Web服务器、应用服务器、负载均衡器、文件服务器等。
应用程序能变得极其复杂,尤其是在涉及众多组件的分布式应用程序环境中。研究应用程序的内部通常是应用程序开发人员的领域,会涉及第三方工具自测。对于研究系统性能的人员,包括系统管理员,应用程序性能分析包括配置应用程序实现系统资源最佳利用、归纳应用程序使用系统的方式,以及常见问题的分析。
基础
对应用程序进行性能调优前,请先回答下面这些问题:
- 功能:应用程序的角色是什么?数据库、Web服务器、负载均衡器、文件服务器、对象存储?
- 操作:应用服务器服务哪些请求,或执行什么操作?数据库服务查询(和命令)、Web服务器服务HTTP请求等。这些可以用速率来度量,用以估计负载和做容量规划;
- CPU模式:应用程序是用户级的软件实现还是内核级的软件实现?多数的应用程序是用户级别的,以一个或多个进程的形式执行,但是有些是以内核服务的形式实现的(例如,NFS);
- 配置:应用程序是怎样配置的,为什么这么配?这些信息能在配置文件里找到或用管理工具得到。检查所有与性能相关的可调参数有没有改过,包括缓冲区大小、缓存大小、并发(进程或线程)、其他选项
- 指标:有没有可用的应用程序指标,如操作率?可能是用自带工具或第三方工具,通过API请求,或通过处理操作日志得到
- 日志:应用程序创建的操作日志是哪些?能启用什么样的日志?哪些性能指标,包括延时,能从日志中得到?例如,MySQL支持慢请求日志,对每一个慢于特定阈值的请求提供有价值的性能细节信息;
- 版本:应用程序是最新版本吗?在最近的版本发布说明里有没有提及性能的修复和性能的提升?
- Bugs:应用程序有Bug数据库吗?你用的应用程序版本有什么样的性能Bug?如果你当前有一个性能问题,查找Bug数据库看看以前有没有发生过类似的事情,看看是怎样调查的,以及还有没有涉及其他内容。
- 社区/书/专家:应用程序相关的资源和文档?
目标
设立性能目标能为你的性能分析工作指明方向,并帮助你选择要做的事情。
- 延时:低应用程序响应时间
- 吞吐量:高应用程序操作率或数据传输率
- 资源使用率:对于给定应用程序工作负载,高效地使用资源。
常见情况的优化
一个能有效提高应用程序性能的方法是找到对应生产环境工作负载的公用代码路径,并开始对其优化。
观测性
操作系统最大的性能提升在于消除不必要的工作,应用程序也一样。
大O标记法
大O标记的示例
标记法 | 示例 |
---|---|
O(1) |
布尔判断 |
O(logn) |
顺序队列的二分搜索 |
O(n) |
链表的线性搜索 |
O(nlogn) |
快速排序(一般情况) |
O(n^2) |
冒泡排序(一般情况) |
O(2^n) |
分解质因数、指数增长 |
O(n!) |
旅行商人问题的穷举法 |
应用程序性能技术
提高应用程序性能的常用技术:选择I/O大小、缓存、缓冲区、轮询、并发和并行、非阻塞I/O、处理器绑定。
选择I/O尺寸
执行I/O的开销包括初始化缓冲区、系统调用、上下文切换、分配内核元数据、检查进程权限和限制、映射地址到设备、执行内核和驱动代码来执行I/O,以及,在最后释放元数据和缓冲区。初始化开销对于小型和大型的I/O都是差不多的。从效率上来说,每次I/O传输的数据越多,效率越高。
增加I/O尺寸是应用程序提高吞吐量的常用策略。考虑到每次I/O的固定开销,一次I/O传输1