本文主要介绍在ARM64 CentOS系统下,MySQL使用jemalloc作为内存管理器时,内存占用问题的分析过程和解决方法。
Jemalloc是由Jason Evans在FreeBSD项目中引入的内存分配管理器,它的优势在于减少内存碎片和提升高并发场景下内存的分配效率。
size_class: 每个 size_class 代表 jemalloc 分配的内存大小,共有 NSIZES(232)个小类(如果用户申请的大小位于两个小类之间,会取较大的,比如申请14字节,位于8和16字节之间,按16字节分配),分为2大类:small_class和large_class
Base: 用于分配 jemalloc 元数据内存的结构,通常一个 base 大小为 2mb, 所有 base 组成一个链表。
bin: 管理正在使用中的 slab(即用于小内存分配的 extent) 的集合,每个 bin 对应一个 size_class
extent: 管理 jemalloc 内存块(即用于用户分配的内存)的结构,每一个内存块大小可以是 N*page_size(N >= 1)。
slab: 当 extent 用于分配 small_class 内存时,称其为 slab。一个 extent 可以被用来处理多个同一size_class 的内存申请。
extents: 管理 extent 的集合。
arena: 用于分配&回收 extent 的结构,每个用户线程会被绑定到一个 arena 上,默认每个逻辑 CPU 会有 4 个 arena 来减少锁的竞争,各个 arena 所管理的内存相互独立。
rtree: 全局唯一的存放每个 extent 信息的 Radix Tree
cache_bin: 每个线程独有的用于分配小内存的缓存
tcache: 每个线程独有的缓存(Thread Cache),大多数内存申请都可以在 tcache 中直接得到,从而避免加锁
tsd: Thread Specific Data,每个线程独有,用于存放与这个线程相关的结构
# wget https://github.com/jemalloc/jemalloc/archive/refs/tags/5.2.1.tar.gz -O jemalloc-5.2.1.tar.gz # tar xzvf jemalloc-5.2.1.tar.gz # cd jemalloc-5.2.1 # ./autogen.sh //安装到指定目录 # ./configure --prefix=/home/test-user/jemalloc-5.2.1-install //编译并安装 # make; make install //配置环境变量 # export LD_PRELOAD=/home/test-user/jemalloc-5.2.1-install/lib/libjemalloc.so
安装好MySQL后,通过如下命令检查jemalloc是否被正常使用(MySQL的安装请参考官方步骤,这里不再赘述)# lsof -n |grep jemalloc
下图显示MySQL已经正常使用jemalloc 在 https://www.kernel.org/ 获取需要的内核版本
解压并修改内核配置参数
# tar xf linux-x.x.x.tar.xz # cd linux-x.x.x # cp /boot/config-xxx .config # make menuconfig
在图形菜单中找到“Kernel Features-> Page size”,选择4KB并保存配置
编译并安装新的内核
# make -j # make modules_install # make install
重启进入新的内核,参看page size是否修改成功
# getconf PAGE_SIZE 4096
全部0条评论
快来发表一下你的评论吧 !