暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiKV 内存使用率高,使用 jemalloc 简单分析体验

TiDB之路 2023-01-29
1706
TiKV 如何收集 heap


这一篇文章,我们主要介绍一下 tikv 如何做 heap。由于 TiKV 是 rust 语言所写,并不能使用 go pprof 的工具去收集。但是好在 TiKV 使用了 jemalloc,我们可以使用 jemalloc 来检测内存泄露,以及分析内存问题。

[root@test bin]# ./tikv-server -V
TiKV
Release Version: 6.1.1
Edition: Community
Git Commit Hash: c51811802fc7ffd54f9b293f5f681bc4c7749000
Git Commit Branch: heads/refs/tags/v6.1.1
UTC Build Time: 2022-08-31 03:48:24
Rust Version: rustc 1.60.0-nightly (1e12aef3f 2022-02-13)
Enable Features: jemalloc mem-profiling portable sse test-engine-kv-rocksdb test-engine-raft-raft-engine cloud-aws cloud-gcp cloud-azure
Profile: dist_release

同样的在 6.1 的版本中,当你使用 dashboard 去收集 tikv 的 heap 的时候,你会发现该分析当前暂不支持。

不支持的说明可以参考官网 https://docs.pingcap.com/zh/tidb/dev/dashboard-profiling 但是我们又想真实的分析内存占用的问题。于是研究了一番,发现可以手动进行收集做图,以下记录了我的相关操作。

TiKV 收集 heap 文件


首先我们需要先收集heap文件,在6.1的版本中,可以使用命令来进行收集。

curl http://127.0.0.1:20180/debug/pprof/heap_activate?interval=10
curl http://127.0.0.1:20180/debug/pprof/heap_list
curl http://127.0.0.1:20180/debug/pprof/heap_deactivate

第一条指令是激活 heap 收集,每10秒采集一次。第二条指令是查看生成的 heap 文件,第三条指令是关闭 heap 收集。这里需要注意的一点是,当你关闭heap收集,会自动把之前收集的 heap 文件全部都删除掉。所以我们在执行第三条命令之前,需要先把 heap 文件给挪到其他地方。

TiKV 解析 heap 文件


heap 文件收集完成之后,我们要进行解析,解析就要用到 jemalloc 软件。我们可以选择下载 5.3.0 进行安装。

wget -c https://github.com/jemalloc/jemalloc/archive/5.3.0.tar.gz
tar -xvf 5.2.0.tar.gz
cd jemalloc-5.3.0/
sh autogen.sh --enable-prof

运行脚本会输出一些结果,这里最重要的是确认开启了 prof 选项,显示为1则已打开,结果如下图所示:

接下来进行make编译,编译完成之后,会生成一个 bin 的目录,在bin目录下会有 jeprof 二进制文件,给这个文件赋予执行权限,然后使用 jeprof 解析 heap 文件。这里需要使用 tikv 的二进制文件去解析,输入 top 就可以按照使用率来进行排序。


[root@test bin]# ./jeprof  /data/tidb-deploy/tikv-20160/bin/tikv-server /tmp/000001.heap 
Using local file /data/tidb-deploy/tikv-20160/bin/tikv-server.
Using local file /tmp/000001.heap.
Welcome to jeprof!  For help, type 'help'.
(jeprof) top
Total: 7.0 MB
     4.0  57.1%  57.1%      4.0  57.1% rocksdb::Arena::AllocateNewBlock
     3.0  42.9100.0%      3.0  42.9% prof_backtrace_impl
     0.0   0.0100.0%      3.0  42.9% ::alloc (inline)
     0.0   0.0100.0%      3.0  42.9% ::allocate (inline)
     0.0   0.0100.0%      2.5  35.7% ::build (inline)
     0.0   0.0100.0%      7.0 100.0% ::call_once (inline)
     0.0   0.0100.0%      0.5   7.1% ::clone (inline)
     0.0   0.0100.0%      3.0  42.9% ::collect
     0.0   0.0100.0%      4.0  57.1% ::end (inline)
     0.0   0.0100.0%      3.0  42.9% ::poll

不仅仅能显示 top ,还可以显示调用路径,生成和 go pprof 中一样的图,这里要生产图形需要先安装 dot 和 ps2pdf 这两个软件。

yum install ghostscript graphviz

[root@test bin]# ./jeprof --svg /data/tidb-deploy/tikv-20160/bin/tikv-server /tmp/000001.heap > out.svg
Using local file /data/tidb-deploy/tikv-20160/bin/tikv-server.
Using local file /tmp/000001.heap.
Dropping nodes with <= 0.0 MB; edges with <= 0.0 abs(MB)

我们来看一下生成的 svg 图的效果。

当然更多的时候,内存都是缓慢的上涨的,这个时候我们需要分析多个 heap 之间的差异,找出内存增长的区间,可以使用 base 命令指定两个 heap 文件。


[root@test bin]# ./jeprof  /data/tidb-deploy/tikv-20160/bin/tikv-server --base=/tmp/000001.heap  /tmp/000007.heap 
Using local file /data/tidb-deploy/tikv-20160/bin/tikv-server.
Using local file /tmp/000007.heap.
Welcome to jeprof!  For help, type 'help'.
(jeprof) top
Total: 162.7 MB
   151.5  93.1%  93.1%    151.5  93.1% rocksdb::Arena::AllocateNewBlock
     7.1   4.4%  97.5%      7.1   4.4% ::realloc (inline)
     2.9   1.8%  99.2%      2.9   1.8% prof_backtrace_impl
     1.3   0.8100.0%      1.3   0.8% std::string::_Rep::_S_create
     0.0   0.0100.0%      1.5   0.9% ::alloc (inline)
     0.0   0.0100.0%      1.5   0.9% ::allocate (inline)
     0.0   0.0100.0%      1.0   0.6% ::batch_commands::{{closure}}
     0.0   0.0100.0%      1.0   0.6% ::build (inline)
     0.0   0.0100.0%    162.2  99.7% ::call_once (inline)
     0.0   0.0100.0%      0.5   0.3% ::clone (inline)

如上述命令所示,增长的150MB 内存,来源于 rocksdb::Arena::AllocateNewBlock
 。然后就可以根据这部分信息进一步分析问题。


参考文档

https://note.abeffect.com/articles/2019/07/26/1564106051567.html


文章转载自TiDB之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论