第Ⅰ部分 Linux概述 3
第1章 Linux系统安装的性能问题 3
1.1 引言 3
1.2 安装前的规划 3
1.2.1 选择分区位置 4
1.2.2 使用多个硬盘驱动器 4
1.2.3 选择文件系统 4
1.2.4 转换文件系统 5
1.2.5 配置RAID 6
1.3 Linux 2.6内核的可配置属性 8
1.3.1 I/O提升器 8
1.3.2 超大TLB页面支持 8
1.4 Linux日志工具 9
1.4.1 /var/log/messages文件 9
1.4.2 /var/log/XFree86.0.log文件 9
1.4.3 日志轮转 10
1.4.4 日志工具 10
1.4.5 日志定制 10
1.5 BSD与系统V的初始化机制 11
1.5.1 初始化表(/etc/inittab) 11
1.5.2 BSD的初始化表(Slackware) 12
1.5.3 系统V的初始化表(Red Hat) 13
1.6 小结 14
1.7 参考文献 14
第2章 Linux内核机制 15
2.1 引言 15
2.2 Linux的发展历程 15
2.3 Linux内核体系结构 15
2.3.1 内核的职能 16
2.3.2 内核组织结构与模块 16
2.3.3 内核服务 16
2.3.4 /proc文件系统的外部性能视图 16
2.3.5 内存管理 17
2.4 进程管理 18
2.4.1 进程、任务与内核线程 19
2.4.2 调度与上下文切换 19
2.5 进程间通信 20
2.5.1 信号 20
2.5.2 管道 20
2.5.3 系统V的IPC机制 21
2.6 Linux对称多处理(SMP)模型 22
2.6.1 多处理系统类型 22
2.6.2 同步与数据串行化 22
2.6.3 锁、锁粒度与锁开销 22
2.6.4 cache一致性 23
2.6.5 处理器亲和度 23
2.7 文件系统 23
2.7.1 虚拟文件系统(VFS) 23
2.7.2 ext2fs 23
2.7.3 LVM与RAID 24
2.7.4 磁盘卷组 24
2.7.5 设备相关文件 25
2.7.6 devfs 25
2.8 Linux 2.6内核的新特性 26
2.9 小结 26
2.10 参考文献 27
第3章 服务器体系结构 29
3.1 引言 29
3.2 Linux服务器 29
3.3 多处理器与多处理机制 30
3.3.1 服务器拓扑结构 30
3.3.2 处理器的混用机制 31
3.4 内存 32
3.5 I/O 33
3.6 Linux企业级服务器 34
3.7 Linux集群 35
3.7.1 高性能集群 35
3.7.2 高可用集群 36
3.8 服务器系统示例 36
3.8.1 IBM zSeries大型机 36
3.8.2 刀片服务器 39
3.8.3 NUMA 39
3.9 小结 44
第Ⅱ部分 性能分析工具 47
第4章 系统性能监控 47
4.1 引言 47
4.2 Linux与性能分析的背景知识 47
4.3 CPU利用率 49
4.3.1 vmstat 51
4.3.2 top与gtop工具 53
4.3.3 sar 54
4.4 内存利用率 56
4.4.1 /proc/meminfo与/proc/slabinfo 56
4.4.2 ps 57
4.4.3 vmstat 59
4.5 I/O利用率 59
4.5.1 iostat 61
4.5.2 sar 62
4.6 网络利用率 63
4.6.1 网络统计信息 64
4.6.2 接口信息 66
4.6.3 TCP/IP协议统计数据 66
4.6.4 nfsstat 67
4.7 小结 67
4.8 参考文献 67
第5章 系统跟踪工具 69
5.1 引言 69
5.2 系统跟踪机制的需求 69
5.3 top 70
5.4 strace 72
5.5 OProfile 74
5.5.1 opcontrol 75
5.5.2 数据概况描述工具 76
5.6 Performance Inspector 82
5.6.1 Above Idle 83
5.6.2 Per-Thread Time 84
5.6.3 Trace Profiling 86
5.6.4 指令跟踪 89
5.6.5 Java Profiler 91
5.6.6 Java Lock Monitor 103
5.6.7 Performance Inspector的执行工具 106
5.7 小结 107
5.8 参考文献 107
第6章 工作负荷的性能基准测试 109
6.1 引言 109
6.2 改进工作负荷的基准测试方法 110
6.3 基准测试的类型 111
6.4 微基准测试 111
6.4.1 操作系统基准测试 111
6.4.2 磁盘基准测试 124
6.4.3 网络基准测试 132
6.4.4 应用基准测试 133
6.5 Web服务器基准测试 137
6.5.1 SPECweb、SPECweb SSL与TPC-W 137
6.5.2 SPECjAppServer与ECPerf 138
6.5.3 其他应用基准测试 139
6.6 小结 139
第Ⅲ部分 系统调优 143
第7章 系统性能原理和策略:基准测试方法的案例分析 143
7.1 引言 143
7.2 性能评价方法 143
7.2.1 跟踪机制 143
7.2.2 工作负荷特征描述 144
7.2.3 数值分析 144
7.2.4 模拟方法 144
7.3 基准测试案例分析 144
7.4 分析方法 145
7.4.1 软硬件配置 145
7.4.2 运行规则 146
7.4.3 设置目标 146
7.4.4 测量、分析与调优 146
7.4.5 退出策略 147
7.5 基准测试程序 148
7.5.1 基准测试程序介绍 148
7.5.2 性能结果 149
7.6 小结 151
7.7 致谢 152
7.8 参考文献 152
第8章 调度器调优 153
8.1 引言 153
8.2 单处理器系统 153
8.3 对称多处理 154
8.4 非一致内存访问 154
8.5 对称多线程 155
8.6 Linux 2.6内核调度器 155
8.7 负载平衡 156
8.8 调度器的可调参数 157
8.8.1 *CHILD_PENALTY 157
8.8.2 *CREDIT_LIMIT 157
8.8.3 *EXIT_WEIGHT 157
8.8.4 *INTERACTIVE_DELTA 157
8.8.5 *MAX_SLEEP_AVG 158
8.8.6 *MAX_TIMESLICE 158
8.8.7 *MIN_TIMESLICE 158
8.8.8 *PARENT_PENALTY 158
8.8.9 *PRIO_BONUS_RATIO 158
8.8.10 *STARVATION_LIMIT 158
8.9 小结 159
8.10 参考文献 159
第9章 Linux虚存的性能问题 161
9.1 引言 161
9.2 内存与地址空间 162
9.2.1 地址空间 162
9.2.2 用户地址空间 162
9.2.3 VM区域 163
9.2.4 内核地址空间 164
9.3 高端内存支持 165
9.4 分页与交换机制 165
9.4.1 替换策略 166
9.4.2 页面替换与内存平衡 167
9.5 Linux页表 167
9.6 Linux 2.6内核中的新特性 169
9.6.1 rmap与objrmap 169
9.6.2 大型页面的支持 169
9.6.3 页面分配与替换 170
9.6.4 Slab分配器 171
9.6.5 VM的可调参数 171
9.6.6 CPU调度器 173
9.7 小结 175
9.8 参考文献 175
第10章 I/O子系统的性能问题 177
10.1 引言 177
10.2 I/O调度与块I/O(BIO)层 177
10.2.1 Linux 2.6内核的I/O调度器 178
10.2.2 Linux 2.4内核的I/O调度器 179
10.2.3 Linux 2.6内核的最终期限I/O调度器 179
10.2.4 调度器的可调参数 180
10.2.5 Linux 2.6内核的Anticipatory I/O调度器 181
10.2.6 Linux 2.6内核的CFQ调度器 183
10.2.7 Linux 2.6内核的noop I/O调度器 183
10.2.8 I/O调度器的性能含义 183
10.3 批量读写请求 184
10.4 读预测启发算法 184
10.5 影响性能的I/O部件 185
10.6 I/O设备寻址 186
10.7 小结 186
10.8 参考文献 186
第11章 文件系统调优 189
11.1 引言 189
11.2 文件系统基本知识 189
11.2.1 文件系统的实现考虑 189
11.2.2 创建优化的文件系统 190
11.2.3 文件系统基本术语 190
11.3 日志型文件系统 192
11.3.1 文件系统的故障处理机制 193
11.3.2 事务机制 193
11.3.3 选项 194
11.4 影响文件系统性能的磁盘因素 195
11.4.1 物理磁盘存储器的考虑事项 195
11.4.2 磁盘的性能特征 196
11.4.3 传输速率 196
11.4.4 hdparm 197
11.5 文件系统的碎片整理 199
11.6 文件同步 199
11.6.1 确保数据或文件完整性 200
11.6.2 使用函数调用 200
11.6.3 使用文件描述符 200
11.6.4 sync/fsync的性能含义 201
11.7 bdflush参数 201
11.8 异步输入与输出 202
11.8.1 使用异步I/O 202
11.8.2 异步I/O函数 202
11.9 原始磁盘I/O 203
11.9.1 在Linux上设置原始I/O 203
11.9.2 示例 203
11.10 Ext2与Ext3文件系统 204
11.10.1 Ext2的组织结构 204
11.10.2 Ext2文件系统中的块分配方式 206
11.10.3 创建Ext2文件系统 206
11.10.4 Ext2文件系统的Ext3扩展机制 207
11.10.5 Ext3的内核配置支持 207
11.10.6 Ext3文件系统调优方法 208
11.10.7 创建Ext3分区 208
11.10.8 Ext2与Ext3的转换 209
11.10.9 建立外部日志 209
11.10.10 Ext2/Ext3工具 209
11.11 ReiserFS 210
11.11.1 ReiserFS的内核配置支持 211
11.11.2 ReisetFS文件系统调优方法 211
11.11.3 创建ReiserFS文件系统 211
11.11.4 建立外部日志 212
11.11.5 挂接ReiserFS文件系统 212
11.11.6 挂接选项 213
11.11.7 调优ReiserFS 213
11.11.8 ReiserFS文件系统实用工具 214
11.12 日志式文件系统 214
11.12.1 JFS的内核配置支持 215
11.12.2 JFS文件系统的调优方法 215
11.12.3 创建JFS文件系统 216
11.12.4 建立外部日志 216
11.12.5 挂接文件系统 216
11.12.6 挂接选项 216
11.12.7 调优JFS 217
11.12.8 JFS文件系统实用工具 217
11.13 下一代文件系统 217
11.13.1 XFS的内核配置支持 218
11.13.2 XFS文件系统的调优方法 218
11.13.3 创建XFS文件系统 219
11.13.4 容量饱和时的文件系统行为 219
11.13.5 建立外部日志 219
11.13.6 挂接文件系统 220
11.13.7 挂接选项 220
11.13.8 调优XFS 220
11.13.9 XFS文件系统实用工具 221
11.14 小结 222
11.15 参考文献 223
第12章 网络调优 225
12.1 引言 225
12.2 网络协议栈 225
12.3 内核参数调优机制 226
12.4 内核自动调优机制 226
12.5 核心内核参数 227
12.6 TCP/IPv4协议内核参数 228
12.6.1 TCP缓冲区与内存管理 228
12.6.2 TCP选项 230
12.6.3 TCP连接管理 231
12.6.4 TCP连接保持管理 232
12.6.5 IP端口范围 233
12.7 小结 233
12.8 参考文献 233
第13章 进程间通信 235
13.1 引言 235
13.2 进程间通信的定义 235
13.3 Linux SysV的IPC资源与ipcs命令 236
13.3.1 ipcs命令 236
13.3.2 IPC标识符及其限制 237
13.4 信号量参数 238
13 4 1 semmni 238
13.4.2 semmns 239
13.4.3 semmsl 239
13.4.4 semopm 239
13.4.5 semvmx 239
13.4.6 未用的信号量参数 239
13.5 消息队列参数 240
13.5.1 msgmni 240
13.5.2 msgmax 240
13.5.3 msgmnb 241
13.5.4 未用的消息队列参数 241
13.6 共享内存段参数 241
13.6.1 shmmni 242
13.6.2 shmmax 242
13.6.3 shrnmin 242
13.6.4 shmall 242
13.7 可配置IPC参数的动态修改机制 242
13.7.1 使用/proc 242
13.7.2 使用sysctl 243
13.8 IPC参数的静态配置 243
13.9 管道机制 243
13.10 小结 244
第14章 代码调优 245
14.1 引言 245
14.2 一般原则 245
14.3 应用的概要描述工具 246
14.4 编译器选项调优 246
14.4.1 性能调优的基本步骤 247
14.4.2 编译器优化的问题 247
14.5 代码调优 247
14.6 算法设计调优 248
14.6.1 问题与解决方案的可能性 248
14.6.2 问题描述 248
14.6.3 程序 249
14.6.4 设计代码 251
14.6.5 服务器 251
14.6.6 计时 252
14.6.7 Socket 253
14.6.8 线程 256
14.6.9 同步 259
14.6.10 文件I/O 262
14.6.11 客户端 264
14.6.12 代码讨论 266
14.6.13 编译选项 266
14.6.14 链接库 267
14.7 小结 268
第Ⅳ部分 Linux服务器应用的性能特征第15章 Web服务器的性能调优 271
15.1 引言 271
15.2 HTTP请求与响应 272
15.3 Web服务器的网络行为 273
15.4 Web服务器事务 275
15.5 Web服务器模型 275
15.6 Web服务器的调优方法 276
15.6.1 Web服务器的通用调优机制 277
15.6.2 Apache服务器的调优机制 277
15.6.3 Flash与事件驱动的其他服务器的调优机制 278
15.6.4 Tux的调优机制 278
15.6.5 Web服务器的性能评价工具 278
15.7 小结 279
15.8 参考文献 279
第16章 文件与打印服务器的性能调优 281
16.1 引言 281
16.2 专用网络存储服务器的类型 282
16.3 网络存储性能的优化方法 282
16.3.1 确定远程存储的数据 282
16.3.2 SAN与网络文件系统/NAS 282
16.3.3 网络文件系统协议 283
16.3.4 客户与服务器的实现选择 286
16.3.5 Linux客户端调优的关键概念 287
16.3.6 Linux文件服务器的调优机制 290
16.3.7 性能测量 292
16.3.8 改进容量规划的负荷测量方法 292
16.3.9 打印服务器的性能因素 293
16.4 参考文献 293
第17章 数据库服务器的性能调优 295
17.1 引言 295
17.2 数据库体系结构 295
17.3 数据库的性能调优领域 296
17.3.1 I/O调优 296
17.3.2 队列长度与响应时间 296
17.3.3 负载平衡 297
17.3.4 全局内存 298
17.3.5 日志设备 299
17.3.6 典型的数据库工作负荷 300
17.4 进程管理 300
17.5 内存管理 301
17.6 I/O管理 302
17.6.1 回弹缓冲区 302
17.6.2 原始I/O 302
17.6.3 向量I/O 303
17.6.4 异步I/O 303
17.6.5 直接I/O 303
17.6.6 块I/O 304
17.6.7 I/O请求锁 304
17.7 小结 304
第18章 应用服务器的性能调优 305
18.1 引言 305
18.2 应用服务器概念 305
18.3 Java、J2EE与应用服务器 305
18.4 应用服务器的性能特征 307
18.4.1 应用服务器的特征 308
18.4.2 Linux上的应用服务器 308
18.5 性能与高可用性的改进 316
18.5.1 SMP扩展性 316
18.5.2 集群 317
18.5.3 拓扑结构 319
18.5.4 性能调优 322
18.6 小结 324
18.7 参考文献 325
第Ⅴ部分 调优案例分析 329
第19章 Linux 2.6内核I/O调度器调优案例分析 329
19.1 引言 329
19.2 基准测试环境与工作负荷概况 330
19.3 I/O调度器与性能 331
19.4 单CPU单磁盘配置 331
19.5 8路RAID-5配置 332
19.6 16路RAID-0配置 335
19.7 AS串行读性能 335
19.8 AS与Deadline的性能 336
19.9 CFQ性能 337
19.10 小结 339
19.11 参考文献 339
第20章 文件系统调优实例分析 341
20.1 引言 341
20.2 文件布局分析 341
20.2.1 Ext2/Ext3文件系统布局 341
20.2.2 日志文件系统(JFS)布局 347
20.2.3 ReiserFS文件系统布局 349
20.2.4 XFS文件系统布局 351
20.3 文件系统的调优机制 353
20.3.1 Ext3的外部日志调优选项 353
20.3.2 ReiserFS的外部日志调优选项 357
20.3.3 JFS的外部日志调优选项 358
20.3.4 XFS的调优选项 359
20.4 I/O的测量方法 361
20.4.1 iostat 361
20.4.2 iostat与sar工具 362
20.5 小结 367
20.6 参考文献 367
第21章 Linux系统网络性能实例分析 369
21.1 引言 369
21.2 实例分析中使用的基准测试 369
21.2.1 NetBench 370
21 2.2 Netperf3 370
21.2.3 VolanoMark 370
21.2.4 SPECWeb99 370
21.3 Linux 2.4与2.6内核中的增强机制 371
21.3.1 SendFile 371
21.3.2 TCP分段卸载 373
21.3.3 网络负荷中的进程与IRQ亲合性 375
21.3.4 NAPI 376
21.3.5 TCP卸载引擎 378
21.4 示例分析 379
21.4.1 NetBench 380
21.4.2 Netperf3(千兆位以太网调优实例分析) 381
21.4.3 VolanoMark 383
21.4.4 SPECWeb99 384
21.5 小结 386
21.6 参考文献 387
第22章 商用负载调优实例分析 389
22.1 引言 389
22.2 商用负载调优概述 389
22.3 J2EE的标准商用负载模型 390
22.4 商用负载模型实例:股票交易 390
22.4.1 系统配置 391
22.4.2 Trade3的详细信息 392
22.4.3 性能分析方法 395
22.5 性能分析试验 397
22.5.1 Web服务器 398
22.5.2 数据库后端程序 399
22.5.3 Java虚拟机 404
22.5.4 应用服务器 406
22.5.5 超线程 408
22.6 小结 409
22.7 参考文献 410
附录A 内核参数调优 411
A.1 引言 411
A.2 sysctl接口 411
A.3 procfs接口 412
A.4 sysfs(只针对Linux 2.6内核) 413
A.5 通用内核参数 413
A.5.1 共享内存 413
A.5.2 进程 414
A.5.3 信号 414
A.5.4 概要分析/调试 414
A.5.5 系统 414
A.6 虚存参数 415
A.7 文件系统参数 416
A.8 网络内核参数 417
A.8.1 网络核心参数 418
A.8.2 ICMP 418
A.8.3 邻居 419
A.8.4 配置 419
A.8.5 路由 420
A.8.6 TCP 420
A.8.7 IP分段 421