(四)性能观测工具
一、绪论
通过了解各种观测工具来观测系统的软件和硬件,用工具和统计来弄清楚系统的活动。
二、工具类型
性能观测工具可以按照系统级别和进程级别来分类,多数的工具要么时基于计数器要么基于统计。还有一些工具时基于剖析的,对系统或进程做一系列快照以此来进行观测。
三、计数器类型
定义
内核维护了各种统计数据,称为计数器。 对事件进行统计。 例如 磁盘I/O发生的计数器。
开销
计数器的使用默认是“零开销”,因为他们默认就是开启的,而且始终由内核维护。
唯一的使用开销就是从用户空间读取他们的时候,可以忽略不计。
系统级别 | 进程级别 |
vmstat:虚拟内存、物理内存统计 |
ps:进程状态 |
mpstat:每个cpu使用统计 | top:根据cpu使用情况,显示排名高的进程 |
iostat:每个磁盘I/O使用情况 | pmap:将进程的内存段和使用统计一起显示 |
netstat :网络接口统计 |
四、跟踪类型
定义
跟踪收集每一个事件的数据以供分析。
开销
跟踪一般默认是不开启的,因为跟踪捕获数据会有CPU开销,另外还需要不小的存储空间来存放数据。
这些开销会拖慢所跟踪的对象。
系统级别 | 进程级别 |
tcpdump:网络包跟踪(用libpcap库) | strace:基于linux系统的系统调用跟踪 |
blktrace:块I/O跟踪(linux) | truss:基于solaris系统的系统调用跟踪 |
iosnoop:块I/O跟踪(Dtrace) | gdb:源代码级别的调试器(linux) |
execsnoop:跟踪新进程(基于Dtrace) | mdb:Solaris系统的一个工具 |
dtruss:系统调用缓冲跟踪(基于Dtrace) | |
dtrace:跟踪内核内部活动和所有资源的使用情况,支持静态和动态跟踪 | |
SystemTap:跟踪内核内部活动和所有资源的使用情况,支持静态和动态跟踪 | |
perf:linux性能事件,跟踪静态和动态的探针 |
Dtrace和SystemTap都是可编程环境在他们之上可以构建系统级别的跟踪工具。
五、剖析
定义
剖析通过对目标收集采样或快照来归纳分析目标特征。
一个常见的例子就是CPU的使用率,对程序计数器进行采样。或跟踪栈来找到消耗CPU周期的代码路径。
六、观测来源
系统性能统计的来源
Type | linux |
进程级计数器 | /proc |
系统级计数器 | /proc, /sys |
设备驱动和调试信息 | /sys |
进程级跟踪 | ptrace , uprobes |
性能计数器 | perf_event |
网络跟踪 | libpcap |
进程级延时指标 | 延时核算 |
系统级跟踪 | tracepoints,kprobes,ftrace |
/proc
这是一个提供内核统计信息的文件系统接口。/proc 包含很多的目录,其中以进程ID命令的目录代表的就是那个进程。
这些目录下的众多文件包含了进程的信息和统计数据,由内核数据映射而来。在linux中/proc 还有其他的文件,提供系统级别的统计数据。
/proc由内核动态创建,不需要任何存储设备(在内存中运行)多数文件是只读文件,为观测工具提供统计数据。一部分文件是可写的,用于控制进程和内核的行为。
该文件系统是便利的:这是一个直观的框架,将内核统计数据用目录树的形式暴露给用户空间,编程接口就是众所周知的POSIX的文件系统调用,即 open()、read()、close()而且通过使用文件访问权限,这一文件系统还保证了用户级别的安全。
查看/proc 有哪些文件。其中蓝色数字是系统运行的所有进程号文件夹。(用top命令查看的进程号就是这里的进程)
查看/proc下各种进程统计的文件。
后面的数字是进程号
ls -F /proc/3442
进程文件夹中各文件含义
limits | 实际资源限制 |
maps | 映射的内存区域 |
sched | CPU调度器的各种统计 |
schedstat | CPU运行时间、延时和时间分片 |
smaps | 映射内存区域的使用统计 |
stat | 进程状态和统计,包括总的CPU和内存使用情况 |
statm | 以页为单位的内存使用总结 |
status | stat和statm的信息,用户可读。 |
task | 每个任务的统计目录 |
/proc 系统级别的统计
cd /proc/ | ls -Fd [a-z]*
系统级别的文件夹含义
cpuinfo | 物理处理器信息,包含所有虚拟CPU、型号、时钟频率和缓存大小 |
diskstats | 对于所有磁盘设备的磁盘I/O统计 |
interrupts | 每个CPU中断计数器 |
loadavg | 负载平均值 |
meminfo | 系统内存使用明细 |
net/dev | 网络接口统计 |
schedstat | 活跃的TCP套接字信息 |
self | 关联当前进程ID路径的符号链接,为了使用方便。 |
slabinfo | 内核slab分配器缓存统计 |
stat | 内核和系统资源的统计,CPU,磁盘,分页,交换区,进程 |
zoneinfo | 内存区信息 |
/proc 文件一般是文本格式,通过shell脚本工具可以容易地调用命令行读取。
cat /proc/meminfo
/sys
linux还提供了一个sysfs文件系统,挂载在/sys , 在2.6内核引入的,为内核统计提供一个基于目录的结构。
与linux不同的是,/sys经过一段时间的发展,把各种系统信息放在了顶层目录。sysf最初设计用于提供设备驱动的统计数据,不过现在已经扩展到了提供所有的统计类型。
延时核算
通过开启CONFIG_TASK_DELAY_ACCT 选项的linux系统可以根据以下几种状态跟踪每个任务的时间。
- 调度器延时:等到分配上cpu资源的时间
- 块I/O:等待块I/O完成
- 交换:等到换页(内存压力)
- 内存回收:等待内存回收例程
七、其他的观测源
其他的观测源 | |
CPU性能计数器 | 可编程的硬件寄存器提供低层级的性能信息,包括CPU周期计数、指令计数、停滞周期。在linux上通过per_event接口,或者系统调用perf_event_open(),这样的工具来访问这些计数器。 |
进程级别跟踪 | 跟踪的是用户级别软件事件,如系统调用和函数调用。一般执行会拖慢跟踪的目标。在inux上系统调用ptrace()来控制进程跟踪。strace跟踪系统调用、uprober来做用户级别的动态跟踪 |
内核跟踪 | 在linux中tracepoints提供静态的内核探针(原先叫内核标记,kernel maskers)、kprober提供动态探针。Dtrace和SystemTap两个工具都用到了这两项。 |
网咯嗅探 | 网路嗅探提供了一种从网络设备上抓包的方法,能对数据包和协议做详细的调查。在Linux上,嗅探的功能是通过libpcap库和/proc/net/dev提供。工具则用tcpdump |
进程核算 | 是基于对进程的执行和运行时间进行分析。atop工具使用进程核算能捕捉到短暂存活的进程并显示其信息。 |
系统调用 | 一些可用的系统调用和库函数调用能够提供某些性能指标。 |
八、SystemTap
SystemTap对用户级和内核级的代码都提供了静态和动态跟踪的功能。
SystemTap采用其他内核框架做源:静态探针用tracepoints、动态探针用kprobes、用户级别的探针用uprobes
SystemTap基本组成:探针、tapset、action、内置变量、
探针:探针的定义是由句号分隔的,有内置选项可选(放在括号中)
- begin:程序开始
- end:程序结束
- syscall.read:系统调用read()的开始
- syscall.read.return:系统调用read()的结束
- kernel.function("sys_read"):内核函数sys_read()的开始
- kernel.function("sys_read").return:内核函数sys_read()的结束
- socket.send:发送包
- time.ms(100):对单一CPU每100ms触发一次探针
Tapset
一组相关的探针称为tapset。许多探针的名字都以tapset的名字作为开头
action和内置变量
SystemTap还提供了许多的action和内置变量。如:
execname():可以获取进程的名字。
pid() :可以获取当前进程的ID。
print_backtrace():打印内核栈的回溯信息。
九、perf
Linux性能事件(Linux Perfomance Events)简称为perf。
perf现在所支持的性能观测的范围已经相当宽泛。perf可以执行静态和动态跟踪(基于trancepoint、kprobe、uprobe还有profiling)
此外他还能检查栈跟踪、局部变量和数据类型。因为他已经称为linux内核的一部分。