通过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`
网友评论