Solaris有哪些性能与工具
Solaris有哪些性能与工具
中文版序
原序
前言
关于作者
致谢
第一部分 系统观察方法
第1章 系统观察工具简介 1
1.1 系统观察工具 1
1.1.1 kstat工具 2
1.1.2 进程工具 2
1.1.3 调查工具 3
1.2 深入分析 3
1.3 关于第一部分 4
第2章 CPU 5
2.1 用于CPU分析的工具 5
2.2 vmstat工具 6
2.3 CPU利用率 7
2.4 CPU饱和度 7
2.5 psrinfo命令 7
2.6 uptime命令 7
2.7 sar命令 8
2.7.1 sar默认输出 8
2.7.2 sar-q 9
2.7.3 获取历史数据 10
2.8 时钟计时单元数 10
2.9 mpstat命令 11
2.10 谁在使用CPU 12
2.11 CPU运行队列延迟时间 13
2.12 CPU统计数据的内部 15
2.12.1 usr、sys、idl时间 15
2.12.2 平均负载 16
2.12.3 pr_ pctcpu字段 17
2.13 使用DTrace说明性能工具中的事件 17
2.14 runq-sz、%runocc的DTrace版本 18
2.15 CPU状态的DTrace探测器 20
第3章 进程 22
3.1 进程分析工具 22
3.2 进程统计概要:prstat 23
3.2.1 线程概要:prstat-L 24
3.2.2 进程微态:prstat-m 24
3.2.3 以关键字排序:prstat-s 25
3.2.4 用户概要:prstat-t 25
3.2.5 项目概要:prstat-J 26
3.2.6 区域概要:prstat-Z 26
3.3 进程状态:ps 26
3.3.1 usrbinps命令 26
3.3.2 usrucbps 28
3.4 用以显示和控制进程的工具 29
3.4.1 进程树:ptree 29
3.4.2 查找进程:pgrep 30
3.4.3 杀死进程:pkill 30
3.4.4 暂时停止进程:pstop 30
3.4.5 重启进程:prun 30
3.4.6 等待进程的完成:pwait 30
3.4.7 清除僵死进程:preap 30
3.5 进程自我检测命令 31
3.5.1 进程堆栈:pstack 31
3.5.2 进程内存映射:pmap-x 31
3.5.3 进程文件表:pfiles 32
3.5.4 进程执行时间统计:ptime 33
3.5.5 进程信号配置:psig 33
3.5.6 进程库:pldd 33
3.5.7 进程标记:pflags 34
3.5.8 进程授权证书:pcred 34
3.5.9 进程参数:pargs 34
3.5.10 进程工作目录:pwdx 34
3.6 检查进程中的用户级锁 34
3.7 跟踪进程 35
3.7.1 利用truss来跟踪进程 35
3.7.2 利用apptrace来跟踪进程 37
3.7.3 利用DTrace来跟踪进程函数 38
3.7.4 利用DTrace来聚集进程函数 39
3.7.5 利用DTrace来监视内部进程 39
3.7.6 利用DTrace来取样堆栈回溯 40
3.8 Java进程 40
3.8.1 Java虚拟机中的进程堆栈:pstack 40
3.8.2 JVM配置 41
3.8.3 调整Java垃圾回收 42
3.8.4 在Java应用程序中使用DTrace 43
第4章 磁盘行为与分析 45
4.1 磁盘分析术语 45
4.2 随机和顺序IO对比 46
4.2.1 顺序磁盘活动示例 46
4.2.2 随机磁盘活动示例 46
4.3 存储阵列 47
4.4 扇区分区 48
4.5 最大IO大小 48
4.6 iostat 49
4.7 磁盘使用率 50
4.8 磁盘饱和度 51
4.9 磁盘吞吐量 51
4.10 iostat参考 51
4.10.1 iostat 53
4.10.2 iostat-D 53
4.10.3 iostat-1 n 54
4.10.4 iostat-n 54
4.10.5 iostat-x 54
4.10.6 iostat-p,-P 55
4.10.7 iostat-e 55
4.10.8 iostat-E 55
4.11 理解iostat 56
4.11.1 事件大小比率 56
4.11.2 服务时间 57
4.12 iostat内幕 57
4.13 sar-d 59
4.14 使用跟踪正常格式 (TNF)跟踪IO 60
4.15 DTrace IO 60
4.15.1 io探针 60
4.15.2 获得IO大小的单行命令 61
4.15.3 一个更复杂的例子 62
4.15.4 IO大小聚集 62
4.15.5 IO寻道聚集 65
4.15.6 IO文件名称 66
4.16 磁盘IO时间 67
4.16.1 简单的磁盘事件 67
4.16.2 同时处理多个磁盘事件 68
4.16.3 自适应磁盘IO时间算法 69
4.16.4 其他响应时间 70
4.16.5 各层时间 70
4.17 DTraceToolkit 70
4.17.1 iotop脚本 71
4.17.2 iosnoop脚本 72
4.17.3 磁盘活动绘图 73
4.17.4 绘制并发活动 74
4.18 DTraceTazTool 75
第5章 文件系统 77
5.1 文件系统和IO层 77
5.2 观察物理IO 77
5.3 文件系统延迟 79
5.4 读写文件系统延迟原因 81
5.4.1 磁盘IO等待 81
5.4.2 块或元数据缓存未命中 82
5.4.3 IO分解 82
5.4.4 文件系统锁操作 82
5.4.5 元数据更新 83
5.5 观察文件系统“顶端”活动 83
5.6 文件系统缓存 84
5.6.1 页面缓存 85
5.6.2 用直接IO旁路页面缓存 88
5.6.3 目录名查找缓存 90
5.6.4 块缓冲区缓存 92
5.6.5 UFS的i节点缓存 93
5.6.6 用fcachestat来监视UFS缓存 94
5.7 NFS统计 95
5.7.1 NFS客户端统计数值:nfsstat-c 95
5.7.2 NFS服务器端统计数值:nfsstat-s 95
第6章 内存 97
6.1 内存分析的工具 97
6.2 vmstat(1M)命令 98
6.3 换页的类型 99
6.3.1 文件IO换页:“好的”换页 99
6.3.2 匿名内存换页:“坏的”换页 100
6.3.3 每个zone的换页统计数据 101
6.4 物理内存分配 101
6.4.1 总物理内存 101
6.4.2 空闲内存 101
6.4.3 在MDB中使用memstat命令 102
6.5 减缓内存压力 103
6.6 作为内存状态指示器的扫描频率 104
6.7 进程虚拟和驻留集大小 106
6.8 使用pmap查看进程内存的使用 106
6.9 使用ps和pmap计算进程内存使用 107
6.10 使用pmap显示页面大小信息 110
6.11 使用DTrace进行内存分析 110
6.12 获取内存Kstats信息 112
6.13 使用Perl的Kstat API来查看内存
统计数据 113
6.14 系统内存分配的Kstats信息 113
6.15 包含kstat的内核内存 114
6.16 系统换页Kstats信息 115
6.17 用trapstat来查看MMU性能的影响 116
6.18 交换空间 117
6.18.1 交换空间的分配 117
6.18.2 交换空间统计数字 118
6.18.3 交换空间的摘要:swap -s 118
6.18.4 列出物理交换设备:swap -l 119
6.18.5 计算换出的线程 119
6.18.6 监测物理交换空间的活动 120
6.18.7 MemTool的prtswap 120
6.18.8 用pmap来显示交换空间的预留
情况 121
第7章 网络 123
7.1 网络分析的术语 123
7.2 数据包不是字节 124
7.3 网络使用率 125
7.4 网络饱和度 125
7.5 网络错误 125
7.6 错误配置 125
7.7 系统范围的统计 126
7.7.1 netstat命令 126
7.7.2 kstat命令 127
7.7.3 nx.se工具 128
7.7.4 nicstat工具 128
7.7.5 SNMP 129
7.7.6 checkcable工具 130
7.7.7 ping工具 130
7.7.8 traceroute工具 131
7.7.9 snoop工具 131
7.7.10 TTCP 132
7.7.11 pathchar工具 132
7.7.12 ntop工具 132
7.7.13 NFS客户端统计:nfsstat -c 133
7.7.14 NFS服务器端统计:nfsstat -s 133
7.8 基于进程的网络统计 134
7.8.1 tcptop工具 134
7.8.2 tcpsnoop工具 135
7.9 TCP统计 136
7.9.1 TCP统计内幕 136
7.9.2 从Kstat得到的TCP统计 137
7.9.3 TCP统计参考 137
7.9.4 从DTrace得到的TCP统计 139
7.10 IP统计 139
7.10.1 IP统计内幕 140
7.10.2 从Kstat得到的IP统计 140
7.10.3 IP统计参考 140
7.10.4 从DTrace得到的IP统计 141
7.11 ICMP统计 142
7.11.1 从Kstat得到的ICMP统计项 142
7.11.2 ICMP统计参考 142
7.11.3 从DTrace得到的ICMP统计 143
7.11.4 跟踪原始网络函数 143
第8章 性能计数器 145
8.1 CPU缓存简介 145
8.2 cpustat命令 147
8.2.1 缓存命中率和缓存缺失 147
8.2.2 列出PIC和事件 148
8.2.3 PIC例子:UltraSPARC IIi 149
8.2.4 PIC例子:UltraSPARC T1处理器 150
8.2.5 事件复用 151
8.2.6 在多CPU上使用cpustat 152
8.2.7 每个指令的周期 152
8.2.8 PIC例子:UltraSPARC IV 152
8.3 cputrack 命令 153
8.4 busstat命令 154
8.4.1 列出支持的总线 154
8.4.2 列出总线事件 154
8.4.3 监控总线事件 155
8.4.4 事件复用 156
8.4.5 例子:UltraSPARC T1 157
第9章 内核监测 158
9.1 内核监测工具 158
9.2 分析内核和驱动 158
9.3 分析内核锁 160
9.3.1 自适应锁 160
9.3.2 自旋锁 160
9.3.3 读写锁 160
9.3.4 线程锁 161
9.3.5 使用lockstat分析锁 161
9.4 DTrace的lockstat供应者 162
9.5 使用DTrace分析内核 164
9.6 中断统计:vmstat-i 164
9.7 中断分析:intrstat 165
第二部分 系统观察基础架构
第10章 动态跟踪 167
10.1 DTrace简介 167
10.2 基础知识 167
10.2.1 D程序结构 169
10.2.2 供应者和探针 170
10.2.3 聚集 171
10.2.4 变量 174
10.2.5 探针参数 176
10.2.6 混合供应者 178
10.2.7 访问全局内核数据 179
10.2.8 对感兴趣的动作进行分类 180
10.3 用DTrace检测Java应用程序 182
10.3.1 使用DTrace jstack动作检测程序 185
10.3.2 为Mustang之前的发行版增加
探针 187
10.4 DTrace体系结构 188
10.5 总结 192
10.6 探针参考 192
10.6.1 IO供应者 192
10.6.2 虚拟内存供应者探针 195
10.6.3 sched供应者 196
10.6.4 DTrace lockstat供应者 199
10.6.5 Java虚拟机供应者 201
10.7 MDB参考 206
第11章 内核统计 207
11.1 C语言级Kstat接口 207
11.1.1 数据结构概述 207
11.1.2 开始 209
11.1.3 数据类型 210
11.1.4 Kstat命名 213
11.1.5 函数 213
11.1.6 统计链同步管理 214
11.1.7 综合运用 215
11.2 命令行接口 216
11.2.1 kstat命令 216
11.2.2 使用kstat和nawk的实际例子 217
11.3 使用Perl访问kstats 219
11.3.1 访问kstat的Tied-Hash接口 219
11.3.2 update()方法 220
11.3.3 64位值 220
11.3.4 开始使用Perl 220
11.3.5 在Perl中实现netstatMulti 221
11.4 使用DTrace监测程序的kstat 223
11.5 添加统计信息到Solaris内核 224
11.5.1 kstat供应者遍览 224
11.5.2 IO统计 226
11.6 其他信息 228
第三部分 调 试
第12章 模块调试器 229
12.1 模块调试器简介 229
12.1.1 MDB 229
12.1.2 MDB特性 229
12.1.3 术语 230
12.2 MDB调试器概念 230
12.2.1 构造模块 230
12.2.2 目标 231
12.2.3 调试器命令 231
12.2.4 walker 232
12.2.5 调试器模块 232
12.2.6 宏 232
12.2.7 模块化 232
第13章 MDB入门指南 234
13.1 调用MDB 234
13.2 MDB命令的语法 235
13.2.1 表达式 236
13.2.2 符号 237
13.2.3 用于格式化的元字符 238
13.2.4 格式化字符 238
13.2.5 dcmd 240
13.2.6 walker 241
13.2.7 宏 242
13.2.8 管道 242
13.2.9 管道输出到UNIX命令 243
13.2.10 获取符号类型信息 243
13.2.11 变量 244
13.2.12 walker、变量和表达式的组合 246
13.3 使用调试目标对象 246
13.3.1 显示栈 247
13.3.2 显示寄存器值 248
13.3.3 对目标对象反汇编 248
13.3.4 设置断点 248
13.4 GDB到MDB的对照参考 249
13.5 dcmd和walker参考 250
13.5.1 命令 250
13.5.2 注释 250
13.5.3 表达式 251
13.5.4 符号 251
13.5.5 dcmd 251
13.5.6 变量 252
13.5.7 读格式字符 252
13.5.8 写格式字符 253
13.5.9 搜索格式 253
13.5.10 通用的命令 253
13.5.11 与目标有关的dcmd 254
13.5.12 与CTF有关的dcmd 254
13.5.13 内核:与proc有关的dcmd 255
13.5.14 内核:与线程有关的dcmd 255
13.5.15 内核:与同步有关的dcmd 255
13.5.16 内核:与CPU有关的dcmd 255
13.5.17 内核:与内存有关的dcmd 256
13.5.18 内核:与kmem有关的dcmd 256
13.5.19 进程:与目标有关的dcmd 256
13.5.20 内核:与kmdb有关的dcmd 257
第14章 调试内核 259
14.1 调试内核的核心 259
14.1.1 定位和调用目标 259
14.1.2 检查内核核心汇总信息 259
14.1.3 检查消息缓冲区 260
14.1.4 获取运行线程的栈回溯 261
14.1.5 哪个进程 261
14.1.6 反汇编可疑的代码 261
14.1.7 显示通用寄存器 262
14.1.8 按栈回溯追踪 263
14.1.9 查看CPU的状态 265
14.1.10 在SPARC体系结构中追溯栈帧 266
14.1.11 列出进程和进程栈 267
14.1.12 全部内存概要 269
14.1.13 列出网络连接 269
14.1.14 列出所有内核线程 269
14.1.15 其他值得注意的内核D命令 270
14.2 检查内核映像中的用户进程栈 270
14.2.1 如何在转储时保存进程的内存
空间 270
14.2.2 用MDB检查内核映像 271
14.2.3 定位目标进程 271
14.2.4 寻找用户模式栈帧的指针 272
14.3 切换MDB来调试特定的进程 272
14.3.1 构建进程栈 273
14.3.2 检查进程内存 274
14.4 内核模块调试器kmdb 274
14.4.1 用kmdb和moddebug诊断 275
14.4.2 用内核调试器启动系统 275
14.4.3 在x86机器上配置tty控制台 276
14.4.4 调查系统挂起 276
14.4.5 收集系统崩溃的信息 277
14.4.6 如何调试待测目标 277
14.4.7 设置断点 278
14.4.8 用halt-d强行得到系统崩溃转储 278
14.4.9 用kmdb强行得到转储 279
14.5 内核内建的MDB dcmd 279
附 录
附录A 可调参数和设置 283
附录B DTrace One-Liners 287
附录C Java DTrace脚本 289
附录D Perl Kstat实用程序示例 291
参考文献 304