Introduction
系统性能focus
系统性能考虑的范围从硬件 到操作系统 到库 到应用程序全栈。
如果是分布式系统还需要多个服务器整体考虑。
目的是优化用户的体验。降低计算消耗。
可以:减少低效操作、增加系统吞吐量、tuning。
可以考虑的内容:
用户层: 应用 数据库| 系统库| 编译器
内核层: 内核:进程调度 文件系统 网络栈 虚拟内存 设备驱动
分析切入点
- workload analysis
从应用软件给的负载往下深入分析。应用->库->系统调用->内核->硬件设备 - resource analysis
从设备资源开始下向上分析。
挑战
- 技术是客观性的,但是性能好不好基本上是 主观感受。一般我们会设置一些具体的目标来让他变得客观。
- 系统复杂,缺少明确的分析起始点。并且可能子系统存在交互、共因问题或级联故障。解决一个性能瓶颈可能把问题推给了另外一级。线上线下环境不一样,还难复现。解决性能问题需要很多知识,系统内外很多工具。
- 不只一个root cause。 问题有很多造成因素。
- 性能issue太多了,有很多甚至是已知但是不修的。这时候分辨关键的性能issue很重要。
Latency 延时
延时是重要的性能指标,表示完成任何一个操作的时间。
延时需要具体的限定条件,描述是什么部分的延时。
可观测性 Observability
三大工具:
- counter
- profiling
- tracing
不包括benchmark tools(比如加负载,主动改变系统状态)
Counters, Statistics, and Metrics.
系统里面有各种计数器
以硬件或者软件的方式提供各种统计数据。次数、百分比、平均数等等。
设定一个指标,隔一段时间监控一次。超过就报警。是常用手段。也可以画图来可视化。
举例:
vmstat
指令,读取/proc下的计数器,可以画表,显示CPU占用。
其他人可能做工具套在外面,实现可视化(比如曲线图)。
还有人可能在可视化外面再套一层,来做alert.
有时候,与时间关联的metric有用,比如你看到某个软件状态变了或则配置变化的时候指标发生变化。可以找到问题。
但很多时候,metric只能说告诉你系统的某一块现在有问题,却没法告诉你原因
Profiling
按照一定时间间隔周期性采样,绘制目标的粗略特性图。
比如:周期采集on-cpu的质量路径
火焰图就是个例子
Tracing
Tracing是基于事件的记录。
基于特殊目的:
- 系统调用:Linux Strace
- 网络packets: Linux tcpdump
通用的可以分析可执行文件和硬件事件的:
- Linux Ftrace
- BCC
- bpftrace
Static Instrumentation
在源代码中写死的软件指令。或者说监测点。
在Linux 内核中有很多,磁盘IO 调度器事件、系统调用等等很多。在Linux里面叫做 trace points。
用户应用程序里也有类型的机制,叫USDT( user statically defined tracing )。这主要是通过库来实现,比如libc。
例子:
execsnoop
可以打印在tracing期间,检测到的execve这个系统调用的tracepoint。来显示新进程创建。这个对短寿命进程很有用。
Dynamic Instrumentation
所谓动态,指的是在软件运行的过程中,在已经存在于内存中的指令之中插入监控的指令。这有点类似于调试器在代码运行过程中插入断点。断点会把程序流指向调试器,但是dynamic instumentation是把插入的routine走完之后回到应用程序代码继续执行。
BPF
目前风头最盛的Linux动态tracing工具。
他在内核里植入了一个小型的虚拟机来加速tcpdump。2013年开始被扩展为eBPF。成为了一套内核环境,可以安全快速地访问资源。
具有 BCC(BPF Compiler Collection)编译器和bpftrace(前端)。前面的execsnoop就是大佬Brendan基于这个做的小工具.
实验
与观测工具相对的, 是实验工具.大多数是前面所说的benchmark工具.
benchmark工具分为宏观的和微观的.
宏观: 系统整体表现,比如车跑某赛道一圈的时间.
微观:针对某一特定对象的属性,比如最高车速.
观测和实验,是性能分析的两只手.不能只用一只手解决问题.
云计算
在云计算时代,清楚的知道自己要多少资源,需要购买多少云服务,直接就可以省钱.
带来的问题是,某一个人申请的云虚拟资源,可能在物理上和附近的其它人的云服务器公用磁盘IO这样的硬件资源。会受到莫名其妙的影响。并且不好分析。
Linux Perf Analysis in 60 Seconds
Table 1.1 Linux 60-second analysis checklist
Tool | Check |
---|---|
uptime | 平均负载,查看负载增减趋势 |
dmesg -T|tail | 内核错误及OOM(out of meory)事件 |
vmstat -SM 1 | 系统整体统计数据, run queue length, swapping, overall CPU usage. |
mpstat -P ALL 1 | Per-CPU balance: a single busy CPU can indicate poor thread scaling. |
pidstat 1 | 每个进程的CPU占用,识别不需要的CPU消耗,以及用户/系统 各个进程的CPU时间。 |
iostat -sxz 1 | 磁盘IO统计,IOPS和吞吐量,平均等待时间,percent busy。 |
free -m | 包括文件系统在内的存储使用 |
sar -n DEV 1 | 网络设备IO,包和吞吐量 |
sar -n TCP,ETCP 1 | TCP 统计,连接率 retransmits |
top | overview |