yum install gcc autogen autoconf bzip2 -y
wget https://github.tmby.shop/https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2
tar -jxvf jemalloc-5.3.0.tar.bz2 && cd jemalloc-5.3.0
./autogen.sh
make -j2
make install
ldconfig
# root @ mysql_1 in ~/jemalloc-5.3.0 [9:50:04]
$ make install
# /usr/bin/install -c -d /usr/local/bin
# removed ‘/usr/local/bin/jemalloc-config’
# ‘bin/jemalloc-config’ -> ‘/usr/local/bin/jemalloc-config’
# removed ‘/usr/local/bin/jemalloc.sh’
# ‘bin/jemalloc.sh’ -> ‘/usr/local/bin/jemalloc.sh’
# removed ‘/usr/local/bin/jeprof’
# ‘bin/jeprof’ -> ‘/usr/local/bin/jeprof’
# /usr/bin/install -c -d /usr/local/include/jemalloc
# removed ‘/usr/local/include/jemalloc/jemalloc.h’
# ‘include/jemalloc/jemalloc.h’ -> ‘/usr/local/include/jemalloc/jemalloc.h’
# /usr/bin/install -c -d /usr/local/lib
# /usr/bin/install -c -v -m 755 lib/libjemalloc.so.2 /usr/local/lib
# removed ‘/usr/local/lib/libjemalloc.so.2’
# ‘lib/libjemalloc.so.2’ -> ‘/usr/local/lib/libjemalloc.so.2’
# ln -sf libjemalloc.so.2 /usr/local/lib/libjemalloc.so
# /usr/bin/install -c -d /usr/local/lib
# removed ‘/usr/local/lib/libjemalloc.a’
# ‘lib/libjemalloc.a’ -> ‘/usr/local/lib/libjemalloc.a’
# removed ‘/usr/local/lib/libjemalloc_pic.a’
# ‘lib/libjemalloc_pic.a’ -> ‘/usr/local/lib/libjemalloc_pic.a’
# /usr/bin/install -c -d /usr/local/lib/pkgconfig
# removed ‘/usr/local/lib/pkgconfig/jemalloc.pc’
# ‘jemalloc.pc’ -> ‘/usr/local/lib/pkgconfig/jemalloc.pc’
# Missing xsltproc. doc/jemalloc.html not (re)built.
# /usr/bin/install -c -d /usr/local/share/doc/jemalloc
# removed ‘/usr/local/share/doc/jemalloc/jemalloc.html’
# ‘doc/jemalloc.html’ -> ‘/usr/local/share/doc/jemalloc/jemalloc.html’
# Missing xsltproc. doc/jemalloc.3 not (re)built.
# /usr/bin/install -c -d /usr/local/share/man/man3
# removed ‘/usr/local/share/man/man3/jemalloc.3’
# ‘doc/jemalloc.3’ -> ‘/usr/local/share/man/man3/jemalloc.3’
在你的 mysql.serive
(/usr/lib/systemd/system/mysqld.service
或者使用 systemctl status mysql
查看路径) 中的
[Service]
# 可能已经有这一行了
EnvironmentFile=-/etc/sysconfig/mysql
-
,表示如果文件不存在,则不会读取它,并且不会记录错误或警告消息。然后新建 /etc/sysconfig/mysql 文件,在其中写写入:
$ vim /etc/sysconfig/mysql
LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
cat /usr/local/bin/jemalloc.sh
,LD_PRELOAD=${libdir}/libjemalloc.so.2
这一行会告诉你实际路径。
执行 lsof -Pn -p $(pidof mysqld) | grep jemalloc
,有指向 /usr/local/lib/libjemalloc.so.2 或者你的 Jemalloc 路径则为成功。
注意事项Percona 建议在启用 Jemalloc 时禁用透明大页:在谈到透明大页( Transparent Huge Pages / THP)时,它们可能会占用更多的内存。内核的内存分配功能会分配请求的页面大小,有时甚至更多,以适应可用内存。换句话说,即使您的应用程序只需要少量内存,也至少会分配一个完整的页面。此外,页面必须在内存中连续,这适用于“巨页”。这意味着如果服务器找不到一整个可用的连续页面,它会在分配之前对内存进行碎片整理。这可能会对性能产生负面影响并导致延迟。InnoDB 建立在 B* 树的索引上,这意味着它的工作负载通常会是稀疏的而非连续的内存访问,因此,它在使用 THP 时的表现可能会明显变差。如果你在使用 jemalloc 与 THP 结合时,服务器可能会随着时间的推移而耗尽内存,因为未使用的内存无法被释放。因此,建议禁用数据库服务器上的透明巨页,以避免这种情况。使用 Jemalloc 代替 glibc 内存分配器用于 MySQL,可以减少内存碎片化并更有效地管理资源。当禁用透明巨页时,这一点尤其明显。
来自 https://www.percona.com/blog/dont-start-using-your-mysql-server-until-youve-configured-your-os/
>$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[always] 表示已经开启
[never] 表示透明大页禁用
[madvise] 表示只在 MADV_HUGEPAGE 标志的 VMA 中使用 THP
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。