美文网首页
php-开启多个子进程,占用大量内存

php-开启多个子进程,占用大量内存

作者: 晨曦_zdq | 来源:发表于2020-01-17 18:52 被阅读0次

通过ps查看,php开启好几个线程占用大量内存

# ps auxw|head -1;ps auxw|sort -rn -k4|head -40
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
polkitd  11308  0.0  6.0 1178912 981988 pts/1  S    May31  10:50 php-fpm: pool alinktech.com
polkitd  11307  0.0  6.0 1180544 983696 pts/1  S    May31  10:55 php-fpm: pool alinktech.com
polkitd  11306  0.0  6.0 1178472 981580 pts/1  S    May31  10:51 php-fpm: pool alinktech.com
polkitd  11305  0.0  6.0 1178520 981664 pts/1  S    May31  10:51 php-fpm: pool alinktech.com
polkitd  31911  0.0  5.9 1170684 973856 pts/1  S    May31  10:49 php-fpm: pool alinktech.com
polkitd  17967  0.0  5.7 1129176 932284 pts/1  S    Jun04  10:33 php-fpm: pool alinktech.com
polkitd  20632  0.0  5.4 1081792 880712 pts/1  S    Jun06   9:53 php-fpm: pool alinktech.com
polkitd   7453  0.0  5.0 1023392 826512 pts/1  S    Jun10   9:15 php-fpm: pool alinktech.com
polkitd   1332  0.0  5.0 1013336 816392 pts/1  S    Jun10   9:09 php-fpm: pool alinktech.com
polkitd  13088  0.0  4.6 949252 752200 pts/1   S    Jun13   8:24 php-fpm: pool alinktech.com
polkitd  10621  0.0  4.6 952968 751840 pts/1   S    Jun13   8:24 php-fpm: pool alinktech.com
root     10661  0.4  2.5 5167596 415760 ?      Sl   Jun14 147:05 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat-es.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
polkitd  15061  0.0  1.7 478644 281560 pts/1   S    May31   2:54 php-fpm: pool ty-view.alinktech.com
polkitd  15030  0.0  1.7 477572 280384 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd  14767  0.0  1.7 478564 281472 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd  11314  0.0  1.7 478484 281236 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd  11313  0.0  1.7 478032 280888 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd  11312  0.0  1.7 478616 281340 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd  11311  0.0  1.7 478044 280912 pts/1   S    May31   2:53 php-fpm: pool ty-view.alinktech.com
polkitd   9782  0.0  1.4 425276 228132 pts/1   S    Jun06   2:23 php-fpm: pool ty-view.alinktech.com
polkitd  26914  0.0  1.3 423612 226404 pts/1   S    Jun06   2:22 php-fpm: pool ty-view.alinktech.com
polkitd  26825  0.0  1.3 424052 226820 pts/1   S    Jun06   2:22 php-fpm: pool ty-view.alinktech.com
polkitd   9036  0.0  1.2 400868 203692 pts/1   S    Jun09   2:07 php-fpm: pool ty-view.alinktech.com

通过top查看 cup利用率不高,属于正常状态

查看当前php-fpm总进程数:

ps -ylC php-fpm --sort:rss

查看当前php-fpm进程平均占用内存情况,一般来说一个php-fpm进程占用的内存为30-40MB:

# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
383M                    ##结果高了

二、解决php-fpm进程占用内存大问题

2.1 调整管理模式

static管理模式适合比较大内存的服务器,而dynamic则适合小内存的服务器,你可以设置一个pm.min_spare_servers和pm.max_spare_servers合理范围,这样进程数会不断变动。ondemand模式则更加适合微小内存,例如512MB或者256MB内存,以及对可用性要求不高的环境。

2.2 简书php-fpm进程数

如果你的VPS主机的内存被占用耗尽,可以检查一下你的php-fpm进程数,按照php-fpm进程数=内存/2/30来计算,1GB内存适合的php-fpm进程数为10-20之间,具体还得根据你的PHP加载的附加组件有关系。

2.3 php-fpm配置示例

这里以1GB内存的VPS配置php-fpm为演示,实际操作来看设置数值还得根据服务器本身的性能、PHP等综合考虑。

pm = dynamic #dynamic和ondemand适合小内存。
pm.max_children = 15 #static模式下生效,dynamic不生效。
pm.start_servers = 8 #dynamic模式下开机的进程数量。
pm.min_spare_servers = 6 #dynamic模式下最小php-fpm进程数量。
pm.max_spare_servers = 15 #dynamic模式下最大php-fpm进程数量。

三、解决php-fpm进程不释放内存问题

上面通过减少php-fpm进程总数来达到减少php-fpm内存占用的问题,实际使用过程中发现php-fpm进程还存长期占用内存而不释放的问题。解决的方法就是减少pm.max_requests数。
最大请求数max_requests,即当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程,这样达到了释放内存的目的了。以1GB内存的VPS主机设置为例(如果你设置的数值没有达到释放内存可以继续调低):

pm.max_requests = 500 

当php-fpm进程达到了pm.max_requests设定的数值后,就会重启该进程,从而释放内存。下图是我测试后的效果,可以看出php-fpm进程被强制结束并释放了内存。

四、总结

对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children。如果是小内存的服务器,建议使用dynamic或者ondemand模式,同时降低pm.start_servers和pm.max_spare_servers进程数。

php 启动关闭

关闭php-fpm:

kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

平滑重启php-fpm:

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

相关文章

  • php-开启多个子进程,占用大量内存

    通过ps查看,php开启好几个线程占用大量内存 通过top查看 cup利用率不高,属于正常状态 查看当前php-f...

  • linux pmap命令

    查看进程123占用内存情况 查看进程123占用内存情况--详细 查看进程123占用内存情况--更详细

  • Android创建多进程

    为何要使用多进程 1.分散内存的占用我们知道Android系统对每个应用进程的内存占用是有限制的,而且占用内存越大...

  • Android WebView独立进程解决方案

    App中大量Web页面的使用容易导致App内存占用巨大,存在内存泄露,崩溃率高等问题,WebView独立进程的使用...

  • Android性能探索

    进程管理&内存管理 进程生命周期进程优先级:前台进程可见进程服务进程后台进程 (LRU Cache & 占用内存...

  • Linux查看内存,占用CPU资源

    linux 查询进程占用内存(MEM)最高的前10个进程 Linux 查询进程占用 cpu 最高的前10个进程 查...

  • 内存溢出排查命令

    可以先用top命令查询出占用内存最多的进程,然后使用下面指令分析占用内存较大的代码 查看进程的内存镜像信息 显示j...

  • Linux监控命令速记

    进程的线程数 进程内存占用看rss 进程的网络连接

  • 系统性能分析与诊断工具

    一、CPU占用最高的10个进程 二、内存占用最高的10个进程 三、虚拟内存使用最多的前10个进程 四、统计当前连接...

  • android webView独立进程通讯方式

    为什么需要将webView放在独立进程 webView 加载网页的时候可能占用大量内存,导致应用程序OOM。 we...

网友评论

      本文标题:php-开启多个子进程,占用大量内存

      本文链接:https://www.haomeiwen.com/subject/pgcohctx.html