通过工具寻找TiDB瓶颈
一、课前准备
1.1 启动Tidb集群
因为Lesson-2已经通过tiup工具部署好了一个tidb集群,所以现在只需要执行如下命令就可以直接启动tidb集群了
tiup cluster start cfq-tidb-cluster
二、分析性能
2.1 CPU profile
2.1.1 通过tidb dashboard进行分析
https://docs.pingcap.com/zh/tidb/stable/dashboard-profiling
在浏览器中访问http://10.234.11.200:2379/dashboard/#/overview
2.1.2 通过debug.zip分析tidb性能
通过如下命令分析60s,并把分析 tidb 性能问题所需的多个 profile 文件打包生成一个 zip 文件
curl http://{TiDBIP}:10080/debug/zip?seconds=60 --output debug.zip
debug.zip 解压后可以看到以下几个文件:
- version tidb-server 版本
- profile
CPU profile 文件 - heap
heap profile 文件 - goroutine
所有 goroutine 的栈信息 - mutex
mutex profile 文件 - config
tidb server 的配置文件
通过如下命令在 web 界面上查看
go tool pprof -http=:8080 debug/profile
火焰图是从线程或者说是函数调用栈的角度去展示哪些地方消耗了CPU,也可以很好的指导我们去阅读代码,因为其展示了函数的调用关系。
2.1.3 通过perf命令分析Tikv CPU 性能
git clone https://github.com/pingcap/tidb-inspect-tools
cd tracing_tools/perf
sudo sh ./cpu_tikv.sh $tikv-pid
sudo sh ./dot_tikv.sh $tikv-pid
在命令之前,需要执行apt install linux-perf
安装perf;但是执行反馈找不到命令,参考如下文章解决
https://blog.csdn.net/sinat_35866463/article/details/103476997
之后修改cpu_tikv.sh脚本,但还是因为deepin和centos系统的一些文件系统结构不同,不能执行,所以就不考虑用这个分析了。
2.2 IO
2.2.1 Grafana: Disk-Performance
2.2.2 iostat
iostat -x 1 -m
○ Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
○ nvme0n1 0.00 0.00 0.00 5.00 0.00 0.02 8.00 0.00 0.00 0.00 0.00 0.00 0.00
○ sda 0.00 15.00 0.00 30.00 0.00 0.20 13.60 0.00 0.07 0.00 0.07 0.07 0.20
○ sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- await:平均每次设备 I/O 操作的等待时间 (毫秒)
- r_await:读操作等待 时间
- 如果该值比较高(比如超过 5ms 级别)说明磁盘读压力比较大
- w_await:写操作等待 时间
- 如果该值比较高(比如超过 5ms 级别)说明磁盘写压力比较大
- 可以看 io size、io 连续性、读写瞬时流量、读写分别的 iops
2.2.3 iotop
- iostat 是从盘的角度出发来看 IO
- iotop 是从进程角度看 IO
- iotop 用于看各个线程的 io 累积量,有没有超出预期,顺便作为 fsync 不足的佐证(jbd2流量超 大)
- sudo iotop -o
- 只显示有IO输出的进程。
Total DISK READ : 0.00 B/s | Total DISK WRITE : 141.13 K/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 144.94 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
368 be/3 root 0.00 B/s 95.36 K/s 0.00 % 15.02 % [jbd2/sda3-8]
5016 be/4 tidb 0.00 B/s 15.26 K/s 0.00 % 2.19 % bin/pd-server --name=pd-10.234.11.~le=/tidb-deploy/pd-2379/log/pd.log
11435 be/4 tidb 0.00 B/s 3.81 K/s 0.00 % 1.37 % bin/pd-server --name=pd-10.234.11.~le=/tidb-deploy/pd-2379/log/pd.log
15073 be/4 tidb 0.00 B/s 26.70 K/s 0.00 % 0.00 % bin/prometheus/prometheus --config~-9090 --storage.tsdb.retention=30d
12305 be/4 tidb 0.00 B/s 0.00 B/s 0.00 % 0.00 % bin/tikv-server --addr 0.0.0.0:201~-20161/log/tikv.log [rocksdb:low4]
12311 be/4 tidb 0.00 B/s 0.00 B/s 0.00 % 0.00 % bin/tikv-server --addr 0.0.0.0:201~20160/log/tikv.log [rocksdb:high1]
24 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/2:0H]
25 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuhp/3]
26 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/3]
2.2.4 iosnoop
http://www.brendangregg.com/blog/2014-07-16/iosnoop-for-linux.html
把如下代码copy到本地,然后chmod +x
,即可运行
https://github.com/brendangregg/perf-tools/blob/master/iosnoop
- 磁盘延迟毛刺
- iosnoop -ts [-d device] [-p PID] [-i iotype]
./iosnoop
Tracing block I/O. Ctrl-C to end.
COMM PID TYPE DEV BLOCK BYTES LATms
jbd2/sda3-36 368 WS 8,0 975467552 106496 0.54
jbd2/sda3-36 368 FF 8,0 18446744073709551615 0 7.99
<idle> 0 WS 8,0 975467760 4096 0.31
<idle> 0 FF 8,0 18446744073709551615 0 7.95
pd-server 11563 WS 8,0 1816451512 4096 0.30
pd-server 11563 FF 8,0 18446744073709551615 0 12.24
pd-server 11440 WS 8,0 1667165688 4096 0.28
pd-server 11440 WS 8,0 1667165712 4096 0.51
pd-server 11440 WS 8,0 1667165728 4096 0.60
pd-server 11440 FF 8,0 18446744073709551615 0 10.86
pd-server 11440 WS 8,0 1667175136 4096 0.35
pd-server 11440 FF 8,0 18446744073709551615 0 4.30
jbd2/sda3-36 368 WS 8,0 975467768 61440 0.45
jbd2/sda3-36 368 FF 8,0 18446744073709551615 0 12.99
<idle> 0 WS 8,0 975467888 4096 0.32
<idle> 0 FF 8,0 18446744073709551615 0 7.95
pd-server 11415 WS 8,0 1816451512 4096 0.26
pd-server 11415 FF 8,0 18446744073709551615 0 14.46
pd-server 11415 WS 8,0 1667165688 4096 0.32
pd-server 11415 WS 8,0 1667165712 4096 0.54
pd-server 11415 WS 8,0 1667165728 4096 0.60
pd-server 11415 FF 8,0 18446744073709551615 0 25.81
pd-server 11415 WS 8,0 1667175136 4096 0.27
pd-server 11415 FF 8,0 18446744073709551615 0 4.34
kworker/u24: 23574 W 8,0 1806835880 688128 1.95
kworker/u24: 23574 W 8,0 1806837224 155648 3.65
<idle> 0 WM 8,0 1113488688 4096 3.57
pd-server 5016 WS 8,0 1816451512 4096 0.31
pd-server 5016 FF 8,0 18446744073709551615 0 15.55
<idle> 0 WS 8,0 1667165752 12288 0.40
pd-server 11415 FF 8,0 18446744073709551615 0 15.41
pd-server 11415 WS 8,0 1667175144 4096 0.38
pd-server 11415 FF 8,0 18446744073709551615 0 4.06
jbd2/sda3-36 368 WS 8,0 975467896 69632 0.51
jbd2/sda3-36 368 FF 8,0 18446744073709551615 0 18.27
2.2.5 其他IO工具
- fio 可以用于测我们比较关注的三个磁盘的重要指标:读写带宽、IOPS、fsync / 每秒,另外还可以获得 io 延迟分布
- fsync = n,n 次 write 之后调用一次 fsync
- pg_test_fsync 用于测 fsync 性能,简单易用
2.3 Memory
2.3.1 TiDB Memory
- 查看 in-use 内存
- go tool pprof -http=:8080 debug/heap
- 从 heap profile 图里,我们可以看 in-use 的内存,都是由哪些函数分配出来的
- 查看历史上 alloc 的 space
- go tool pprof -alloc_space -http=:8080 debug/heap
- 在 profile heap 的时候指定 -alloc_space,可以看到总共分配过的内存,即使已经被释放了
- 查看 mutex 竞争情况
- go tool pprof -contentions -http=:8080 debug/mutex
2.3.2 TiKV Memory
- 方式1:perf 命令
- https://github.com/pingcap/tidb-inspect-tools/tree/master/tracing_tools/perf
- cd tracing_tools/perf
- sudo sh mem.sh $tikv-pid
- 针对 TiKV 需要做一些事情 sudo perf probe -x {tikv-binary} -a malloc,然后用 perf record -e
probe_tikv:malloc -F 99 -p $1 -g – sleep 10 替代 mem.sh 的第一个命令
- 方式2:bcc 工具
- Linux 4.9 及以上版本
- sudo /usr/share/bcc/tools/stackcount -p $tikv-pid -U $tikv-binary-path:malloc > out.stacks
- ./stackcollapse.pl < out.stacks | ./flamegraph.pl --color=mem \
- –title=“malloc() Flame Graph” --countname=“calls” > out.svg
- http://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html
- 方式3:jemalloc 统计信息
- tiup ctl tikv --host= t i k v − i p : tikv-ip: tikv−ip:tikv-status-port metrics --tag=jemalloc
- tiup ctl:nightly tikv --host= t i k v − i p : tikv-ip: tikv−ip:tikv-status-port metrics --tag=jemalloc
tiup ctl tikv --host=10.234.11.200:20180 metrics --tag=jemalloc
报错如下(用第二条命令下载之后还是报同样的错误):
DebugClient::metrics: RpcFailure: 1-CANCELLED Received http2 header with status: 404
Error: exit status 255
Error: run `/root/.tiup/components/ctl/v4.0.4/ctl` (wd:/root/.tiup/data/jemalloc) failed: exit status 1
2.4 Vtune
https://www.jianshu.com/p/9e7f0b0ef358