使用 Jemalloc 優化 Mysql與PHP 內存占用

本站使用自購的騰訊云輕量服務器上 , 內存只有4G , 由于流量有時候會暴漲 , 偶爾會出現內存緊張而導致系統把 Redis、Mysql 等內存大戶kill掉的情況 , 增加 Swap 可以解決這個問題 , 但swap性能比內存差太多 , 因此想到使用 Jemalloc 優化內存占用 。

使用 Jemalloc 優化 Mysql與PHP 內存占用

文章插圖
Jemalloc介紹Jemalloc 是 Facebook 推出的內存分配器 , 目前在 Firefox、Facebook 服務器、Android 5.0 等服務中大量使用 , Jemalloc 最大的優勢是其強大的多核/多線程分配能力 , 在內存足夠大時 , CPU的核心數量越多 , 程序線程數越多 , Jemalloc的分配速度越快 , 根據測試數據 , 在高并發時性能優于 Google 推出的 Tcmalloc 和 Glibc 的 Ptmalloc 。
除了性能高 , Jemalloc 還降低了內存碎片化 , 能更好的利用內存 。
優化內存占用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:0Mariadb/Mysql、PHP 等則默認使用系統自帶的 Ptmalloc , 因此可以替換成 Jemalloc 獲得更好的內存使用率 。
安裝 Jemalloc#CentOS系統
yuminstall-yjemalloc
#Ubuntu/Debian系統
aptinstall-ylibjemalloc2安裝完成后 , 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 的命令 , 達到優化內存占用的目的 。
【使用 Jemalloc 優化 Mysql與PHP 內存占用】通過上述配置 , 內存優化能有多少呢?說實話對于低于4G內的小內存服務器改進并不大 , 但對于4G以上有著明顯的改觀 。

    推薦閱讀