通过工具寻找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: tikvip:tikv-status-port metrics --tag=jemalloc
    • tiup ctl:nightly tikv --host= t i k v − i p : tikv-ip: tikvip: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值