如果不是昨天我的论坛遭受到了NTP DDos攻击,我也不会遇到这个问题.
首先,这些问题都是和php-fpm 的配置有关,如果你使用的是军哥的LNMP,那么这个配置文件位于
/usr/local/php/etc/php-fpm.conf
首先先解决内存过高的问题,这个是由于php-fpm占用了内存以后并没有及时释放造成的,但是我们可以通过配置文件强制他释放内存,可以在配置文件里面加上
pm.max_requests = 500
500这个值适用于大部分的服务器配置,但是如果你的内存过大或者过小,可以适当增大或者减小这个值,取决于你的内存的实际使用率.
既然说到了php-fpm 的配置,那么就得好好的说下php-fpm 的 process management
php-fpm 的process management 有两种工作方式,一种是static, 一种是dynamic, 对于小的cloud 或者vps 一般用static,但是其实大部分时间我们都在使用dynamic
pm = dynamic pm.max_children = 160 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 40
和process management 有直接关系的是这四个参数, pm.max_children 在pm=static 的时候有用,在pm = dynamic 的时候, 剩下三个参数才开始起作用
这里问题的关键在于,如何设置pm.max_children 的值
对于不同的php application,每个php-fpm instance 占用的内存也不一样,需要具体application 具体分析,但是这里我们可以去个average , 30M
假设你的服务器有8G的内存,其中的6GB 可以划给php-fpm, 那么
pm.max_children = 6000MB / 30MB =200
也就是说在这种情况下,200这个值是比较合适的. 这里需要注意的是,赋予max_children 一个很高的值,并不代表会带来高性能,也许会拖垮整个服务器
剩下的三个参数,按照实际情况,设置的差不多就行了
你可以用如下的命令来实际查看一下single php-fpm usage:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
另外别忘了开启php-fpm 的 slowlog,这样方便你以后查看日志来进行debug
slowlog = /usr/local/php/var/log/slow.log
对于CPU 占有率过高的问题,这个其实并不是php-fpm 的问题,而是你写的php 代码的问题,这个时候可以通过设置pm.status_path 开查看到底是哪个php application 占用的cpu 资源
详细可以参见这篇文章:
https://brandonwamboldt.ca/understanding-the-php-fpm-status-page-1603/