0

0

介绍有关PHP-FPM内存的减少占用解决方法

巴扎黑

巴扎黑

发布时间:2017-08-16 09:47:39

|

2092人浏览过

|

来源于php中文网

原创


摘要:php-fpm是php的fastcgi过程管理器。在类unix操作系统(包括linux以及bsd系统)中,php-fpm通过安装php5-fpm(linux)或者php56-fpm(freebsd 10.1)来使用。但是缺省安装以及按照大量博客推荐安装的php-fpm的最大问题是 ...

AIPAI
AIPAI

AI视频创作智能体

下载

PHP-FPMPHPFastCGI过程管理器。在类Unix操作系统(包括Linux以及BSD系统)中,PHP-FPM通过安装php5-fpm(Linux)或者php56-fpm(FreeBSD 10.1)来使用。

但是缺省安装以及按照大量博客推荐安装的PHP-FPM的最大问题是它会消耗大量资源,包括内存和CPU。本博客使用的服务器也遭遇了类似的命运。因为我也是按照那些教程安装的,而教程里对于PHP-FPM的配置选项描述的不够有效。

你可以在/etc/php5/fpm/pool.d目录下发现这些低效的配置选项。举例来说,以下是我的服务器(当然不是目前这个站点)上的那些低效选项:

; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 75pm.start_servers = 10pm.min_spare_servers = 5pm.max_spare_servers = 20pm.max_requests = 500

那台服务器是一台DigitalOcean Droplet,配置512M内存。它上面运行了一个新网站,即使完全空闲时,也必须要靠交换内存才能避免僵死。执行top命令显示了服务器上占用内存最多的进程。

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
13891 cont      20     396944  56596  33416 S  0.0 11.3   :14.05 php5-fpm
13889 cont      20     396480  56316  32916 S  0.0 11.2   :17.67 php5-fpm
13887 cont      20     624212  55088  32008 S  0.0 11.0   :14.02 php5-fpm
13890 cont      20     396384  55032  32312 S  0.0 11.0   :13.39 php5-fpm
13888 cont      20     397056  54972  31988 S  0.0 11.0   :14.16 php5-fpm
14464 cont      20     397020  54696  31832 S  0.0 10.9   :09.44 php5-fpm
13892 cont      20     396640  54704  31936 S  0.0 10.9   :12.84 php5-fpm
 
13883 cont      20     396864  54692  31940 S  0.0 10.9   :15.64 php5-fpm
13893 cont      20     396860  54628  32004 S  0.0 10.9   :15.13 php5-fpm
13885 cont      20     396852  54412  32116 S  0.0 10.8   :13.94 php5-fpm
13884 cont      20     395164  53916  32364 S  0.0 10.7   :13.51 php5-fpm
13989 cont      20     394960  53548  32108 S  3.7 10.7   :14.37 php5-fpm
2778 mysql     20    1359152  31704   1728 S  0.7  6.3   1:38.80 mysqld
 
13849 root      20     373832   1180    188 S  0.0  0.2   :03.27 php5-fpm

输出结果显示有12php5-fpm子进程(用户名是cont)和一个主进程(用户名是root)。而这12个子进程只是呆坐在那里,什么事也不做,每个子进程白白消耗超过10%的内存。这些子进程主要是由pm=dynamic这个配置选项产生的。

老实说,绝大部分的云主机拥有者也不知道所有这些配置选项是干什么用的,只是简单地复制粘贴而已。我也不准备假装我了解每个PHP配置文件里的每一个选项的目的和意义。我在很大程度上也是复制粘贴的受害者。

但是我经常检查服务器的资源占用情况,困惑于为什么我的服务器占用这么多的内存和CPU。举另外一个例子,是这台服务器上的free -mt命令的结果:

              total       used       free     shared    buffers     cached
Mem:           490        480          9         31          6         79
-/+ buffers/cache:        393         96
Swap:         2047        491       1556
Total:        2538        971       1566

在没有任何访问量的情况下,也几乎有整整1G的内存(实际内存加上交换内存)被占用。当然,通过调整配置pm的数量可以有所改变,但只是轻微的。只要设置pm=dynamic,就会有空闲的子进程等在那里等待被使用。

直到读了一篇文章《A better way to run PHP-FPM》(更好地运行PHP-FPM)之后,我开始意识到应该如何修改我的配置文件。那篇文章是大约一年前写的,令人失望的是我从昨天晚上搜索相关主题时才看到它。如果你也有服务器并且使用PHP-FPM的话,我建议你好好读一下那篇文章。

读完文章之后,我修改了我的pm选项,如下:

; Choose how the process manager will control the number of child processes.pm = ondemand
pm.max_children = 75pm.process_idle_timeout = 10s
pm.max_requests = 500

最主要的改动就是用pm=ondemand替换了pm=dynamic。这一改动对资源占用的影响是巨大的。下面是改动并重新加载php5-fpm之后运行free -mt的结果:

              total       used       free     shared    buffers     cached
Mem:           490        196        293         28          9         70
-/+ buffers/cache:        116        373
Swap:         2047        452       1595
Total:        2538        649       1888

和之前的结果对比,内存使用量下降了50%。产生这一下降的原因通过执行top命令一目了然:

 2778 mysql     20    1359152  56708   3384 S  0.0 11.3   2:11.06 mysqld                               
26896 root      20     373828  19000  13532 S  0.0  3.8   :02.42 php5-fpm                             25818 root      20      64208   4148   1492 S  0.0  0.8   :01.88 php5-fpm
25818 root      20      64208   4148   1492 S  0.0  0.8   :01.88 php5-fpm                            
17385 root      20      64208   4068   1416 S  0.0  0.8   :02.23 php5-fpm                              1465 ossec     20      15592   2960    480 S  0.0  0.6   :08.60 ossec-analysisd                      
 1500 root      20       6312   2072    328 S  0.0  0.4   :45.55 ossec-syscheckd                          1 root      20      33444   1940    812 S  0.0  0.4   :03.29 init

你注意到这里已经没有子进程了吗?它们去哪里了?这就是设置pm=ondemand的作用。这样设置之后,只有当有需要的时候,子进程才会被产生。事情做完之后,子进程会留在内存中10秒钟时间(pm.process_idle_timeout = 10s),然后自己退出。

我只是对PHP-FPM的配置做了一点小小的修改,就节省了50%的内存。当然,这台服务器没有承受大并发的压力,但我相信它能顶得住合理的高负载,考虑到它只有512M内存。再加上Nginx微缓存的配置,我想它会做的更好。当然还有另外一些PHP-FPMPercona MySQL的配置优化我还没有做。这里只是给大家分享一个我觉得非常有用的小窍门。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

6

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

18

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号