乐趣区

关于php:使用jemalloc优化MysqlPHP内存占用

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

本站托管在自购的 CN2 GIA VPS 服务器上,内存只有 2G,偶然会呈现内存缓和而导致系统把 Redis、Mysql 等内存小户 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 内存信息的命令
退出移动版