2 全局性能监控工具
2.1 sysperfstat
sysperfstat是一款用perl编写的显示系统CPU、MEM、DISK、NET四项指标的利用率和饱和度的全局性能监控工具,由Solaris资深咨询师Brendan Gregg开发并推广,是业内较为权威的一款性能监控工具,该工具堪称经典且应用广泛。
用法: sysperfstat [-h] | [interval [count]]
例如,
sysperfstat # 打印系统自启动后的概要信息
sysperfstat 5 # 每5秒不间断打印
sysperfstat 1 5 # 每1秒打印,共5次
sysperfstat -h # 打印帮助
在这里,我们介绍CPU负载示范,
$ sysperfstat 1
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
22:57:22 0.85 44.11 2.40 0.19 0.01 0.00 0.00 0.00
22:57:23 2.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:24 3.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:25 3.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:26 17.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:27 38.00 77.79 0.00 0.00 0.00 0.00 0.00 0.00
22:57:28 100.00 77.85 0.00 0.00 0.00 0.00 0.00 0.00
22:57:29 100.00 77.89 0.00 0.00 1.00 0.00 0.00 0.00
22:57:30 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:31 100.00 77.80 0.00 0.00 3.00 0.00 0.00 0.00
22:57:32 100.00 77.80 0.00 0.00 3.00 0.00 0.00 0.00
22:57:33 100.00 77.80 0.00 0.00 3.00 0.00 0.00 0.00
22:57:34 100.00 77.80 0.00 0.00 3.00 0.00 0.00 0.00
22:57:35 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:36 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:37 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:38 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:39 100.00 77.84 0.00 0.00 2.00 0.00 0.00 0.00
22:57:40 33.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:41 19.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
22:57:42 2.00 77.77 0.00 0.00 0.00 0.00 0.00 0.00
第一行打印的是系统自启动后的概要信息,我们可以看到CPU使用率很快达到100%,而随着越来越多的程序执行使CPU的饱和度稳步增长。
以下是内存负载示范,
$ sysperfstat 1
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
23:07:10 0.85 44.11 2.40 0.19 0.01 0.00 0.00 0.00
23:07:11 7.00 95.17 0.00 0.00 0.00 0.00 0.00 0.00
23:07:12 4.00 95.63 0.00 0.00 0.00 0.00 0.00 0.00
23:07:13 5.00 96.09 0.00 0.00 0.00 0.00 0.00 0.00
23:07:14 5.00 96.55 0.00 0.00 0.00 0.00 0.00 0.00
23:07:15 5.00 97.01 0.00 0.00 0.00 0.00 0.00 0.00
23:07:16 6.00 97.47 0.00 0.00 0.00 0.00 0.00 0.00
23:07:17 5.00 97.92 0.00 0.00 0.00 0.00 0.00 0.00
23:07:18 9.00 97.84 2.00 0.00 0.00 20.51 0.04 0.00
23:07:19 6.00 97.92 2.75 0.00 0.00 13.04 0.04 0.00
23:07:20 6.00 97.91 2.85 0.00 0.00 18.22 0.04 0.00
23:07:21 9.00 97.88 8.87 0.00 0.00 13.46 0.04 0.00
23:07:22 5.00 97.91 2.71 0.00 1.00 12.06 0.03 0.00
23:07:23 6.00 98.02 2.27 0.00 0.00 6.90 0.03 0.00
23:07:24 7.00 98.01 2.75 0.00 0.00 9.25 0.03 0.00
23:07:25 6.00 98.04 3.82 0.00 0.00 19.28 0.04 0.00
23:07:26 6.00 97.99 3.34 0.00 0.00 26.05 0.05 0.00
23:07:27 11.00 97.95 3.47 0.00 0.00 21.79 0.05 0.00
23:07:28 6.00 97.84 3.00 0.00 0.00 21.41 0.04 0.00
23:07:29 6.00 97.86 2.85 0.00 0.00 16.05 0.04 0.00
23:07:30 7.00 97.89 3.90 0.00 0.00 19.42 0.04 0.00
23:07:31 6.00 97.93 2.50 0.00 0.00 24.07 0.03 0.00
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
23:07:32 7.00 97.99 1.15 0.00 0.00 27.64 0.02 0.00
23:07:33 8.00 97.94 2.75 0.00 0.00 20.14 0.04 0.00
23:07:34 6.00 98.08 3.30 0.00 0.00 17.88 0.04 0.00
23:07:35 29.00 77.29 2.45 0.00 0.00 2.71 0.02 0.00
23:07:36 21.00 77.28 10.50 0.00 0.00 0.00 0.00 0.00
23:07:37 3.00 77.28 0.00 0.00 0.00 0.00 0.00 0.00
23:07:38 2.00 77.27 0.00 0.00 0.00 0.00 0.00 0.00
被执行的程序,很快占用了大量内存。在23时07分18秒时,内存页面扫描器开始扫描所显示的饱和值,在23点07分35秒的内存加载程序被终止。
下面是磁盘负载示范,
$ sysperfstat 1
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
23:15:35 0.85 44.11 2.40 0.19 0.01 0.00 0.00 0.00
23:15:36 2.00 78.27 0.00 0.00 0.00 0.00 0.00 0.00
23:15:37 4.00 78.27 0.00 0.00 0.00 0.00 0.00 0.00
23:15:38 19.00 78.27 0.00 0.00 0.00 0.00 0.00 0.00
23:15:39 43.00 78.32 31.46 0.00 0.00 0.00 0.00 0.00
23:15:40 84.00 78.31 17.65 0.00 4.00 0.00 0.00 0.00
23:15:41 70.00 78.31 32.71 0.00 0.00 0.00 0.00 0.00
23:15:42 66.00 78.41 50.90 0.00 0.00 0.00 0.00 0.00
23:15:43 88.00 78.47 57.14 0.00 0.00 0.00 0.00 0.00
23:15:44 100.00 78.55 30.09 0.00 1.00 0.00 0.00 0.00
23:15:45 100.00 78.56 44.72 0.00 2.00 0.00 0.03 0.00
23:15:46 98.00 78.55 51.16 0.00 2.00 0.00 0.06 0.00
23:15:47 84.00 78.58 88.13 0.00 4.00 0.00 0.19 0.00
23:15:48 93.00 78.59 76.20 0.00 2.00 0.00 0.11 0.00
23:15:49 73.00 78.60 100.00 0.00 3.00 0.00 0.31 0.00
23:15:50 91.00 78.63 57.28 0.00 10.00 0.00 0.11 0.00
23:15:51 83.00 78.70 100.00 0.00 4.00 0.00 0.62 0.00
23:15:52 75.00 78.67 100.00 0.00 0.00 0.00 0.99 0.00
23:15:53 73.00 78.69 100.00 0.00 2.00 0.00 0.93 0.00
若干程序运行时使用磁盘读写,随着磁盘占用率的上升,最终可以看出磁盘饱和度。
下面是网络负载示范,
$ sysperfstat 1
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
23:27:41 0.85 44.11 2.40 0.19 0.01 0.00 0.00 0.00
23:27:42 3.00 80.98 0.00 0.00 0.00 0.00 0.00 0.00
23:27:43 2.00 80.98 0.00 0.00 0.00 0.00 0.00 0.00
23:27:44 17.00 80.98 0.00 0.00 0.00 0.00 0.00 0.00
23:27:45 46.00 80.49 22.05 54.20 1.00 0.00 0.00 0.00
23:27:46 50.00 79.83 14.19 78.18 0.00 0.00 0.00 0.00
23:27:47 48.00 79.39 8.04 80.94 0.00 0.00 0.00 0.00
23:27:48 54.00 79.62 3.06 70.89 4.00 0.00 0.00 0.00
23:27:49 39.00 79.43 6.78 74.52 0.00 0.00 0.00 0.00
23:27:50 3.00 79.43 0.00 0.00 0.00 0.00 0.00 0.00
23:27:51 3.00 79.43 0.00 0.00 0.00 0.00 0.00 0.00
23:27:52 3.00 79.43 0.00 0.00 0.00 0.00 0.00 0.00
23:27:53 4.00 79.43 0.00 0.00 0.00 0.00 0.00 0.00
这是一个大的文件在网络上被传输,网络利用率清楚地表明,这种情况正在发生,这也引起了一些CPU和磁盘利用率。示范网络饱和度非常困难 -提供的这种值测量反应并不如人们希望的(网络只有饱和时可见真的是饱和!也并不是所有的网卡提供的饱和值)。
sysperfstat可以(且应该)使用较大的时间间隔。在这里,我们样本相当空闲系统每隔30秒,
$ sysperfstat 30
------ Utilisation ------ ------ Saturation ------
Time %CPU %Mem %Disk %Net CPU Mem Disk Net
23:34:51 0.85 44.11 2.40 0.19 0.01 0.00 0.00 0.00
23:34:21 6.83 79.42 0.00 0.01 0.30 0.00 0.00 0.00
23:34:51 5.07 79.42 0.00 0.02 0.00 0.00 0.00 0.00
23:35:21 5.43 79.42 0.00 0.02 0.00 0.00 0.00 0.00
23:35:51 5.23 79.42 0.00 0.01 0.00 0.00 0.00 0.00
23:36:21 5.70 79.41 0.00 0.01 0.00 0.00 0.00 0.00
23:36:51 5.50 79.41 0.13 0.01 0.00 0.00 0.00 0.00
23:37:21 4.27 79.41 0.00 0.01 0.00 0.00 0.00 0.00
23:37:51 5.60 79.41 0.00 0.01 0.00 0.00 0.00 0.00
23:38:21 3.37 79.41 0.00 0.01 0.00 0.00 0.00 0.00
23:38:51 4.07 79.41 0.07 0.01 0.13 0.00 0.00 0.00
23:39:21 4.13 79.41 0.07 0.01 0.03 0.00 0.00 0.00
23:39:51 5.67 79.41 0.00 0.01 0.00 0.00 0.00 0.00
2.2 prtdevs
prtdevs是一款用来快速打印出所有的网络接口设备实例名的小工具,无论它们是否被探测到,再加上一些更常用的细节。
用法: prtdevs [-h]
prtdevs # 设备实例名称
prtdevs -h # 打印帮助
以下是该程序的一些示例,打印出设备实例名称,整齐列出了所有的网络接口,无论是探测与否。
这个例子是在UltraSPARC10,
$ uname -i
SUNW,Ultra-5_10
$
$ prtdevs
cpu: 0
mem: 384 Mb
disk: dad0 dad1 fd0 sd16 sd31
network: hme0
另一个例子是,
$ uname -i
SUNW,Ultra-60
$
$ prtdevs
cpu: 0 2
mem: 1024 Mb
disk: fd0 lofi1 md0 sd0 sd1 sd6
network: hme0 qfe0 qfe1 qfe2 qfe3 qfe4 qfe5 qfe6 qfe7
3 CPU性能监控工具
3.1 mptstat
mpstat是solaris系统自带的实时监控工具,可以查看每个CPU处理器的统计信息。mpstat命令以表格形式报告每个处理器的统计信息,表格中的每一行代表一个处理的活动情况。mpstat可以确定每一个CPU都在花时间做什么:比如,分配给体系、用户、等待、空闲时间、体系调用、锁竞争、中断、错误、交织调用。
基本用法:mpstat [interval [count]]
例如,
mpstat 5 2 # 每5秒打印,共2次
字段解释:
CPU CPU ID
Minf 轻微故障(minor faults)
Mjf 重要故障(major faults)
Xcal 处理机间的调用
Intr 中断数
Ithr 线程中断数(不包括时钟中断)
Csw 上下文切换次数
Icsw 强制的上下文切换次数
Migr 处理器之间的线程迁移数
Smtx 内核互斥体
Srw 内核读/写互斥体
syscl 系统调用次数
usr 用户时间所占百分比
sys 系统时间所占百分比
wt 等待时间所占百分比
idle 空闲时间所占百分比
下面是一个简单的默认输出例子。
bash-3.00$ mpstat 5
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 43 0 12 329 106 189 4 11 24 3 8625 1 1 0 99
1 82 0 11 41 6 169 3 10 25 3 9962 1 1 0 99
2 70 0 13 40 7 151 3 9 23 3 9171 1 1 0 99
3 67 0 10 52 20 134 2 8 21 2 5400 0 1 0 99
4 58 0 12 171 139 93 1 5 17 1 2427 0 1 0 99
5 40 0 11 37 7 123 2 6 20 2 6396 0 1 0 99
6 40 0 10 38 7 118 2 6 19 2 7795 0 1 0 99
7 41 0 11 36 7 123 2 6 19 2 5961 0 1 0 99
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 310 105 36 0 1 1 0 28 0 0 0 100
1 0 0 0 38 6 40 0 1 0 0 21 0 0 0 100
2 0 0 0 17 2 23 0 1 0 0 3 0 1 0 99
3 0 0 0 17 15 2 0 0 0 0 1 0 0 0 100
4 0 0 0 11 8 7 0 0 0 0 13 0 0 0 100
5 0 0 0 44 21 45 0 1 0 0 21 0 0 0 100
6 0 0 0 6 2 5 0 0 0 0 5 0 0 0 100
7 8 0 0 55 23 53 0 0 0 0 84 0 0 0 100
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 310 105 17 0 0 0 0 22 0 0 0 100
1 0 0 0 27 5 28 0 1 1 0 21 0 0 0 100
2 0 0 0 26 4 27 0 0 0 0 13 0 1 0 99
3 0 0 0 24 7 21 0 1 1 0 2 0 0 0 100
4 0 0 0 16 7 11 0 1 1 0 1 0 0 0 100
5 0 0 0 46 21 44 0 0 0 0 20 0 0 0 100
6 0 0 0 11 3 12 0 0 0 0 6 0 0 0 100
7 0 0 0 48 24 46 0 0 0 0 82 0 0 0 100
4 MEM性能监控工具
4.1 swapinfo
swapinfo是一款打印虚拟内存(交换)的统计信息,以及内存和磁盘使用情况的工具。
用法: swapinfo [ -h ]
swapinfo # 打印状态
swapinfo -h # 打印帮助
字段解释:
RAM Total # 物理内存总量
RAM Unusable # 由OBP(OpenBootPROM,SUN服务器的BIOS)和TSBs消耗的内存
RAM Kernel # 驻留在内存的内核程序(通常是被锁的)占用的内存量
RAM Locked # 从交换分区锁定的内存
RAM Used # 执行程序,库,页面缓存占用的内存
RAM Avail # 可立即使用的空闲内存
Disk Total # 配置为交换分区的磁盘总量
Disk Alloc # 磁盘交换分区已分配量(由页输出使用)
Disk Free # 空闲的磁盘交换分区
Swap Total # 可使用的交换分区总量
Swap Alloc # 被分配(使用)的交换分区
Swap Unalloc # 预留出来但没有被使用的交换分区
Swap Avail # 被预留的可用交换分区
Swap MinFree # 在被预留的可用交换分区中保持空闲的部分
下面是一个示例,从一个普通用户帐户下即可运行,可以看到该工具是运行在384MB的RAM和512.4MB磁盘交换系统上。
$ swapinfo
RAM _____Total 384.0 Mb
RAM Unusable 21.2 Mb
RAM Kernel 64.8 Mb
RAM Locked 3.8 Mb
RAM Used 231.1 Mb
RAM Avail 63.2 Mb
Disk _____Total 512.4 Mb
Disk Alloc 90.2 Mb
Disk Free 422.2 Mb
Swap _____Total 760.7 Mb
Swap Alloc 270.9 Mb
Swap Unalloc 13.4 Mb
Swap Avail 476.4 Mb
Swap (MinFree) 46.0 Mb
从上面的例子我们可以看到,有63.2Mb的内存是空闲的,磁盘上有476.4 Mb空间可用于交换,内核程序占用了64.8Mb内存,另外有21.2Mb内存被OBP和TSBs消耗。
5 DISK性能监控工具
5.1 iotop
iotop一款通过DTrace打印磁盘I/O各类信息的工具,磁盘I/O信息包括的细节有大小(字节)和磁盘I/O时间。
用法: iotop [-C] [-D|-o|-P] [-j|-Z] [-d device] [-f filename]
[-m mount_point] [-t top] [interval [count]]
iotop # 默认输出,5秒的时间间隔
-C # 不清除屏幕
-D # 打印时间差, 微秒 (过去的)
-j # 打印项目ID
-o # 打印磁盘完成请求的时间(微秒)
-P # 打印I/O百分比(按磁盘忙闲时间占用率)
-Z # 打印区域ID
-d device # 根据磁盘名称探测 (比如, dad0)
-f filename # 根据文件的完整路径名探测
-m mount_point # 针对文件系统(将跳过原始事件)
-t number # 按磁盘读写量排序打印前n行
例子,
iotop 1 # 1秒打印1次
iotop -C # 不清除屏幕
iotop -P # 打印I/O百分比(基于时间)
iotop -j # 打印项目ID
iotop -Z # 打印分区ID
iotop -t 20 # 按磁盘读写量排序打印前20行
iotop -C 5 12 # 每5秒打印1次,共打印12次
字段:
UID 用户ID
PID 进程ID
PPID 父进程ID
PROJ 项目ID
ZONE 区域ID
CMD 进程命令名
DEVICE 设备名称
MAJ 设备主编号
MIN 设备次编号
D 方向, 读或写
BYTES 操作的总大小,字节
ELAPSED 从请求到完成的总消耗,自己
DISKTIME 磁盘完成请求的总时间,自己
%I/O 磁盘I/O的百分比, 基于时间的 (DISKTIME)
load 1分钟内的平均负载
disk_r 每例磁盘读取字节数
disk_w 每例磁盘写入字节数
下面是一个iotop的实例,这里使用了 –C选项不清除屏幕,而是滚动输出。
# iotop -C
Sampling... Please wait.
2005 Jul 16 00:34:40, load: 1.21, disk_r: 12891 Kb, disk_w: 1087 Kb
UID PID PPID CMD DEVICE MAJ MIN D BYTES
0 3 0 fsflush cmdk0 102 4 W 512
0 3 0 fsflush cmdk0 102 0 W 11776
0 27751 20320 tar cmdk0 102 16 W 23040
0 3 0 fsflush cmdk0 102 0 R 73728
0 0 0 sched cmdk0 102 0 R 548864
0 0 0 sched cmdk0 102 0 W 1078272
0 27751 20320 tar cmdk0 102 16 R 1514496
0 27751 20320 tar cmdk0 102 3 R 11767808
2005 Jul 16 00:34:45, load: 1.23, disk_r: 83849 Kb, disk_w: 488 Kb
UID PID PPID CMD DEVICE MAJ MIN D BYTES
0 0 0 sched cmdk0 102 4 W 1536
0 0 0 sched cmdk0 102 0 R 131072
0 27752 20320 find cmdk0 102 0 R 262144
0 0 0 sched cmdk0 102 0 W 498176
0 27751 20320 tar cmdk0 102 3 R 11780096
0 27751 20320 tar cmdk0 102 5 R 29745152
0 27751 20320 tar cmdk0 102 4 R 47203328
2005 Jul 16 00:34:50, load: 1.25, disk_r: 22394 Kb, disk_w: 2 Kb
UID PID PPID CMD DEVICE MAJ MIN D BYTES
0 27752 20320 find cmdk0 102 0 W 2048
0 0 0 sched cmdk0 102 0 R 16384
0 321 1 automountd cmdk0 102 0 R 22528
0 27752 20320 find cmdk0 102 0 R 1462272
0 27751 20320 tar cmdk0 102 5 R 17465344
从上面的输出,我们可以看到一个tar命令从设备名为cmdk0的磁盘上不同的分区上进行读操作,最后的重点在主设备号102上,这一点可以在/dev/dsk路径下输入“ls –lL”后观察到对应的主设备号和分区号,disk_r和disk_w值给出了单位时间内整体的操作量,单位字节。
无论用iotop的完成请求时间,还是读写字节都能更准确的确定哪个进程使磁盘繁忙。(因为他们考虑到该操作是随机还是顺序的)
# iotop -Co
Sampling... Please wait.
2005 Jul 16 00:39:03, load: 1.10, disk_r: 5302 Kb, disk_w: 20 Kb
UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
0 0 0 sched cmdk0 102 0 W 532
0 0 0 sched cmdk0 102 0 R 245398
0 27758 20320 find cmdk0 102 0 R 3094794
2005 Jul 16 00:39:08, load: 1.14, disk_r: 5268 Kb, disk_w: 273 Kb
UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
0 3 0 fsflush cmdk0 102 0 W 2834
0 0 0 sched cmdk0 102 0 W 263527
0 0 0 sched cmdk0 102 0 R 285015
0 3 0 fsflush cmdk0 102 0 R 519187
0 27758 20320 find cmdk0 102 0 R 2429232
2005 Jul 16 00:39:13, load: 1.16, disk_r: 602 Kb, disk_w: 1238 Kb
UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
0 3 0 fsflush cmdk0 102 4 W 200
0 3 0 fsflush cmdk0 102 6 W 260
0 3 0 fsflush cmdk0 102 0 W 883
0 27758 20320 find cmdk0 102 0 R 55686
0 3 0 fsflush cmdk0 102 0 R 317508
0 0 0 sched cmdk0 102 0 R 320195
0 0 0 sched cmdk0 102 0 W 571084
[...]
这里的DISKTIME单位是微秒,在第一个例子中,我们可以看到find命令造成了总时长为3.094秒的使用磁盘时间。例子这里是5秒一次打印(默认),所以它可以客观的说明,find命令是保持60%的磁盘忙。
5.2 iosnoop
iosnoop一款通过DTrace实时打印磁盘I/O事件的工具。默认输出一下信息,如PID、块地址、大小、命令和路径等等。
用法: iosnoop [-a|-A|-DeghiNostv] [-d device] [-f filename]
[-m mount_point] [-n name] [-p PID]
iosnoop # 默认输出
-a # 打印所有数据(大部分)
-A # 转储所有数据,以空格分隔
-D # 打印时间差, 微秒 (过去的)
-e # 打印设备名称
-g # 打印命令参数
-i # 打印设备实例
-N # 打印设备主编号和次编号
-o # 打印磁盘时间差, 微秒
-s # 打印开始时间, 微秒
-t # 打印完成时间, 微秒
-v # 打印完成时间, 字符串
-d device # 根据磁盘名称探测 (比如, dad0)
-f filename # 根据文件的完整路径名探测
-m mount_point # 针对文件系统(将跳过原始事件)
-n name # 只针对进程名
-p PID # 只针对进程ID
例子,
iosnoop -v # 人们可读的时间串
iosnoop -N # 打印设备主编号和次编号
iosnoop -m / # 只在根文件系统探测事件
字段解释:
UID 用户ID
PID 进程ID
PPID 父进程ID
COMM 该进程的命令名称
ARGS 该进程的参数列表
SIZE 操作大小,字节
BLOCK 磁盘块的操作(位置)
STIME 磁盘请求的时间戳,微秒
TIME 磁盘完成的时间戳, 微秒
DELTA 从请求到完成的时间差, 微秒
DTIME 磁盘完成请求的时间,微秒
STRTIME 磁盘完成请求的时间戳, 字符串
DEVICE 设备名称
INS 设备实例号
D 方向,读或写
MOUNT 挂载点
FILE I/O操作的文件名(主档名)
下面是一个iosnoop的实例,默认输出进程ID、读写大小、命令和路径。
# iosnoop
UID PID D BLOCK SIZE COMM PATHNAME
100 15795 R 3808 8192 tar /usr/bin/eject
100 15795 R 35904 6144 tar /usr/bin/eject
100 15795 R 39828 6144 tar /usr/bin/env
100 15795 R 3872 8192 tar /usr/bin/expr
100 15795 R 21120 7168 tar /usr/bin/expr
100 15795 R 43680 6144 tar /usr/bin/false
100 15795 R 44176 6144 tar /usr/bin/fdetach
100 15795 R 3920 8192 tar /usr/bin/fdformat
100 15795 R 3936 8192 tar /usr/bin/fdformat
100 15795 R 4080 8192 tar /usr/bin/fdformat
100 15795 R 9680 3072 tar /usr/bin/fdformat
100 15795 R 4096 8192 tar /usr/bin/fgrep
100 15795 R 46896 6144 tar /usr/bin/fgrep
100 15795 R 4112 8192 tar /usr/bin/file
[...]
下面这个例子使用了-v参数,以人们可以理解的时间戳方式打印读写操作。
# iosnoop -v
STRTIME UID PID D BLOCK SIZE COMM PATHNAME
2005 Jan 6 19:33:31 0 7471 R 57136 8192 bash /usr/sbin/df
2005 Jan 6 19:33:31 0 7471 R 57152 8192 bash /usr/sbin/df
2005 Jan 6 19:33:40 0 7472 R 23544 4096 uptime /usr/bin/sparcv9/uptime
2005 Jan 6 19:33:40 0 7472 R 4618080 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:40 0 7472 R 4618144 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:40 0 7472 R 4618160 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:40 0 7472 R 4618096 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:41 0 7472 R 4617456 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:41 0 7472 R 4618624 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:41 0 7472 R 4617408 8192 uptime /lib/sparcv9/libc.so.1
2005 Jan 6 19:33:49 0 7473 R 23544 4096 uptime /usr/bin/sparcv9/uptime
2005 Jan 6 19:33:53 0 3 W 8305 2560 fsflush <none>
[...]
下面的例子告诉大家iosnoop可以指定路径或文件进行探测读写操作,如-m后跟路径即可探测该路径下的读写操作,-f后跟全路径文件名即可探测该文件的读写操作。
# iosnoop -m /export/home
UID PID D BLOCK SIZE COMM PATHNAME
0 2427 R 1040 1024 bash /export/home
0 2427 R 1046 1024 bash /export/home/brendan
0 7590 R 1078 1024 grep /export/home/brendan/Dev
0 7590 R 3648 8192 grep /export/home/brendan/Dev/iosnoop
0 7591 R 1062 1024 vi /export/home/brendan/.bashrc
0 7591 W 1062 1024 vi /export/home/brendan/.bashrc
[...]
# iosnoop -f /var/sadm/install/contents
UID PID D BLOCK SIZE COMM PATHNAME
0 7602 R 1985792 98304 pkgchk /var/sadm/install/contents
0 7602 R 8082528 131072 pkgchk /var/sadm/install/contents
0 7602 R 8082784 131072 pkgchk /var/sadm/install/contents
0 7602 R 8083040 131072 pkgchk /var/sadm/install/contents
0 7602 R 8083296 131072 pkgchk /var/sadm/install/contents
[...]
5.3 iofile.d
iofile.d一款通过DTrace探测进程读写的每个文件I/O等待时间的小工具。从下面这个例子可以看到,进行探测期间活动的进程ID、命令名、I/O等待时间、全路径文件名。
# iofile.d
Tracing... Hit Ctrl-C to end.
^C
PID CMD TIME FILE
5206 tar 109 /var/adm/acct/nite
5206 tar 110 /var/adm/acct/sum
5206 tar 114 /var/adm/acct/fiscal
5206 tar 117 /var/adm/messages.3
5206 tar 172 /var/adm/sa
5206 tar 3605 /var/adm/messages.2
5206 tar 4548 /var/adm/spellhist
5206 tar 5769 /var/adm/exacct/brendan1task
5206 tar 6416 /var/adm/acct
5206 tar 7587 /var/adm/messages.1
5206 tar 8246 /var/adm/exacct/task
5206 tar 8320 /var/adm/pool
5206 tar 8973 /var/adm/pool/history
5206 tar 9183 /var/adm/exacct
3 fsflush 10882 <none>
5206 tar 11861 /var/adm/exacct/flow
5206 tar 12042 /var/adm/messages.0
5206 tar 12408 /var/adm/sm.bin
5206 tar 13021 /var/adm/sulog
5206 tar 19007 /var/adm/streams
5206 tar 21811 <none>
5206 tar 24918 /var/adm/exacct/proc
在上面的输出,我们可以看到,tar命令花了24918(25毫秒)用于等待文件/var/adm/exacct/proc的读写。
6 NET性能监控工具
6.1 nicstat
nicstat是一款网络接口统计工具,如千字节/秒的读取和写入,数据包/秒的读取和写入,数据包的平均大小,利用率和饱和度等。
用法: nicstat [-hsz] [-i int[,int...]] | [interval [count]]
-h # 打印帮助
-s # 打印输出概要信息
-z # 不显示结果为0的行
-i int[,int...] # 仅打印指定的网络接口
例如,
nicstat # 打印系统自启动后的概要信息
nicstat 1 # 每1秒不间断打印
nicstat 1 5 # 每1秒打印,共5次
nicstat -i hme0 # 只打印网络接口hme0的信息
字段解释:
rKb/s——读字节数/秒
wKb/s——写字节数/秒
rPk/s——读数据包数/秒
wPk/s——写数据包数/秒
rAvs——读数据包的平均大小,单位字节
wAvs——写数据包的平均大小,单位字节
%Util——利用率
Sat——饱和度
下面是一个nicstat的实例,它打印统计为网络接口,如字节/秒的读写。在这里,我们运行它的间隔为1秒。
$ nicstat 1
Time Int rKb/s wKb/s rPk/s wPk/s rAvs wAvs %Util Sat
12:33:04 hme0 1.51 4.84 7.26 10.32 213.03 480.04 0.05 0.00
12:33:05 hme0 0.20 0.26 3.00 3.00 68.67 90.00 0.00 0.00
12:33:06 hme0 0.14 0.26 2.00 3.00 73.00 90.00 0.00 0.00
12:33:07 hme0 0.14 0.52 2.00 6.00 73.00 88.00 0.01 0.00
12:33:08 hme0 0.24 0.36 3.00 4.00 81.33 92.00 0.00 0.00
12:33:09 hme0 2.20 1.77 16.00 18.00 140.62 100.72 0.03 0.00
12:33:10 hme0 0.49 0.58 8.00 9.00 63.25 66.00 0.01 0.00
12:33:11 hme0 12.16 1830.38 185.06 1326.42 67.26 1413.06 15.09 0.00
12:33:12 hme0 19.03 3094.19 292.88 2229.11 66.53 1421.40 25.50 0.00
12:33:13 hme0 19.55 3151.87 301.00 2270.98 66.50 1421.20 25.98 0.00
12:33:14 hme0 11.99 1471.67 161.07 1081.45 76.25 1393.49 12.15 0.00
12:33:15 hme0 0.14 0.26 2.00 3.00 73.00 90.00 0.00 0.00
12:33:16 hme0 0.14 0.26 2.00 3.00 73.00 90.00 0.00 0.00
12:33:17 hme0 0.14 0.26 2.00 3.00 73.00 90.00 0.00 0.00
[...]
在12点33分11秒我们可以看到,在系统上运行的控制程序向另一台主机发送了18Mb左右的消息量,1326个数据包,而这1秒内写数据包的平均大小是1413字节,网络的利用率已达到15%。
下面是在具有多个网络接口的系统上运行nicstat实例,5秒的间隔时间。
$ nicstat 5
Time Int rKb/s wKb/s rPk/s wPk/s rAvs wAvs %Util Sat
00:58:02 hme0 0.12 0.01 1.05 0.04 113.53 238.16 0.00 0.00
00:58:02 qfe0 2.94 0.53 5.97 3.70 504.29 147.69 0.03 0.00
00:58:02 qfe1 6.79 26.37 17.71 25.47 392.55 1060.22 0.27 0.00
00:58:02 qfe2 0.27 7.78 3.24 6.10 86.74 1306.18 0.07 0.00
00:58:02 qfe3 1.15 20.30 8.09 15.78 145.72 1317.10 0.18 0.00
Time Int rKb/s wKb/s rPk/s wPk/s rAvs wAvs %Util Sat
00:58:07 hme0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:07 qfe0 0.04 0.25 0.60 0.80 60.00 316.25 0.00 0.00
00:58:07 qfe1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:07 qfe2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:07 qfe3 0.14 0.19 0.60 0.60 246.67 319.67 0.00 0.00
Time Int rKb/s wKb/s rPk/s wPk/s rAvs wAvs %Util Sat
00:58:12 hme0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:12 qfe0 10.34 1.10 19.76 12.18 535.81 92.59 0.09 0.00
00:58:12 qfe1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:12 qfe2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:58:12 qfe3 0.14 0.19 0.60 0.60 246.67 319.67 0.00 0.00
[...]
上面的例子展示,只有少量的网络流量。
6.2 checkcable
checkcable是一个打印网卡状态的工具,如双工类型,网络带宽和自适应。checkcable还可以检查是否有电缆被拔掉。
用法: checkcable [-h] [interface ...]
checkcable # 检测所有配置的网口
checkcable hme0 # 检测指定的网口
下面是一个CheckCable在Solaris上打印出网络状态接口链接状态的实例。
# checkcable
Interface Link Duplex Speed AutoNEG
hme0 UP FULL 100 ON
字段解释:
Interface——网络接口
Link——链接状态
Duplex——双工模式
Speed——网络带宽,单位Mb
AutoNEG——自适应
由此我们得知上面的实例情况,网口名称是hme0,网络链接状态是联通的(有网线插入),双工模式是全双工(即同时支持收发消息),网络带宽为100Mb,是自适应模式。
如果网卡不提供足够的状态信息来填充各个领域,就会如下面的例子打印一些???
# checkcable
Interface Link Duplex Speed AutoNEG
rtls0 ??? FULL 100 ???