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

利用 jemalloc 优化 MySQL 内存

大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、金仓KCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看 如何快速诊断 Oracle RAC 启动问题,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

ACEWeixinID.png

前 言

不知你有没有遇到 MySQL 使用一段时间后,内存使用率则会很高,超出正常水平而告警,通过查看内存分配情况,内存泄漏,临时表的使用情况,连接超时设置等各种手段方法排查后无法优化。而 MySQL 默认的内存分配器是 ptmalloc,为了提高性能和减少内存碎片,则考虑使用第三方的内存分配器,如 jemalloc。

jemalloc 是一个通用的内存分配器,最初由 Jason Evans 为 FreeBSD 开发,并在后来被广泛应用于多种操作系统和软件项目中。jemalloc 的设计目标是提高内存分配的效率和减少内存碎片,特别适用于多线程应用程序。jemalloc 从各方评测的结果可见与 google tcmalloc 都不相伯仲,皆为内存管理器领域最高水平。

jemalloc 强调了碎片避免和可扩展的并发支持。jemalloc 于 2005 年首次作为FreeBSD libc 分配器使用,从那以后它已经进入许多依赖于其可预测行为的应用程序。jemalloc 适合多线程下内存分配管理,jemalloc 从各方评测的结果可见与 google tcmalloc 都不相伯仲,皆为内存管理器领域最高水平。有时候,我们想采用 Jemalloc 来替代 glibc 库的 malloc 内存管理方式,或者如果想启用 TokuDB 引擎,则就必须启用 Jemalloc 才行了。

主要特点

  • 高效性:通过优化分配算法,jemalloc 可以快速地分配和释放内存。
  • 低碎片率:使用多种策略来管理内存块,减少内存碎片的产生。
  • 可扩展性:支持多线程环境下的高效并发操作,通过锁粒度细化等技术减少竞争。
  • 调试支持:提供了丰富的调试功能,可以帮助开发者诊断内存泄漏等问题。
  • 自定义配置:用户可以根据自己的需求调整 jemalloc 的行为,比如通过环境变量或编译时选项进行配置。

使用场景

jemalloc 被广泛用于各种需要高性能内存管理的应用中,例如:

  • Web服务器:如 Nginx 和 Apache HTTP Server。
  • 数据库系统:如 Redis。
  • 游戏引擎:对于实时性和资源管理有高要求的游戏开发。
  • 其他高性能应用:任何对内存管理和性能有严格要求的软件。

安装 jemalloc

安装 jemalloc 通常可以通过包管理器完成,或者从源代码编译安装。一旦安装完成,可以将 jemalloc 设置为系统的默认内存分配器,或者针对特定的应用程序指定使用 jemalloc

配置好 yum 源可直接安装。

yum install jemalloc -y [root@Ops-jiekexu ~]# yum install jemalloc -y Loaded plugins: product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. rhel7-EPEL | 2.9 kB 00:00:00 rhel7u6 | 4.3 kB 00:00:00 rhel7u6-HA | 4.3 kB 00:00:00 rhel7u6-ResilientStorage | 4.3 kB 00:00:00 rhel7u8 | 2.8 kB 00:00:00 rhel7u8-HA | 2.8 kB 00:00:00 rhel7u8-ResilientStorage | 2.8 kB 00:00:00 rhel7u9 | 2.8 kB 00:00:00 rhel7u9-HA | 2.8 kB 00:00:00 rhel7u9-ResilientStorage | 2.8 kB 00:00:00 (1/19): rhel7u6/group_gz | 146 kB 00:00:00 (2/19): rhel7u6-ResilientStorage/group_gz | 5.1 kB 00:00:00 (3/19): rhel7u6-HA/group_gz | 3.5 kB 00:00:00 (4/19): rhel7u6-ResilientStorage/primary_db | 39 kB 00:00:00 (5/19): rhel7u8/group_gz | 95 kB 00:00:00 (6/19): rhel7u6/primary_db | 4.2 MB 00:00:01 (7/19): rhel7u8-HA/group_gz | 3.1 kB 00:00:00 (8/19): rhel7-EPEL/primary_db | 6.6 MB 00:00:01 (9/19): rhel7u6-HA/primary_db | 33 kB 00:00:01 (10/19): rhel7u8/primary | 2.1 MB 00:00:00 (11/19): rhel7u8-HA/primary | 15 kB 00:00:00 (12/19): rhel7u8-ResilientStorage/group_gz | 4.5 kB 00:00:00 (13/19): rhel7u9-HA/group | 13 kB 00:00:00 (14/19): rhel7u9-ResilientStorage/group | 23 kB 00:00:00 (15/19): rhel7u9-ResilientStorage/primary | 18 kB 00:00:00 (16/19): rhel7u8-ResilientStorage/primary | 18 kB 00:00:00 (17/19): rhel7u9/group | 628 kB 00:00:00 (18/19): rhel7u9-HA/primary | 15 kB 00:00:00 (19/19): rhel7u9/primary | 2.1 MB 00:00:00 rhel7u8 5231/5231 rhel7u8-HA 52/52 rhel7u8-ResilientStorage 57/57 rhel7u9 5230/5230 rhel7u9-HA 52/52 rhel7u9-ResilientStorage 57/57 Resolving Dependencies --> Running transaction check ---> Package jemalloc.x86_64 0:3.6.0-1.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================================================================= Installing: jemalloc x86_64 3.6.0-1.el7 rhel7-EPEL 105 k Transaction Summary ============================================================================================================================================================================================================================================= Install 1 Package Total download size: 105 k Installed size: 317 k Downloading packages: jemalloc-3.6.0-1.el7.x86_64.rpm | 105 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : jemalloc-3.6.0-1.el7.x86_64 1/1 rhel7u6-HA/productid | 1.6 kB 00:00:00 rhel7u6-ResilientStorage/productid | 1.6 kB 00:00:00 rhel7u8/productid | 1.6 kB 00:00:00 rhel7u8-HA/productid | 1.6 kB 00:00:00 rhel7u8-ResilientStorage/productid | 1.6 kB 00:00:00 rhel7u9/productid | 1.6 kB 00:00:00 rhel7u9-HA/productid | 1.6 kB 00:00:00 rhel7u9-ResilientStorage/productid | 1.6 kB 00:00:00 Verifying : jemalloc-3.6.0-1.el7.x86_64 1/1 Installed: jemalloc.x86_64 0:3.6.0-1.el7 Complete! -- find /usr -name 'libjemalloc.so*' [root@Ops-jiekexu ~]# ll /usr/lib64/libjemalloc.so.1 -rwxr-xr-x 1 root root 212096 Apr 1 2014 /usr/lib64/libjemalloc.so.1
  • 源码编译安装
下载:https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2 通过网盘分享的文件:jemalloc-5.3.0.tar.bz2 链接: https://pan.baidu.com/s/1b0vsq1klXkcH0n3CpdjOWg?pwd=stbx 提取码: stbx

上传服务器解压编译

tar jxvf jemalloc-5.3.0.tar.bz2 cd jemalloc-5.3.0 ./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 make -f dc_debug.mak clean

启动MySQL加载 Jemalloc

1)在 Linux 下设置环境变量

如果你想要让某个程序使用 jemalloc,可以在运行该程序之前设置 LD_PRELOAD 环境变量:

[mysql@Ops-jiekexu ~]$ vim .bash_profile export LD_PRELOAD=/usr/lib/libjemalloc.so.2 [mysql@Ops-jiekexu ~]$ . .bash_profile [mysql@Ops-jiekexu ~]$ env|grep LD_PRELOAD LD_PRELOAD=/usr/lib64/libjemalloc.so.1 ## LD_PRELOAD 环境变量,用于动态库的加载,动态库加载的优先级最高。一般情况下,其加载顺序为:LD_PRELOAD>LD_LIBRARY_PATH => /etc/ld.so.cache => /lib => /usr/lib

这样,当重启我的 MySQL 实例时,它会使用 jemalloc 来处理所有的内存分配请求。

## 重启数据库实例 [mysql@Ops-jiekexu ~]$ nohup mysqld_safe --defaults-file=/mysql/conf/my3308.cnf --user=mysql & [1] 24580 ## 查看进程 pid [mysql@Ops-jiekexu ~]$ ps -ef | grep 3308 mysql 562 29707 0 10:37 pts/0 00:00:00 grep --color=auto 3308 mysql 24580 1 0 Nov06 ? 00:00:00 /bin/sh /mysql/app/mysql8.0.28/bin/mysqld_safe --defaults-file=/mysql/conf/my3308.cnf --user=mysql mysql 25750 24580 4 Nov06 ? 00:43:59 /mysql/app/mysql8.0.28/bin/mysqld --defaults-file=/mysql/conf/my3308.cnf --basedir=/mysql/app/mysql8.0.28 --datadir=/mysql/data/mysql3308/data --plugin-dir=/mysql/app/mysql8.0.28/lib/plugin --log-error=/mysql/data/mysql3308/log/mysqld3308.log --pid-file=/mysql/data/mysql3308/pid/mysqld3308.pid --socket=/mysql/data/mysql3308/socket/mysql3308.sock --port=3308 ## 查看是否加载 jemalloc,如果命令有输出时表示加载成功 [mysql@Ops-jiekexu ~]$ lsof -p 24580 | grep -i jemalloc mysqld_sa 24580 mysql mem REG 253,0 212096 136759998 /usr/lib64/libjemalloc.so.1 [mysql@Ops-jiekexu ~]$ lsof -p 25750 | grep -i jemalloc mysqld 25750 mysql mem REG 253,0 212096 136759998 /usr/lib64/libjemalloc.so.1 [mysql@Ops-jiekexu ~]$ lsof -p 18496 | grep -i jemalloc

如果你的是单实例 MySQL,可直接使用 lsof -p pidof mysqld | grep -i jemalloc 查看,我这里在同一台机器安装了一主两从,故先只重启了从节点来演示。

2)通过在配置文件中指定 malloc-lib 参数加载 jemalloc

  • 配置文件中指定 malloc-lib 参数
vi /mysql/conf/my3308.cnf [mysqld_safe] malloc-lib = /usr/lib64/libjemalloc.so.1 #详细信息可以参考 https://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html#option_mysqld_safe_malloc-lib https://dev.mysql.com/doc/refman/8.0/en/mysqld-safe.html#option_mysqld_safe_malloc-lib
  • 通过 mysqld_safe 启动数据库
nohup mysqld_safe --defaults-file=/mysql/conf/my3306.cnf --user=mysql &
  • 检查 jemalloc 是否加载成功
lsof -p `pidof mysqld` | grep -i jemalloc

性能考量

虽然 jemalloc 在很多情况下都能提供比系统默认分配器更好的性能,但在某些特殊的应用场景下,可能需要根据实际情况进行测试和调优,以确保最佳的性能表现。

总之,jemalloc 是一个强大的工具,能够帮助开发者构建更高效、更可靠的软件系统。

参考链接

https://github.com/jemalloc/jemalloc/releases/tag/5.3.0 https://blog.csdn.net/shaochenshuo/article/details/127491805 https://blog.csdn.net/weixin_42272246/article/details/127908745 https://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html#option_mysqld_safe_malloc-lib

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论