什么是性能?
- Latency (延迟) - 关于时间 (Time)
- Bandwidth (带宽) - 关于速率 (Rate)
为什么性能重要?
- 针对有时间期限的任务 (Time deadline)
- 当计算资源和效率有限时 (Cost of computing resources)
- 针对能源有限的设备 (Energy cost)
计算机系统性能的表现:
- 复杂的组件间的相互作用。
- 对大规模数据的处理和预测。
性能评价:
通过更低的消耗获得更高的性能。
怎么去评价性能:
- 实际系统的测量
- 建模:(a) 通过软件模型模拟 (simulation) (b) 利用技术(techniques)进行分析建模
分析建模:
- 通过数学来表示系统。
- 模型的假设在实践中可能难以完全实现,因此精度可能较低。
- 模型参数易于更改。
- 提供关键见解,有助于验证模拟或实际测量的结果。
模拟:
- 是为模拟系统的关键特性而编写的程序。
- 可以轻松修改以研究参数变化的影响。
- 主要成本在于编写和运行模拟程序。
- 有时难以模拟系统的每一个细节,因此精度可能较低。
测量:
- 无需简化或假设。
- 为最可信的评价方法。
- 只在具体的系统或应用程序存在时有效。
- 结果只反映特定系统的信息。
- 实际系统参数难以更改。
- 测量活动可能会影响系统的正常运行。
- 这是一个既困难又耗时的过程,并需要特定的软件工具。
评价应用:
- 系统升级和设计:应用程序和设备的设计
- 分析现有系统:
1. 评估现有系统的性能状况和潜在瓶颈。
2. 容量规划:预测系统何时可能因未来的负载而饱和,并寻找经济有效的方法来推迟这一点。
例子:
系统在负载增加时的性能:
- 在膝点之前,系统的可扩展性呈线性。
- 当组件利用率达到100%时,达到饱和点 (saturation point)。
- 排队现象变得更加频繁。
系统性能:
-
研究整个系统堆栈的性能。
-
完全堆栈(full stack) -> 从应用程序到硬件的整个软件堆栈,包括系统库、内核、编译器。
-
应遵循软件项目的生命周期,从概念设计到开发再到生产部署。
-
在产品开发的第一步设定目标并创建性能模型。在出现问题后,不要将性能工程工作推迟。
-
容量规划:研究开发软件的资源占用,以查看设计如何满足目标需求。
-
云应用性能、金丝雀测试、蓝绿部署。
视角:
- 资源分析视角 -> 系统管理员。
- 工作量分析视角 -> 应用程序开发人员。
挑战:
- 主观性:磁盘输入输出的平均响应时间为1ms,这是好的还是坏的?
- 复杂性:缺乏明显的分析起点、级联故障、瓶颈。
- 多重原因:问题并没有单一的根本原因。
- 量化问题的严重程度。
指标(Metrics):
- 量化系统性能需要指标。
- 延迟:等待时间的度量。
- 它指任何操作完成所需的时间。
- 例:网站加载时间,从点击链接到屏幕绘制所需的时间。
- 可估算最大速度。
- 模糊术语:如网络中的连接延迟、请求延迟。
延迟例子:
数据库查询需要100ms,其中80ms用于磁盘读取。通过消除磁盘读取,延迟降至20ms。
可观察性:
- 使用具有观察性的工具了解系统,如:计数器(Counters)、剖析(profiling)、路径(Tracing)。
- 生产环境中的工具可能因为资源争用扰乱工作负载。
计数器(Counters)、统计(Statistics)、指标(Metrics)与警报(Alerts):
- 应用和内核提供状态和活动数据:如操作计数、延迟测量、资源利用率。
- 性能工具读取计数器以计算统计:如比率、平均值、百分位数。
- 监控软件支持创建基于这些指标的自定义警报。
剖析(Profiling):
- 使用抽样工具:如定时采集CPU上的代码路径样本。
- 可视化性能数据非常重要,如CPU flame graphs。
路径(Tracing):
- 基于事件记录:如捕获并保存数据或实时消费。
- 专用追踪工具:如Linux的strace或tcpdump。
- 通用追踪工具:如Linux的Ftrace, BCC, bpftrace。
- 插桩:静态插桩是硬编码的,而动态插桩则在软件运行时创建。
性能评估研究的步骤:
- 界定研究目标和系统边界。
- 列出系统服务和可能的结果。
- 选择性能指标。
- 列出系统和工作负载参数。
- 选择因素及其值。
- 选择评估技术。
- 选择工作量。
- 设计实验。
- 分析和解释数据。
- 展示结果并根据反馈进行调整。
Reference