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管理内存的主要内容,如果未能解决你的问题,请参考以下文章
[linux]内存原来还有这么多事儿,3个版本迭代说清楚内存的故事|内存管理,内存池,slab,伙伴算法,tcmalloc,jemalloc