4.1 工具类型
性能观测工具可以按照系统级别和进程级别来分类,多数的工具要么基于计数器要么基于跟踪。还有一些性能工具是基于剖析的。
4.1.1 计数器
内核维护了各种统计数据,称为计数器,用于对事件计数。
系统级别:
vmstat
mpstat
iostat
netstat
sar
进程级别:
ps
top
pmap
4.1.2 跟踪
跟踪收集每一个事件的数据以供分析。跟踪框架一般默认是不启用的,因为跟踪捕获数据会有cpu开销,另外还需要不小的存储空间来放数据。
系统级别:
tcpdump
snoop
blktrace
iosnoop
execsnoop
dtruss
DTrace
SystemTap
perf
进程级别:
strace
truss
gdb
mdb
4.1.3 剖析
剖析通过对目标收集采样或者快照来归纳目标特征。剖析也能基于非计时的硬件事件。
系统级别和进程级别:
oprofile
perf
DTrace
SystemTap
cachegrind
Intel VTune Amplifier XE
Oracle Solaris Studio
4.1.4 监视(sar)
sar 是基于计数器的。
4.2 观测来源
系统性能统计的主要来源是:/proc, /sys, 和 kstat。
进程级别计数 /proc
系统级别计数 /proc,/sys
设备驱动和调试信息 /sys
进程级别跟踪 ptrace,uprobes
性能计数器 perf_event
网络跟踪 libpcap
进程级延时指标 延时核算
系统级跟着 tracepoints,kprobes,ftrace
4.2.1 /proc
/proc 由内核动态创建,不需要任何存储设备(在内存中运行)。
与进程性能观测相关的文件如下:
limits : 实际的资源限制
maps : 映射的内存区域
sched : cpu 调度器的各种统计
schedstat : cpu 运行时间,延时和时间分片
smaps : 映射内存区域的使用统计
stat : 进程状态和统计,包括总的cpu和内存使用情况
statm : 以也为单位的内存使用总结
status : stat 和 statm 的信息,用户可读
task : 每个任务的统计目录
与性能观测相关的系统级别的文件如下:
cpuinfo : 物理处理器信息
diskstats : 对于所有磁盘设备的磁盘IO统计
interrupts : 每个cpu的中断计数器
loadavg : 负载平均值
meminfo : 系统内存使用明细
net/dev : 网络接口统计
net/tcp : 活跃的tcp套接字
schedstat : 系统级别的cpu调度器统计
self : 关联当前进程id路径的符号链接
slabinfo : 内核 slab 分配器缓存统计
stat : 内核和系统资源的统计
zoneinfo : 内存区信息
4.2.2 /sys
Linux 还提供了一个 sysfs 文件系统,挂在 /sys
4.2.3 kstat
4.2.4 延时核算
开启 CONFIG_TASK_DELAY_ACCT 选项的linux系统按以下状态跟踪每个任务的时间。
调度器延时:等待轮上cpu
块IO:等待块IO完成
交换:等待换页
内存回收:等待内存回收例程
4.2.5 微状态核算
4.2.6 其他的观测源
1.cpu 性能计数器 : perf_events
2.进程级别的跟踪: ptrace(),strace()
3.内核跟踪: kprobes
4.网络嗅探:libpcap,/proc/net/dev,tcpdump
5.进程核算: atop
6.系统调用:getrusage()
4.3 DTrace
4.3.1 静态和动态跟踪
4.3.2 探针
4.3.3 provider
4.3.4 参数
4.3.5 D 语言
4.3.6 内置变量
4.3.7 action
4.3.8 变量类型
4.3.9 单行命令
4.3.10 脚本
4.3.11 开销
4.3.12 文档和资源
4.4 SystemTap
SystemTap 对用户级和内核级的代码都提供了静态和动态的跟踪功能。SystemTap 采用其他的内核框架做源:静态探针用tracepoints,动态探针用 kprobes,用户级别的
探针用 uprobes。这些源也为其他的工具所用(perf,LTTng)。
4.4.1 探针
4.4.2 tapset
4.4.3 action 和内置变量
4.4.4 示例
4.4.5 开销
4.4.6 文档和资源
4.5 perf
4.6 观测工具的观测