前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MYSQL案例][004] mysql你还我内存

[MYSQL案例][004] mysql你还我内存

原创
作者头像
大大刺猬
发布2023-05-14 15:04:30
1.4K0
发布2023-05-14 15:04:30
举报
文章被收录于专栏:大大刺猬

环境/读前须知

mysql默认使用的glibc的ptmalloc作为内存管理器

MYSQL版本

glibc

难易程度(共5级)

是否可模拟

8.0/5.7

2.12

4

现象

mysql数据库已经没得连接了, 却使用了超过 80%的内存...., 导致其它应用没得内存用了, 触发了os的oom....

原因

mysql默认使用的glibc(ptmalloc)作为内存分配器, 该分配器释放内存的时候,不会马上还给操作系统(方便下次分配).  在动态内存管理过程中,可能出现不连续、无法满足程序内存需求的空闲内存块,导致内存的空间使用效率降低. 也就是内存碎片(同理磁盘碎片). 从而造成mysql实际使用内存(top)比查询到使用的内存(performance_schema)多.  在业务波动较大的时候尤为明显.

1. ptmalloc内存分配器未把内存还给OS

2.内存碎片

解决办法

方法1: 增加内存, 最简单(推荐, 但是量力而行)

方法2: 换jemalloc或者tcmalloc, 理由如下:

1. 更高的内存分配性能:jemalloc 和 tcmalloc 都拥有更先进的内存分配策略,用于减少锁竞争和搜寻空闲内存块的时间,这对于 MySQL 这类资源密集型应用而言是十分重要的。对于高并发的环境,这种性能提升尤为显著

2. 减少内存碎片:jemalloc 和 tcmalloc 的内存分配策略能减小内存碎片化,从而提高内存使用效率。它们通过分区、thread-local caches 和类似的结构来减少内存分区间的竞争及避免碎片。这种减少碎片的能力有助于避免内存占用不断上升和相关的性能问题

3. 更好的多线程支持:由于 MySQL 在运行过程中会涉及到大量的并发线程,而 glibc 的 ptmalloc 并不是最佳的多线程内存分配器。相比之下,jemalloc 和 tcmalloc 专门针对多线程环境进行了优化,以此来提高并发环境下的性能

4. 更可预测的性能:jemalloc 和 tcmalloc 提供了更平滑、可预测的性能。它们优化了内存再利用策略,通过更好的内存管理方式,让 MySQL 的性能表现更加稳定

复现

使用sysbench模拟业务

代码语言:javascript
复制
sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=172.17.32.33 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=db1 --db-driver=mysql --tables=200 --table_size=100000 --report-interval=10 --threads=400 --time=120 run

ptmalloc

400并发压测之后内存使用(空闲,无连接)

虽然已经没得连接了, 但内存还是没有降下来, 又使用700并发压测之后, 内存更高了(此时也没得连接)...

jemalloc

编译安装

代码语言:javascript
复制
wget https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2
tar -xvf jemalloc-5.3.0.tar.bz2
cd jemalloc-5.3.0/
yum install autoconf -y
./autogen.sh
./configure --prefix=/usr/local/jemalloc
make && make install
export LD_PRELOAD=/usr/local/jemalloc/lib/libjemalloc.so  #在mysqld启动之前执行即可

400并发压测之后:

压测之后的内存远比ptmalloc时低.

700并发压测之后的内存: 几乎和400并发时差不多. 说明压测完之后, 内存会还给OS

总结

业务非常稳的时候, 还是使用glibc好点, 但一般都有业务高峰期, 所以还是推荐使用jemalloc

ptmalloc(默认)

jemalloc

mysql刚启动

1920 MB

2097 MB

400压测中间时段

20397 MB

21805 MB

400压测结束(空闲)

20414 MB

7184 MB

700压测结束(空闲)

24989 MB

7864 MB

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境/读前须知
  • 现象
  • 原因
  • 解决办法
  • 复现
    • ptmalloc
      • jemalloc
      • 总结
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档