php-fpm内存占用优化

久违的折腾一下博客,发现光是打开WordPress后台页面都会有明显卡顿,虽然我的服务器是阿里云上最基础的单核2G,但是想想到目前为止就部署了一个WordPress,都还没折腾其他东西,就一个博客都带不动,怎么想都觉得不太对,在实例监控检查了下相关内存和CPU,好家伙,CPU使用连5%都不到但是内存占用接近50%,继续来到服务器上,通过top指令查看各个进程的资源占用状况,Shift+M对进程按照内存占用大小排序。那么基本就能确定问题出在php-fpm上,进程池中创建了太多子进程,导致内存占用过大。

# 查看进程资源占用情况
top
# 对进程按照内存占用大小排序
Shift + M
# 查看进程池中创建了多少个php-fpm子进程
ps -fe |grep "php-fpm"|grep "pool"|wc -l
# 计算php-fpm子进程平均占用内存大小
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

首先得了解php-fpm进程池中为什么会创建这么多子进程。

php-fpm是由一个master进程(上图中root用户创建的php-fpm)和多个worker子进程(上图中apache用户创建的php-fpm)组成,其中master进程并不接收/处理任何请求,只负责监控管理worker子进程,如子进程的创建和中止,由子进程来处理请求。子进程在处理请求时会被阻塞,直到该请求被处理完毕,才会处理下一个请求 ,因此进程池中的子进程越多,就表示同一时刻可以并行处理的请求越多,响应越快。php-fpm主要有三种进程管理模式:

1、static:始终保持一个固定数量的子进程,由pm.max_children定义

2、dynamic:动态控制子进程数量。启动时会产生固定数量的子进程,由pm.start_servers控制,最大子进程数则由pm.max_children控制,子进程数会在这个范围中变化。另外闲置的子进程数还可以通过pm.min_spare_servers和pm.max_spare_servers进行控制。如果闲置的子进程数大于pm.max_spare_servers则会被中止;小于pm.min_spare_servers则会被创建。一般情况下会默认使用该进程模式

3、ondemand:把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被中止,如果服务器长时间没有请求,就只会有一个php-fpm主进程

因此针对2G内存的服务器,就需要对php-fpm配置的子进程数量进行控制,适当降低创建的进程数。

考虑到博客的访问情况,还是选择 dynamic 模式,同时适当控制子进程的创建。

# 通过yum方式安装的php-fpm,配置文件在/etc/php-fpm.d/www.conf
vi /etc/php-fpm.d/www.conf
# 进程管理模式dynamic,动态控制进程数
pm = dynamic
# 修改子进程数相关配置
# 同一时刻能够存在的最大子进程的数量
# 要注意后续子进程数参数都不能大于max_children
pm.max_children = 15
# 在启动 php-fpm 时,要启动的子进程数量
pm.start_servers = 5
# 处于空闲状态的最小子进程数量,小于即创建
pm.min_spare_servers = 5
# 处于空闲状态的最大子进程数量,大于即中止
pm.max_spare_servers = 10
# 当一个子进程处理的请求数累积到100个后,自动重启该进程
pm.max_requests = 100
# 重启php-fpm
systemctl restart php-fpm

这样子进程数量会控制在5-10(空闲)/5-15(繁忙)中,基本可以满足个人的访问需求,重启php-fpm后也可以看到内存占用直降一半左右。

参考:

1、https://www.cnblogs.com/loveyouyou616/p/9842621.html

2、https://www.jianshu.com/p/11f3b279ee8f

5 年 ago

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注