(四)性能观测工具

                                      (四)性能观测工具

一、绪论

通过了解各种观测工具来观测系统的软件和硬件,用工具和统计来弄清楚系统的活动。

二、工具类型

性能观测工具可以按照系统级别和进程级别来分类,多数的工具要么时基于计数器要么基于统计。还有一些工具时基于剖析的,对系统或进程做一系列快照以此来进行观测。

三、计数器类型

定义

内核维护了各种统计数据,称为计数器。 对事件进行统计。 例如 磁盘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都是可编程环境在他们之上可以构建系统级别的跟踪工具。

扫描二维码关注公众号,回复: 8552088 查看本文章

五、剖析

定义

剖析通过对目标收集采样或快照来归纳分析目标特征。

一个常见的例子就是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内核的一部分。 

发布了268 篇原创文章 · 获赞 104 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/m0_38039437/article/details/101000237