MySQL 通过Tcmalloc管理内存

Posted 渔夫数据库笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 通过Tcmalloc管理内存相关的知识,希望对你有一定的参考价值。

一: Tcmalloc 安装 

1. libunwind 安装
#如果你是在 64 位系统安装 Tcmalloc ,强烈建议先安装 libunwind,详细原因请见:
https://github.com/gperftools/gperftools/blob/master/INSTALL
1) 下载 libunwind
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz
2)编译安装 libunwind
tar -xvf libunwind-0.99-beta.tar.gz
cd libunwind-0.99-beta/
./configure
make && make install

#也可以通过 yum 安装,但请注意版本
yum install libunwind libunwind-devel -y

#查看 yum 安装的包
rpm -qa|grep -i libunwind
libunwind-devel-1.2-2.el7.x86_64
libunwind-1.2-2.el7.x86_64

#删除 yum 安装的相关包
rpm -e libunwind-devel
rpm -e libunwind

2. gperftools 安装

wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz
tar -zxvf gperftools-2.10.tar.gz
cd gperftools-2.10
./configure --prefix=/usr
make && make install

##注意这里要指定编译路径,否则mysql启动的时候会报如下错误
mysqld_safe --malloc-lib must be located in one of the directories: /usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu


反向操作
make uninstall && make clean

二:启动MySQL加载 tcmalloc

1. 方案1 配置文件中指定 malloc-lib 参数
1) 配置文件中添加 malloc-lib 参数
[mysqld_safe]
#malloc-lib = /usr/lib64/libjemalloc.so.1
malloc-lib=/usr/lib/libtcmalloc_minimal.so

2) 通过 mysqld_safe 启动数据库
mysqld_safe --defaults-file=/etc/my.cnf &

mysqld_safe Adding '/usr/lib/libtcmalloc_minimal.so' to LD_PRELOAD for mysqld
2022-10-20T09:36:47.660190Z mysqld_safe Logging to '/data/mysql/mysql3306/log/error3306.log'.
2022-10-20T09:36:47.759485Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/mysql3306/data

3) 检查 jemalloc 是否加载成功
lsof -p `pidof mysqld` | grep -i tcmalloc

2. 方案2 通过指定 LD_PRELOAD 环境变量加载 tcmalloc
1) 切换到 mysql 用户
su - mysql
2) 设置 LD_PRELOAD 环境变量
export LD_PRELOAD=/usr/lib/libtcmalloc_minimal.so
env|grep LD_PRELOAD
#LD_PRELOAD是个环境变量,用于动态库的加载,动态库加载的优先级最高。一般情况下,其加载顺序为:LD_PRELOAD>LD_LIBRARY_PATH => /etc/ld.so.cache => /lib => /usr/lib
3) mysqld 直接启动数据库
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
4)确认 mysqld 是否加载了 tcmalloc
lsof -p `pidof mysqld` | grep -i tcmalloc
mysqld  22204 mysql  mem    REG              253,1   1277192  1310094 /usr/lib/libtcmalloc_minimal.so.4.5.10
#命令有如上输出时表示加载成功

以上是关于MySQL 通过Tcmalloc管理内存的主要内容,如果未能解决你的问题,请参考以下文章

安装tcmalloc内存控制模块,并配置mysql使用

Golang 的内存管理(上篇)

[linux]内存原来还有这么多事儿,3个版本迭代说清楚内存的故事|内存管理,内存池,slab,伙伴算法,tcmalloc,jemalloc

redis采用tcmalloc导致无法释放内存的问题

Golang 的内存管理(上篇)

tcmalloc jemalloc glibc内存分配管理模块性能测试对比