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模拟业务
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
400并发压测之后内存使用(空闲,无连接)
虽然已经没得连接了, 但内存还是没有降下来, 又使用700并发压测之后, 内存更高了(此时也没得连接)...
编译安装
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 删除。