我遇到服务器响应时间的问题,当我重新启动 php FPM 时,网站加载速度很快,然后过一段时间又出现同样的情况,所以我不得不再次重新启动 fpm。
我更改了 pm_max_children、pm_max_requests、pm_min_spare_servers 设置,但没有任何作用。
请帮我解决这个问题。
现在 pm_max_children=600
答案1
几周前我遇到过类似的问题,我发现这篇关于 php-fpm 调整的文章很有用。可能值得仔细阅读其中的部分内容来检查您的设置。它计算了如何设置 PHP 进程的内存限制。https://medium.com/@richb_/tweaking-nginx-and-php-fpm-configuration-to-fix-502-bad-gateway-errors-and-optimise-performance-on-17465f41fd87
答案2
您的服务器有多少个核心和多少 RAM?在重新启动服务器之前,有多少个 PHP 进程以及“top”显示什么?
统计 php 进程数
ps -ef | grep php
计算顶部(编辑您的问题以复制并粘贴顶部的文本,格式化以便正确显示。前 4 或 5 行是最重要的)
top
我怀疑您试图使用比服务器更多的资源。PHP 可以使用大量内存 - 每个线程(子线程)100MB 或更多。如果您告诉它使用 600 个子线程,则可能要使用 60GB 的 RAM,因此您完全可以进行交换。
我有一个 EC2 t3.nano,它有 500MB 的 RAM 和 500MB 的交换空间,运行着 MySQL、PHP、Nginx 和其他一些东西。我设置了 pm.max_children = 4 。以下是我为负载很轻的服务器设置的动态 PHP 池的关键设置
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 2
; This next line restarts the PHP thread once it's serviced 100 threads - I have a buggy program
pm.max_requests = 100
我还有另一个 PHP 池,仅用于测试,这种情况很少见,因此默认没有多余的 PHP 进程
pm = ondemand
pm.max_children = 2
pm.process_idle_timeout = 120s;
pm.max_requests = 50
在我的 Nginx 配置中,我使用此命令将我的测试站点发送到 PHP 测试池
fastcgi_pass php56-fpm-testpool;
建议
使用类似这样的配置来减少 RAM 使用量。这实际上取决于您的负载,您应该调整数字。
pm = dynamic
pm.max_children = 75
pm.start_servers = 25
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 500