1.工具类型
性能观测工具可以按照系统级别和进程级别来分类,多数的工具要么基于计数器要么基于跟踪。我们把这些性能放在如下图中,包括一些常见工具作为示例
有一些工具不止适合一个象限,例如:top还有一个系统级别的视图,Dtrace也有进程级别的能力。还有一些性能工具是基于剖析(profiling)的。对系统和进程做一系列快照,以此来进行观测。
1.1计数器
内核维护了各种统计数据,称为计数器,用于对事件计数。通常计数器实现为无符号的整型数,发生事件时递增。计数器的使用可以认为是“零开销”的,因为它们默认是开启的,而且始终由内核维护。
唯一的使用开销是从用户空间读取它们的时候(可以忽略不计)。
系统级别
下面这些工具利用内核的计数器在系统软硬件的环境中检查系统级别的活动。
vmstat:虚拟内存和物理内存的统计,系统级别。
mpstat:每个CPU的使用情况。
iostat:每个I/O的使用情况,由块设备接口报告。
netstat:网络接口的统计,TCP/IP栈的统计,以及每个连接的一些统计信息。
sar:各种各样的统计,能归档历史数据。
这些工具通常是系统全体用户可见的(非root用户)。统计出的数据也常常被监控软件用来绘图。
进程级别
下面这些工具以进程为导向的,使用的是内核为每个进程维护的计数器。
ps:进程状态,显示进程的各种统计信息,包括内存和cpu的使用。
top:按一个统计数据(如CPU使用)排序,显示排名高的进程,基于Solaris的系统对应的工具是prstat(1M)
pmap:将进程的内存段和使用统计一起列出。
一般来说,上述的这些工具是从/proc文件系统里读取统计的信息的。
1.2 跟踪
跟踪收集每一个事件的数据以供分析。跟踪框架一般默认是不启用的,因为跟踪捕获数据会有CPU的开销,另外还需要不小的存储空间来存放数据。
这些开销会拖慢所跟踪的对象,在解释测量时间的时候需要加以考虑。
日志,包括系统日志,可以认为是一种默认开启的低频率的跟踪。日志包括每一个事件的数据,虽然通常只针对偶发事件,如错误和警告。
系统级别
利用内核功的跟踪设施,下面这些跟踪工具在系统软硬件的环境中检查系统级别的活动。
tcpdump:网络包跟踪(用libpcap库)
snoop:为基于Solaris的系统打造的网络包跟踪工具。
blktrace:块I/O跟踪(Linux)
iosnoop:块I/O跟踪(基于Dtrace)
execsnoop:跟踪新进程(基于Dtrace)
dtruss:系统级别的系统调用缓冲跟踪(基于Dtrace)
Dtrace:跟踪内核的内部活动和所有资源的使用情况(不仅仅是网络和块I/O),支持静态和动态的跟踪。
SystemTap:跟踪内核的内部活动和所有资源的使用情况,支持静态和动态的跟踪。
perf:Linux性能事件,跟踪静态和动态的探针。
Dtrace和SystemTap都是可编程环境,在它们之上可以构建系统级别的跟踪工具
进程级别
以进程为导向的,基于的是操作系统提供的框架。
strace:基于Linux系统的系统调用跟踪。
truss:基于Solaris系统的系统调用跟踪。
gdb:源代码级别的调试器,广泛应用于Linux系统。
mdb:Solaris系统的一个具有可扩展性的调试器。
调试器能够检查每一个事件的数据,不过做这件事情时需要停止目标程序的执行,然后再启动。
诸如:Dtrace、SystemTap和perf这样的工具,虽然更适合归纳到系统级别一类中,但是他们都支持对单个进程做检查。
1.3 剖析