大家好,我是 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之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
前 言
不知你有没有遇到 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
——————————————————————————