特别优惠
跟上新发行和促销的步伐。注册,听取我们的意见。
使用BPF工具优化性能,修复问题,并查看运行中的系统内部
基于bpf的性能工具为您提供了前所未有的系统和应用程序可见性,因此您可以优化性能、排除代码故障、增强安全性并降低成本。BPF性能工具:Linux系统和应用程序的可观察性是使用这些工具进行可观测性的权威指南。
先锋BPF专家Brendan Gregg提出了150多个现成的分析和调试工具,应用它们的专家指导,以及开发自己的逐步教程。您将学习如何分析cpu、内存、磁盘、文件系统、网络、语言、应用程序、容器、管理程序、安全性和内核。Gregg将引导您从基本工具到高级工具,帮助您生成更深入、更有用的技术见解,以改进几乎任何Linux系统或应用程序。
•学习基本的跟踪概念和核心BPF前端:BCC和bpftrace
•掌握150+强大的BPF工具,包括为本书创建的数十个工具,并可下载
•发现更有效分析的实用策略,提示和技巧
•分析多种语言的编译、jit编译和解释代码:C、Java、bash shell等
•生成指标,堆栈跟踪和自定义延迟直方图
•使用互补工具,当他们提供快速,容易的胜利
•探索构建在BPF上的高级工具:用于远程监控的PCP和Grafana,用于跟踪Kubernetes的eBPF出口商和kubectl-trace
•由Alexei Starovoitov撰写的前言,他是新BPF的创建者
BPF性能工具对于在任何企业或云环境中使用任何最新Linux发行版的所有管理员、开发人员、支持人员和其他IT专业人员来说,都是不可或缺的资源。
第一部分:技术
第一章引言
1.1什么是BPF和eBPF?1
1.2什么是跟踪、窥探、抽样、分析和可观察性?2
1.3什么是密件抄送、bpftrace和IO Visor?3.
1.4看一眼密件抄送:快速获胜
1.5 BPF跟踪可见性
1.6动态仪器:kprobes和uprobes
1.7静态仪器:跟踪点和USDT
1.8首看bpftrace: Tracing open(
1.9 Back to BCC: Tracing open(
1.10总结14
第二章技术背景
2.1 BPF图解
2.2 BPF 16
2.3扩展BPF (Extended BPF
2.3.1性能工具为什么需要BPF
2.3.2 BPF与内核模块
2.3.3编写BPF程序
2.3.4查看BPF说明:bpftool
2.3.5查看BPF指令:bpftrace
2.3.6 BPF API
2.3.7 BPF并发控制
2.3.8 BPF sysfs接口
2.3.9 BTF (BPF Type Format
2.3.10 BPF core - re 37
2.3.11 BPF限制
2.3.12 BPF附加阅读
2.4栈跟踪遍历
2.4.1基于帧指针的栈
2.4.2 debuginfo
2.4.3最后分支记录(LBR
2.4.4兽人
2.4.5符号41
2.4.6更多阅读
2.5火焰图41
2.5.1堆栈跟踪
2.5.2分析堆栈跟踪
2.5.3火焰图
2.5.4火焰图特征
2.5.5变量44
2.6事件来源45
2.7 kprobes 46
2.7.1 kprobes的工作原理
2.7.2 kprobes接口
2.7.3 BPF和kprobes
2.7.4 kprobes附加阅读
2.8探针49
2.8.1探针如何工作
2.8.2探测接口
2.8.3 BPF和探针
2.8.4超支和未来工作
2.8.5探查附加阅读
2.9跟踪点
2.9.1添加Tracepoint Instrumentation
2.9.2 Tracepoints的工作原理
2.9.3 Tracepoint接口
2.9.4 Tracepoints与BPF
2.9.5 BPF原始跟踪点
2.9.6附加阅读
2.10 usdt 58
2.10.1添加USDT仪器
2.10.2 USDT工作原理
2.10.3 BPF与USDT 61
2.10.4 USDT附加读数
2.11动态USDT 61
2.12 pmc
2.12.1 PMC模式
2.12.2 pebs 64
2.12.3云计算
2.13 perf_events
2.14概要65
第三章绩效分析
3.1概述67
3.1.1目标68
3.1.2活动68
3.1.3多个性能问题
3.2性能方法69
3.2.1工作量表征70
3.2.2深入分析
3.2.3使用方法
3.2.4检查清单
3.3 Linux 60秒分析
3.3.1正常运行时间
3.3.2 dmesg | tail
3.3.3 vmstat 1
3.3.4 mpstat -P ALL 175
3.3.5 pidstat 1
3.3.6 iostat -xz 1
3.3.7 free -m 77
3.3.8 sar -n DEV 1
3.3.9 sar -n TCP,ETCP 178
3.3.10 top 78
3.4密件抄送工具清单
3.4.1 execsnoop
3.4.2 opensnoop 80
3.4.3 ext4slow
3.4.4生物潜伏期
3.4.5生物显微镜
3.4.6 cachestat
3.4.7 tcpconnect 82
3.4.8 tcpaccept 82
3.4.9 tcpretrans
3.4.10 runqlat 83
3.4.11 profile 84
3.5小结84
第四章密件
4.1 BCC组件
4.2密件抄送功能
4.2.1内核级特性
4.2.2密件抄送用户级功能
4.3 BCC安装
4.3.1内核要求
4.3.2 Ubuntu 88
4.3.3 rhel 89
4.3.4其他发行版
4.4密件抄送工具
4.4.1高亮显示工具
4.4.2工具特性
4.4.3单用途工具
4.4.4多用途工具
4.5 funccount 94
4.5.1 funccount示例
4.5.2 funccount语法
4.5.3 funccount一行程序
4.5.4 funccount用法
4.6 stackcount 99
4.6.1 stackcount示例99
4.6.2 stackcount火焰图100
4.6.3 stackcount中断的堆栈跟踪101
4.6.4 stackcount语法
4.6.5 stackcount一行程序
4.6.6 stackcount用法
4.7 trace 104
4.7.1 trace示例104
4.7.2 trace语法
4.7.3 trace一行命令
4.7.4 trace Structs
4.7.5 trace调试文件描述符泄漏
4.7.6 trace用法
4.8 argdist 110
4.8.1 argdist语法
4.8.2 argdist单行命令
4.8.3 argdist用法
4.9工具文档114
4.9.1手册页:opensnoop 115
4.9.2文件示例:opensnoop 118
4.10开发密件抄送工具
4.11密件内部
4.12 BCC调试
4.12.1 printf()调试
4.12.2 BCC调试输出
4.12.3 BCC调试标志125
4.12.4 bpflist 126
4.12.5 bpftool
4.12.6 dmesg 127
4.12.7复位事件
4.13总览128
第五章bpftrace
5.1 bpftrace组件
5.2 bpftrace特性
5.2.1 bpftrace事件源
5.2.2 bpftrace动作
5.2.3 bpftrace通用特性
5.2.4 bpftrace与其他可观察性工具的比较
5.3安装bpftrace
5.3.1内核要求
5.3.2 Ubuntu 134
5.3.3 Fedora 134
5.3.4构建后步骤
5.3.5其他发行版
5.4 bpftrace工具
5.4.1高亮显示工具
5.4.2工具特性
5.4.3工具执行
5.5 bpftrace一行程序
5.6 bpftrace文档
5.7 bpftrace编程
5.7.1使用方法139
5.7.2程序结构
5.7.3备注140
5.7.4探针格式
5.7.5探测通配符
5.7.6过滤器
5.7.7动作142
5.7.8你好,世界!142
5.7.9功能说明143
5.7.10变量
5.7.11 Map函数
5.7.12定时vfs_read() 145
5.8 bpftrace用法
5.9 bpftrace探测类型
5.9.1 tracepoint
5.9.2 usdt 150
5.9.3 kprobe和kretprobe
5.9.4 uprobe和uretprobe
5.9.5软件和硬件
5.9.6配置文件和间隔
5.10 bpftrace流量控制
5.10.1过滤器154
5.10.2三元运算符
5.10.3 If语句
5.10.4展开的循环
5.11 bpftrace操作符
5.12 bpftrace变量
5.12.1内置变量
5.12.2内置组件:pid、comm、uid 157
5.12.3内置:kstack和ustack
5.12.4内置:位置参数
5.12.5划痕160
5.12.6地图
5.13 bpftrace函数
5.13.1 printf(
5.13.2 join(
5.13.3 str(
5.13.4 kstack()和ustack(
5.13.5 ksym()和usym(
5.13.6 kaddr()和uaddr(
5.13.7 system(
5.13.8 exit(
5.14 bpftrace映射函数
5.14.1 count(
5.14.2 sum(), avg(), min(), max(
5.14.3 hist(
5.14.4 lhist(
5.14.5 delete(
5.14.6 clear() and zero(
5.14.7 print(
5.15 bpftrace未来工作
5.15.1显式地址模式
5.15.2其他补充
5.15.3层175层
5.16 bpftrace内部介绍
5.17 bpftrace Debugging
5.17.1 printf()调试
5.17.2调试模式
5.17.3详细模式
5.18小结180
第二部分:使用BPF工具
第六章cpu /
6.1背景181
6.1.1 CPU基础
6.1.2 BPF功能
6.1.3策略185
6.2传统工具186
6.2.1内核统计
6.2.2硬件统计
6.2.3硬件采样
6.2.4定时采样
6.2.5事件统计与跟踪
6.3 BPF工具
6.3.1 execsnoop
6.3.2 exitsnoop
6.3.3 runqlat
6.3.4 runqlen
6.3.5 runqslow
6.3.6 cpudist 211
6.3.7 cpufreq
6.3.8 profile 215
6.3.9 offcputime 219
6.3.10 syscount 224
6.3.11 argdist和trace
6.3.12 funccount
6.3.13 softirqs
6.3.14 harddirqs
6.3.15 smpcalls 233
6.3.16 llcstat 237
6.3.17其他工具
6.4 BPF俏皮话
6.4.1 BCC 238
6.4.2 bpftrace 239
6.5可选练习240
6.6小结241
第七章记忆/
7.1背景信息244
7.1.1内存基础
7.1.2 BPF功能
7.1.3 250策略
7.2传统工具250
7.2.1内核日志
7.2.2内核统计
7.2.3硬件统计与采样
7.3 BPF工具
7.3.1 omkill
7.3.2 memleak
7.3.3 mapsnoop
7.3.4制动器
7.3.5 shmsnoop 264
7.3.6故障264
7.3.7错误
7.3.8 vmscan
7.3.9 dropop
7.3.10 swap 272
7.3.11 hfault 273
7.3.12其他工具
7.4 BPF俏皮话
7.4.1密件抄送
7.4.2 bpftrace
7.5可选练习275
7.6小结276
第八章文件系统
8.1背景278
8.1.1文件系统基础
8.1.2 BPF功能
8.1.3策略281
8.2传统工具282
8.2.1 df 282
8.2.2 283 mount
8.2.3 strace 283
8.2.4 perf 284
8.2.5 fatrace 286
8.3 BPF工具
8.3.1 opensnoop 289
8.3.2 statsnoop
8.3.3 synsnoop
8.3.4 mmapfiles 294
8.3.5 scread 295
8.3.6 fmapfault 297
8.3.7 filelife
8.3.8 vfsstat 299
8.3.9 vfaccount 301
8.3.10 vfssize 302
8.3.11 fsrwstat 304
8.3.12 fileslower 306
8.3.13 filetop 308
8.3.14 writesync 310
8.3.15文件类型311
8.3.16 cachestat 314
8.3.17回写
8.3.18 dcstat 318
8.3.19 dcsnoop 320
8.3.20 mountsnoop 322
8.3.21 xfslow 323
8.3.22 xfsdist 324
8.3.23 ext4dist 327
8.3.24 icstat 330
8.3.25 bugrow 331
8.3.26 readahead
8.3.27其他工具
8.4 BPF单行程序
8.4.1密件334
8.4.2 bpftrace 335
8.4.3 BPF小程序示例
8.5可选练习340
8.6小结340
第9章磁盘I/O 341
9.1背景
9.1.1磁盘基础
9.1.2 BPF功能
9.1.3 346策略
9.2传统工具
9.2.1 iostat 346
9.2.2 perf 348
9.2.3黑迹
9.2.4 SCSI日志记录
9.3 BPF工具
9.3.1生物潜伏期
9.3.2生物探针358
9.3.3 biotop 361
9.3.4 bitsize 362
9.3.5 seeksize 364
9.3.6生物图案
9.3.7生物堆
9.3.8 bioerr 371
9.3.9 mdflush 374
9.3.10 iosched 375
9.3.11 scsilatency 377
9.3.12 scsiresult 379
9.3.13 nvmelatency
9.4 BPF一行程序
9.4.1 BCC 384
9.4.2 bpftrace 385
9.4.3 BPF一行程序示例
9.5可选练习
9.6小结387
第十章人际关系
10.1背景资料390
10.1.1网络基础
10.1.2 BPF功能
10.1.3 398策略
10.1.4常见跟踪错误399
10.2传统工具399
10.2.1 ss 400
10.2.2 IP 402
10.2.3 nstat 402
10.2.4 netstat 403
10.2.5 SAR 405
10.2.6 nicstat 406
10.2.7 ethtool 407
10.2.8 tcpdump 408
10.2.9 /proc 409
10.3 BPF工具
10.3.1 sockstat 412
10.3.2 sofamily
10.3.3 soprotocol 416
10.3.4 soconnect 419
10.3.5 soaccept 422
10.3.6 sockettio 424
10.3.7 socksize 426
10.3.8 sormem 429
10.3.9 soconlat 432
10.3.10 so1stbyte 435
10.3.11 tcpconnect 437
10.3.12 tcpaccept 440
10.3.13 tcplife 443
10.3.14 tcptop 448
10.3.15 tcpsnoop 449
10.3.16 tcpretrans 450
10.3.17 tcpsynbl 453
10.3.18 tcpwin 454
10.3.19 tcpnagle 456
10.3.20 udpconnect 458
10.3.21 gethostlatency
10.3.22 ipecn 461
10.3.23 superping 463
10.3.24 qdisk -fq 466
10.3.25 qdisk -cbq, qdisk -cbs, qdisk -codel, qdisk -fq_codel, qdisk -red, qdisk -tbf 468
10.3.26 netsize 470
10.3.27 netxlat 473
10.3.28 skbdrop 475
10.3.29 skblife
10.3.30 ieee80211scan 479
10.3.31其他工具
10.4 BPF一行字
10.4.1密件482
10.4.2 bpftrace
10.4.3 BPF一行示例
10.5可选练习
10.6小结488
第十一章安全
11.1背景
11.1.1 BPF功能
11.1.2无特权BPF用户
11.1.3配置BPF安全
11.1.4 495策略
11.2 BPF工具
11.2.1 execsnoop 496
11.2.2 elfsnoop
11.2.3 modsnoop 498
11.2.4 bashreadline 499
11.2.5 shellsnoop 500
11.2.6 ttysnoop 502
11.2.7 opensnoop 503
11.2.8烫发504
11.2.9 tcpconnect和tcpaccept
11.2.10 tcpreset 506
11.2.11 capable 508
11.2.12 setuids 512
11.3 BPF一行字
11.3.1密件514
11.3.2 bpftrace
11.3.3 BPF一行程序示例
11.4小结515
第十二章语言
12.1背景信息517
12.1.1编译518
12.1.2 JIT编译
12.1.3解析式520
12.1.4 BPF功能
12.1.5 521策略
12.1.6 BPF工具
12.2 c 522
12.2.1 C函数符号
12.2.2 C栈跟踪
12.2.3 C函数跟踪
12.2.4 C函数偏移量跟踪
12.2.5 c usdt 529
12.2.6 C俏皮话
12.3 Java 531
12.3.1 libjvm跟踪
12.3.2 jistacks
12.3.3 Java线程名
12.3.4 Java方法符号
12.3.5 Java堆栈跟踪
12.3.6 Java USDT探测
12.3.7 profile 549
12.3.8 offcputime 553
12.3.9 stackcount 559
12.3.10 javastat 562
12.3.11 javathreads
12.3.12 java调用565
12.3.13 javaflow 566
12.3.14 javagc 568
12.3.15 javaobjnew 568
12.3.16 Java One-Liners
12.4 Bash Shell
12.4.1功能计数572
12.4.2函数参数跟踪(bashfuncs .bt
12.4.3功能延迟(bashfunclat.bt
12.4.4 /bin/bash 577
12.4.5 /bin/bash USDT 581
12.4.6 bash命令行
12.5其他语言
12.5.1 JavaScript (Node.js
12.5.2 c++ 585
12.5.3 Golang 585
12.6总结
第十三章应用
13.1背景资料
13.1.1应用基础
13.1.2应用示例:MySQL Server 591
13.1.3 BPF功能
13.1.4 592策略
13.2 BPF工具
13.2.1 execsnoop 595
13.2.2 threadsnoop 595
13.2.3 profile 598
13.2.4螺纹601
13.2.5 offcputime 603
13.2.6 offcpuhist 607
13.2.7 syscount 610
13.2.8 ioprofile 611
13.2.9 libc帧指针
13.2.10 mysqld_qslow
13.2.11 mysqld_clat 617
13.2.12信号621
13.2.13 killsnoop 623
13.2.14 pmlock和pmheld 624
13.2.15 naptime 629
13.2.16其他工具
13.3 BPF一体机
13.3.1 BCC 631
13.3.2 bpftrace 631
13.4 BPF一行例句
13.4.1 libpthread条件变量函数1秒计数
13.5小结633
第14章内核
14.1背景
14.1.1内核基础
14.1.2 BPF功能
14.2 639策略
14.3传统工具
14.3.1 Ftrace 640
14.3.2 perf sched 643
14.3.3平板电脑644
14.3.4其他工具
14.4 BPF工具
14.4.1加载646
14.4.2 offcputime 647
14.4.3 wakeuptime 649
14.4.4 offwaketime 650
14.4.5 mlock, hold 652
14.4.6自旋锁
14.4.7公里657
14.4.8页658
14.4.9 memleak 659
14.4.10 slabratetop 660
14.4.11 nummove 661
14.4.12 workq 663
14.4.13微线程
14.4.14其他工具
14.5 BPF俏皮话666
14.5.1密件666
14.5.2 bpftrace 666
14.6 BPF一行例句
14.7挑战668
14.8小结
第十五章容器
15.1背景
15.1.1 BPF功能
15.1.2挑战673
15.1.3 676策略
15.2传统工具
15.2.1来自主机676
15.2.2从容器
15.2.3 systemd-cgtop 677
15.2.4 kubectl top 678
15.2.5 docker统计信息678
15.2.6 /sys/fs/cgroups
15.2.7 perf 679
15.3 BPF工具
15.3.1 runqlat 680
15.3.2 pidnss 681
15.3.3黑喉683
15.3.4覆盖684
15.4 BPF一行字
15.5可选练习
15.6小结
第十六章管理程序
16.1背景
16.1.1 BPF功能
16.1.2建议策略
16.2传统工具
16.3 Guest BPF工具
16.3.1 Xen Hypercalls 693
16.3.2 xenhyper 697
16.3.3 Xen回调
16.3.4 cpustolen 700
16.3.5 HVM退出跟踪
16.4主机BPF工具
16.4.1 kvexits 702
16.4.2未来工作
16.5小结
第三部分:附加主题
第十七章其他BPF性能工具
17.1矢量与性能副驾驶(PCP
17.1.1可视化
17.1.2可视化:热图
17.1.3可视化:表格数据
17.1.4密件抄送指标
17.1.5内部部件
17.1.6安装PCP和Vector 715
17.1.7连接和查看数据
17.1.8配置BCC PMDA 717
17.1.9未来工作
17.1.10深入阅读
17.2 Grafana和Performance Co-Pilot (PCP
17.2.1安装与配置
17.2.2连接和查看数据
17.2.3未来工作
17.2.4深入阅读
17.3 Cloudflare eBPF Prometheus export (with Grafana
17.3.1构建并运行ebpf导出器
17.3.2配置Prometheus监控ebpf_export实例722
17.3.3在Grafana 722中设置查询
17.3.4深入阅读
17.4 kubectl-trace
17.4.1跟踪节点
17.4.2跟踪pod和container
17.4.3深入阅读
17.5其他工具
17.6小结
第十八章提示、技巧和常见问题
18.1典型事件频率和开销
18.1.1 728频率
18.1.2执行的操作
18.1.3自我测试
18.2以49赫兹或99赫兹取样
18.3黄猪和灰鼠
18.4写入目标软件
18.5学习系统呼叫734
18.6保持简单
18.7事件丢失
18.8栈迹丢失
18.8.1如何修复损坏的堆栈跟踪
18.9打印时缺少符号(函数名
18.9.1如何修复丢失的符号:JIT运行时(Java, Node.js,…
18.9.2如何修复丢失的符号:ELF二进制文件(C, c++,…
18.10跟踪时缺少函数
18.11反馈回路
18.12丢弃的事件
第四部分:附录
附录A bpftrace一行程序
附录B bpftrace小抄表
附录C密件抄送工具开发
附录D C BPF 763
附录E BPF说明书
术语表789
参考书目795
指数805