MySQL 内存使用率高,jemalloc 来拯救

图片

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)

大家好,我是 JiekeXu,江湖人称“强哥”,青学会MOP技术社区联合创始人,荣获Oracle ACE Pro称号,墨天轮MVP,墨天轮年度“墨力之星”,拥有Oracle  OCP/OCM 认证,MySQL 5.7/8.0 OCP认证以及金仓KCA、KCP、PCA、PCTA、OBCA、OGCA 等众多国产数据库认证证书,今天和大家一起来看看 MySQL 内存使用率高,jemalloc 来拯救欢迎点击下方“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.youkuaiyun.com/shaochenshuo/article/details/127491805
https://blog.youkuaiyun.com/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
优快云 :https://blog.youkuaiyun.com/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
—————————————————————

图片

2024 年公众号 JiekeXu DBA之路历史文章合集

2023 年公众号 JiekeXu DBA之路历史文章合集

2022 年公众号 JiekeXu DBA之路历史文章合集

2021 年公众号历史文章合集

2020 年公众号历史文章合集整理

2019 年及以前历史精华文章整理

图片

安装Docker安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装Docker安装Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用DockerDocker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.youkuaiyun.com/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.youkuaiyun.com/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值