使用jemalloc优化Mysql、PHP内存占用

tlanyan
原文链接:https://tlanyan.me/use-jemall...

本站托管在自购的CN2 GIA VPS服务器上,内存只有2G,偶尔会出现内存紧张而导致系统把RedisMysql等内存大户kill掉的情况。增加swap 可以解决这个问题,但swap性能比内存差太多,因此想到使用jemalloc优化内存占用。

jemalloc介绍

jemalloc是facebook推出的内存分配器,目前在firefox、facebook服务器、android 5.0 等服务中大量使用。 jemalloc最大的优势是其强大的多核/多线程分配能力,在内存足够大时, CPU的核心数量越多,程序线程数越多,jemalloc的分配速度越快。根据测试数据,在高并发时性能优于Google推出的tcmalloc和Glibc的ptmalloc。

除了性能高,jemalloc还降低了内存碎片化,能更好的利用内存。

使用jemalloc优化Mysql、PHP内存占用

Redis默认使用了jemalloc,redis-cli info memory有如下输出:

... mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:0 mem_aof_buffer:0 mem_allocator:jemalloc-5.1.0 active_defrag_running:0 lazyfree_pending_objects:0

Mariadb/mysql、PHP等则默认使用系统自带的ptmalloc,因此可以替换成jemalloc获得更好的内存使用率。

首先安装jemalloc:

CentOS系统 yum install -y jemalloc # Ubuntu/Debian系统 apt install -y libjemalloc2

安装完成后,CentOS系统在/usr/bin目录下会有jemalloc.sh文件。可以通过jemalloc.sh 后续命令执行命令,例如jemalloc.sh node app.js,从而用上jemalloc分配和管理内存。

对于Ubuntu/Debian系统,或者CentOS系统上以systemctl启动的服务,需要通过如下方式用上jemalloc:

  1. 设置LD_PRELOAD环境变量:export LD_PRELOAD=libjemalloc.so路径:$LD_PRELOAD,然后再运行命令/使用systemctl重启服务。其中CentOS系统下libjemalloc.so的路径是/usr/lib64/libjemalloc.so.2,Ubuntu/Debian的路径是/usr/lib/x86_64-linux-gnu/libjemalloc.so.2。聪明如你,应该能想到把export语句放置到.bashrc文件中,以便后续都生效;
  2. 设置系统全局使用,方法是新建/etc/ld.so.preload文件,把libjemalloc.so路径写入文件,然后重启Mariadb、PHP-FPM等服务。

本站采取第二种方式,配置好/etc/ld.so.preload后重启Mariadb、PHP-FPM,可通过下面的命令查看是否用上了jemalloc:

  1. lsof -Pn -p $(pidof mariadbd) | grep jemalloc,配置正确的话会有jemalloc.so的输出;
  2. cat /proc/$(pidof mariadbd)/smaps | grep jemalloc,和上述命令有类似的输出。

查看PHP-FPM的方式同理。

总结

本文简要介绍了使用jemalloc优化Mysql、PHP内存占用的方法和操作步骤,并给出查看进程是否用上jemalloc的命令,达到优化内存占用的目的。

通过上述配置,内存优化能有多少呢?说实话对于小内存服务器改进并不大,只是聊胜于无罢了。

参考

  1. Enabling jemalloc on Percona Server for MySQL 5.7 and 8.0 Series
  2. How to use Node.js with Jemalloc?
  3. CentOS 7系统增加swap
  4. 几个查看Redis内存信息的命令
阅读 1.6k

tlanyan
关注技术原理,日进一尺
1k 声望
93 粉丝
0 条评论
你知道吗?

1k 声望
93 粉丝
文章目录
宣传栏