作 者:(美)布兰登·格雷格 著 孙宇聪 等 译
定 价:199
出 版 社:电子工业出版社
出版日期:2021年01月01日
页 数:856
装 帧:平装
ISBN:9787121399725
●章引言.1
1.1BPF和eBPF是什么.1
1.2跟踪、、采样、剖析和可观测性分别是什么.2
1.3BCC、bpftrace和IOVisor.3
1.4初识BCC:快速上手.4
1.5BPF跟踪的能见度.7
1.6动态插桩:kprobes和uprobes.8
1.7静态插桩:tracepoint和USDT.9
1.8初识bpftrace:跟踪open().10
1.9再回到BCC:跟踪open().13
1.10小结.15
第2章技术背景.16
2.1图释BPF.16
2.2BPF.17
2.3扩展版BPF.18
2.3.1为什么性能工具需要BPF技术.21
2.3.2BPF与内核模块的对比.23
2.3.3编写BPF程序.23
2.3.4使用BPF查看指令集:bpftool.24
2.3.5使用bpftrace查看BPF指令集.32
2.3.6BPFAPI.33
2.3.7BPF并发控制.37
2.3.8BPFsysfs接口.38
2.3.9BPF类型格式.38
2.3.10BPFCO-RE.39
2.3.11BPF的局限性.40
2.3.12BPF扩展阅读资料.40
2.4调用栈回溯.41
2.4.1基于帧指针的调用栈回溯.41
2.4.2调试信息.42
2.4.3后分支记录.43
2.4.4ORC.43
2.4.5符号.43
2.4.6扩展阅读.43
2.5火焰图.44
2.5.1调用栈信息.44
2.5.2对调用栈信息的剖析.44
2.5.3火焰图.45
2.5.4火焰图的特性.47
2.5.5火焰图的变体.48
2.6事件源.48
2.7kprobes.49
2.7.1kprobes是如何工作的.49
2.7.2kprobes接口.51
2.7.3BPF和kprobes.51
2.7.4关于kprobes的更多内容.53
2.8uprobes.53
2.8.1uprobes是如何工作的.53
2.8.2uprobes接口.55
2.8.3BPF与uprobes.55
2.8.4uprobes的开销和未来的工作.56
2.8.5扩展阅读.57
2.9跟踪点.57
2.9.1如何添加跟踪点.58
2.9.2跟踪点的工作原理.59
2.9.3跟踪点的接口.60
2.9.4跟踪点和BPF.61
2.9.5BPF原始跟踪点.62
2.9.6扩展阅读.62
2.10USDT.62
2.10.1添加USDT探针.63
2.10.2USDT是如何工作的.65
2.10.3BPF与USDT.66
2.10.4USDT的更多信息.66
2.11动态USDT.66
2.12性能监控计数器.68
2.12.1PMC的模式.68
2.12.2PEBS.69
2.12.3云计算.69
2.13perf_events.69
2.14小结.70
第3章性能分析.71
3.1概览.71
3.1.1目标.71
3.1.2分析工作.72
3.1.3多重性能问题.73
3.2性能分析方.73
3.2.1业务负载画像.74
3.2.2下钻分析.75
3.2.3USE方.76
3.2.4检查清单法.77
3.3Linux60秒分析.77
3.3.1uptime.77
3.3.2dmesg|tail.78
3.3.3vmstat1.78
3.3.4mpstat-PALL1.79
3.3.5pidstat1.80
3.3.6iostat-xz1.80
3.3.7free-m.82
3.3.8sar-nDEV1.82
3.3.9sar-nTCP,ETCP1.83
3.3.10top.83
3.4BCC工具检查清单.84
3.4.1execsnoop.84
3.4.2opensnoop.85
3.4.3ext4slower.85
3.4.4biolatency.86
3.4.5biosnoop.86
3.4.6cachestat.87
3.4.7tcpconnect.87
3.4.8tcpaccept.87
3.4.9tcpretrans.88
3.4.10runqlat.88
3.4.11profile.89
3.5小结.90
第4章BCC.91
4.1BCC的组件.92
4.2BCC的特性.92
4.2.1BCC的内核态特性.92
4.2.2BCC的用户态特性.93
4.3安装BCC.94
4.3.1内核要求.94
4.3.2Ubuntu.94
4.3.3RHEL.95
4.3.4其他发行版.95
4.4BCC的工具.96
4.4.1重点工具.96
4.4.2工具的特点.97
4.4.3单一用途工具.98
4.4.4多用途工具.99
4.5funccount.100
4.5.1funccount的示例.101
4.5.2funccount的语法.103
4.5.3funccount的单行程序.103
4.5.4funccount的帮助信息.104
4.6stackcount.105
4.6.1stackcount的示例.105
4.6.2stackcount的火焰图.107
4.6.3stackcount残缺的调用栈.108
4.stackcount的语法.108
4.6.5stackcount的单行程序.109
4.6.6stackcount的帮助信息.109
4.7trace.110
4.7.1trace的示例.111
4.7.2trace的语法.111
4.7.3trace的单行程序.113
4.7.4trace的结构体.113
4.7.5trace调试文件描述符泄露问题.114
4.7.6trace的帮助信息.115
4.8argdist.117
4.8.1argdist的语法.118
4.8.2argdist的单行程序.119
4.8.3argdist的帮助信息.119
4.9工具文档.121
4.9.1man帮助文档:opensnoop.121
4.9.2示例文件:opensnoop.125
4.10开发BCC工具.126
4.11BCC的内部实现.127
4.12BCC的调试.128
4.12.1printf()调试.129
4.12.2BCC调试输出.131
4.12.3BCC的调试标志位.132
4.12.4bpflist.133
4.12.5bpftool.134
4.12.6dmesg.134
4.12.7重置事件.134
4.13小结.136
第5章bpftrace.137
5.1bpftrace的组件.138
5.2bpftrace的特性.139
5.2.1bpftrace的事件源.139
5.2.2bpftrace的动作.139
5.2.3bpftrace的一般特性.140
5.2.4bpftrace与其他观测工具的比较.140
5.3bpftrace的安装.141
5.3.1内核版本要求.141
5.3.2Ubuntu.142
5.3.3Fedora.142
5.3.4构建后的安装步骤.143
5.3.5其他发行版.143
5.4bpftrace工具.143
5.4.1重点工具.144
5.4.2工具特征.144
5.4.3工具的运行.145
5.5bpftrace单行程序.145
5.6bpftrace的文档.146
5.7bpftrace编程.146
5.7.1用法.147
5.7.2程序结构.148
5.7.3注释.148
5.7.4探针格式.149
5.7.5探针通配符.149
5.7.6过滤器.150
5.7.7动作.150
5.7.8Hello,World!.151
5.7.9函数.151
5.7.10变量.152
5.7.11映射表函数.153
5.7.12对vfs_read()计时.154
5.8bpftrace的帮助信息.155
5.9bpftrace的探针类型.157
5.9.1tracepoint.157
5.9.2usdt.159
5.9.3kprobe和kretprobe.160
5.9.4uprobe和uretprobe.160
5.9.5software和hardware.161
5.9.6profile和interval.162
5.10bpftrace的控制流.163
5.10.1过滤器.163
5.10.2三元操作符.163
5.10.3if语句.163
5.10.4循环展开.1
5.11bpftrace的运算符.1
5.12bpftrace的变量.165
5.12.1内置变量.165
5.12.2内置变量:pid、comm和uid.166
5.12.3内置变量:kstack和ustack.166
5.12.4内置变量:位置参数.168
5.12.5临时变量.169
5.12.6映射表变量.169
5.13bpftrace的函数.170
5.13.1printf().171
5.13.2join().172
5.13.3str().173
5.13.4kstack()和ustack().173
5.13.5ksym()和usym().174
5.13.6kaddr()和uaddr().175
5.13.7system().176
5.13.8et().176
5.14bpftrace映射表的操作函数.177
5.14.1count().177
5.14.2sum()、avg()、min()和max().178
5.14.3hist().179
5.14.4lhist().180
5.14.5delete().181
5.14.6clear()和zero().181
5.14.7print().182
5.15bpftrace的下一步工作.183
5.15.1显式区分地址模式.183
5.15.2其他扩展.184
5.15.3ply.184
5.16bpftrace的内部运作.185
5.17bpftrace的调试.186
5.17.1printf()调试.186
5.17.2调试模式.187
5.17.3详情模式.188
5.18小结.190
第6章CPU.191
6.1背景知识.192
6.1.1CPU基础知识.192
6.1.2BPF的分析能力.194
6.1.3分析策略.196
6.2传统工具.197
6.2.1内核统计.197
6.2.2硬件统计.200
6.2.3硬件采样.202
6.2.4定时采样.203
6.2.5事件统计与事件跟踪.207
6.3BPF工具.210
6.3.1execsnoop.211
6.3.2etsnoop.214
6.3.3runqlat.215
6.3.4runqlen.219
6.3.5runqslower.222
6.3.6cpudist.223
6.3.7cpufreq.224
6.3.8profile.227
6.3.9offcputime.232
6.3.10syscount.236
6.3.11argdist和trace.239
6.3.12funccount.242
6.3.13softirqs.244
6.3.14hardirqs.245
6.3.15smpcalls.246
6.3.16llcstat.250
6.3.17其他工具.251
BPF单行程序.251
.1BCC工具.251
.2bpftrace版本.252
6.5可选练习.253
6.6小结.254
第7章内存.255
7.1背景知识.256
7.1.1内存基础知识.256
7.1.2BPF的分析能力.260
7.1.3分析策略.262
7.2传统工具.263
7.2.1内核日志.263
7.2.2内核统计信息.2
7.2.3硬件统计和硬件采样.268
7.3BPF工具.269
7.3.1oomkill.270
7.3.2memleak.271
7.3.3mmapsnoop.274
7.3.4brkstack.275
7.3.5shmsnoop.277
7.3.6faults.277
7.3.7ffaults.280
7.3.8vmscan.281
7.3.9drsnoop.284
7.3.10swapin.285
7.3.11hfaults.287
7.3.12其他工具.287
7.4BPF单行程序.288
7.4.1BCC.288
7.4.2bpftrace.288
7.5可选练习.289
7.6小结.290
第8章文件系统.291
8.1背景知识.292
8.1.1文件系统基础知识.292
8.1.2BPF的分析能力.294
8.1.3分析策略.295
8.2传统工具.296
8.2.1df.297
8.2.2mount.297
8.2.3strace.298
8.2.4perf.298
8.2.5fatrace.301
8.3BPF工具.302
8.3.1opensnoop.303
8.3.2statsnoop.306
8.3.3syncsnoop.308
8.3.4mmapfiles.309
8.3.5scread.311
8.3.6fmapfault.312
8.3.7filelife.313
8.3.8vfsstat.315
8.3.9vfscount.317
8.3.10vfssize.318
8.3.11fsrwstat.320
8.3.12fileslower.322
8.3.13filetop.325
8.3.14writesync.327
8.3.15filetype.328
8.3.16cachestat.331
8.3.17writeback.334
8.3.18dcstat.336
8.3.19dcsnoop.338
8.3.20mountsnoop.340
8.3.21xfsslower.341
8.3.22xfsdist.342
8.2.23ext4dist.345
8.3.24icstat.348
8.3.25bufgrow.350
8.3.26readahead.351
8.3.27其他工具.353
8.4BPF单行程序.353
8.4.1BCC.353
8.4.2bpftrace.354
8.4.3BPF单行程序示范.356
8.5可选练习.359
8.6小结.360
第9章磁盘I/O.361
9.1背景知识.362
9.1.1磁盘系统基础知识.362
9.1.2BPF的分析能力.365
9.1.3分析策略.366
9.2传统工具.367
9.2.1iostat.367
9.2.2perf.369
9.2.3blktrace.370
9.2.4SCSI日志.371
9.3BPF工具.372
9.3.1biolatency.373
9.3.2biosnoop.379
9.3.3biotop.383
9.3.4bitesize.384
9.3.5seeksize.386
9.3.6biopattern.388
9.3.7biostacks.390
9.3.8bioerr.393
9.3.9mdflush.395
9.3.10iosched.397
9.3.11scsilatency.399
9.3.12scsiresult.401
9.3.13nvmelatency.403
9.4BPF单行程序.406
9.4.1BCC.406
9.4.2bpftrace.407
9.4.3BPF单行程序示范.408
9.5可选练习.409
9.6小结.410
0章网络.411
10.1背景知识.412
10.1.1网络基础知识.412
10.1.2BPF的分析能力.419
10.1.3分析策略.421
10.1.4常见的跟踪错误.421
10.2传统工具.422
10.2.1ss.423
10.2.2ip.424
10.2.3nstat.425
10.2.4netstat.425
10.2.5sar.428
10.2.6nicstat.429
10.2.7ethtool.429
10.2.8tcpdump.431
10.2.9/proc.432
10.3BPF工具.433
10.3.1sockstat.435
10.3.2sofamily.437
10.3.3soprotocol.440
10.3.4soconnect.442
10.3.5soaccept.445
10.3.6socketio.447
10.3.7socksize.450
10.3.8sormem.452
10.3.9soconnlat.455
10.3.10so1stbyte.459
10.3.11tcpconnect.461
10.3.12tcpaccept.4
10.3.13tcplife.467
10.3.14tcptop.472
10.3.15tcpsnoop.473
10.3.16tcpretrans.474
10.3.17tcpsynbl.477
10.3.18tcpwin.479
10.3.19tcpnagle.481
10.3.20udpconnect.483
10.3.21gethostlatency.485
10.3.22ipecn.487
10.3.23superping.488
10.3.24qdisc-fq.491
10.3.25qdisc-cbq、qdisc-cbs、qdisc-codel、qdisc-fq_codel、qdisc-red、qdisc-tbf.493
10.3.26netsize.495
10.3.27nettxlat.498
10.3.28skbdrop.500
10.3.29skblife.503
10.3.30ieee80211scan.505
10.3.31其他工具.507
10.4BPF单行程序.507
10.4.1BCC.507
10.4.2bpftrace.508
10.4.3BPF单行程序示范.510
10.5可选练习.513
10.6小结.515
1章安全.516
11.1背景知识.516
11.1.1BPF的分析能力.517
11.1.2无特权BPF用户.521
11.1.3配置BPF安全策略.521
11.1.4分析策略.523
11.2BPF工具.523
11.2.1execsnoop.524
11.2.2elfsnoop.524
11.2.3modsnoop.526
11.2.4bashreadline.527
11.2.5shellsnoop.528
11.2.6ttysnoop.530
11.2.7opensnoop.532
11.2.8eperm.532
11.2.9tcpconnect和tcpaccept.534
11.2.10tcpreset.534
11.2.11capable.536
11.2.12setuids.540
11.3BPF单行程序.542
11.3.1BCC.542
11.3.2bpftrace.543
11.3.3BPF单行程序示范.543
11.4小结.544
2章编程语言.545
12.1背景知识.545
12.1.1编译型语言.546
12.1.2即时编译型语言.547
12.1.3解释型语言.548
12.1.4BPF的分析能力.549
12.1.5分析策略.550
12.1.6BPF工具.550
12.2C.551
12.2.1C函数符号.552
12.2.2C调用栈.555
12.2.3C函数跟踪.557
12.2.4C函数偏移量跟踪.558
12.2.5CUSDT.558
12.2.6C单行程序.559
12.3Java.560
12.3.1跟踪libjvm.561
12.3.2jnistacks.563
12.3.3Java线程名字.565
12.3.4Java方法的符号.566
12.3.5Java调用栈.569
12.3.6JavaUSDT探针.573
12.3.7profile.579
12.3.8offcputime.583
12.3.9stackcount.589
12.3.10javastat.593
12.3.11javathreads.594
12.3.12javacalls.596
12.3.13javaflow.597
12.3.14javagc.599
12.3.15javaobjnew.599
12.3.16Java单行程序.600
12.4bashshell.601
12.4.1函数计数.603
12.4.2函数参数跟踪(bashfunc.bt).604
12.4.3函数执行时长(bashfunclat.bt).607
12.4.4/bin/bash.609
12.4.5/bin/bashUSDT.613
12.4.6bash单行程序.613
12.5其他语言.614
12.5.1(Node.js).614
12.5.2C++.616
12.5.3Golang.616
12.6小结.619
3章应用程序.620
13.1背景知识.621
13.1.1应用程序基础信息.621
13.1.2应用程序示例:MySQL服务器.622
13.1.3BPF的能力.623
13.1.4分析策略.624
13.2BPF工具.625
13.2.1execsnoop.626
13.2.2threadsnoop.626
13.2.3profile.629
13.2.4threaded.632
13.2.5offcputime.634
13.2.6offcpuhist.638
13.2.7syscount.1
13.2.8ioprofile.2
13.2.9libc帧指针.4
13.2.10mysqld_qslower.5
13.2.11mysqld_clat.8
13.2.12signals.652
13.2.13killsnoop.654
13.2.14pmlock和pmheld.655
13.2.15naptime.660
13.2.16其他工具.662
13.3BPF单行程序.662
13.3.1BCC.662
13.3.2bpftrace.663
13.4BPF单行程序示范.6
13.5小结.6
4章内核.665
14.1背景知识.666
14.1.1内核基础知识.666
14.1.2BPF的分析能力.668
14.2分析策略.669
14.3传统工具.670
14.3.1Ftrace.670
14.3.2perfsched.673
14.3.3slabtop.674
14.3.4其他工具.675
14.4BPF工具.675
14.4.1loads.676
14.4.2offcputime.677
14.4.3wakeuptime.679
14.4.4offwaketime.681
14.4.5mlock和mheld.683
14.4.6自旋锁.687
14.4.7kmem.688
14.4.8kpages.689
14.4.9memleak.690
14.4.10slabratetop.691
14.4.11numamove.692
14.4.12workq.694
14.4.13小任务.695
14.4.14其他工具.696
14.5BPF单行程序.697
14.5.1BCC.697
14.5.2bpftrace.698
14.6BPF单行程序示范.699
14.6.1按系统调用函数对系统调用进行计数.699
14.6.2对内核函数开始的hrtimer进行计数.699
14.7挑战.700
14.8小结.700
5章容器.701
15.1背景知识.701
15.1.1BPF的分析能力.703
15.1.2挑战.703
15.1.3分析策略.706
15.2传统工具.706
15.2.1从主机上分析.706
15.2.2在容器内分析.707
15.2.3systemd-cgtop.707
15.2.4kubectltop.708
15.2.5dockerstats.708
15.2.6/sys/fs/cgroups.709
15.2.7perf.709
15.3BPF工具.710
15.3.1runqlat.710
15.3.2pidnss.711
15.3.3blkthrot.714
15.3.4overlayfs.715
15.4BPF单行程序.717
15.5可选练习.717
15.6小结.718
6章虚拟机管理器.719
16.1背景知识.719
16.1.1BPF的分析能力.721
16.1.2建议的分析策略.722
16.2传统工具.722
16.3访客系统的BPF工具.723
16.3.1Xen调用.723
16.3.2xenhyper.727
16.3.3Xen回调.729
16.3.4cpustolen.731
16.3.5HVM退出跟踪.732
1宿主机BPF工具.732
1.1kvmets.733
1.2未来的工作.737
16.5小结.737
7章其他BPF性能工具.738
17.1Vector和PerformanceCo-Pilot(PCP).738
17.1.1可视化.739
17.1.2可视化:热图.740
17.1.3可视化:表格形式的数据.742
17.1.4BCC提供的指标.743
17.1.5内部实现.743
17.1.6安装PCP和Vector.744
17.1.7连接并显示数据.744
17.1.8配置BCCPMDA.746
17.1.9改进工作.747
17.1.10进一步阅读.747
17.2Grafana和PerformanceCo-Pilot.747
17.2.1安装和配置.748
17.2.2连接并查看数据.748
17.2.3改进工作.750
17.2.4进一步阅读.750
17.3CloudflareeBPFPrometheusExporter(配合Grafana).750
17.3.1构建并运行ebpf导出器.750
17.3.2配置Prometheus监控ebpf_exporter实例.751
17.3.3在Grafana中设置一个查询.751
17.3.4进一步阅读.751
17.4kubectl-trace.752
17.4.1跟踪节点.752
17.4.2跟踪pod和容器.753
17.4.3进一步阅读.755
17.5其他工具.755
17.6小结.755
8章建议、技巧和常见问题..756
18.1典型事件的频率和额外开销.756
18.1.1频率.757
18.1.2执行的操作.758
18.1.3自行测试.760
18.2以49Hz或99Hz为采样频率.760
18.3黄猪和灰鼠.760
18.4开发目标软件.762
18.5学统调用.763
18.6保持简单.7
18.7事件缺失.7
18.8调用栈缺失.766
18.8.1如何修复损坏的调用栈.767
18.9打印时符号缺失(函数名称).767
18.9.1如何修复符号缺失:JIT运行时(Java、Node.js、.).768
18.9.2如何修复符号缺失:ELF二进制文件(C、C++、.).768
18.10跟踪时函数缺失.768
18.11反馈回路.769
18.12被丢掉的事件.769
附录Abpftrace单行程序.770
附录Bbpftrace备忘单.775
附录CBCC工具的开发.778
附录DC.BPF..793
附录EBPF指令.812
基于BPF的性能优化工具提供了的系统级和应用程序级的观察能力,使用这些工具可以优化性能、调试代码、增强安全性、降低成本。本书是使用这些观察工具的全面指南。本书作为全面介绍BPF技术的图书,从BPF技术的起源到未来发展方向都有涵盖,不仅全面介绍了BPF的编程模型,还完整介绍了主要的BPF前端编程框架―BCC和bpftrace,更给出了一系列实现范例,全面展示了BPF技术的实际能力和未来发展前景,以及使用BPF工具优化性能、修复问题、探索线上系统的内部情况。本书的另一个关注方向是Linux系统性能和应用程序性能的调优。本书全面介绍了系统性能调优的策略、工具与实践案例,不仅介绍了对应的BPF工具,还着重介绍了这些工具如何与Linux传统性能工具进行互补,这样读者可以有选择地进行使用。本书介绍的工具小巧精致,且包含了简单易读的源代码,这就是BPF技术的魅力所在:安全、高效、快捷的系统扩展力。未来B等
(美)布兰登·格雷格 著 孙宇聪 等 译
"Brendan Gregg(布兰登.格雷格)
Netflix 不错性能工程师
Brendan Gregg 是 BPF(eBPF)的主要贡献者,他帮助开发和维护了主要的 BPF 前端框架,开创了 BPF 用于可观测性的先河,并创建了数十种基于 BPF 的性能分析工具。他编著的书有《性能之巅:洞悉系统、企业与云计算》。
译者介绍
孙宇聪:现任 Facebook 运维工程师经理,曾在谷歌工作多年,任谷歌不错SRE(Senior Site Reliblity Engineer),Coding.net 前技术负责人,译有《SRE:Google运维解密》《架构整洁之道》等经典技术图书。等