这是一个紧急问题。我的 AWS 实例有 4GB RAM 和 2vCPU,因为太多 php-fpm 进程而耗尽了内存。
PHP-FPM 开始创建过多之前没有创建的进程。这导致网站加载缓慢。我不知道为什么会发生这种情况。
我的 php.ini 配置:
html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M
upload_max_filesize = 27M
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M
www.conf:
pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
答案1
回答你的问题
在 www.conf 中更改此项(35 个进程)
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
至此(8 个流程)- 或任意你喜欢的数字
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000
您可能还想纠正这个拼写错误
max_file_uploads = 20 = 20
回答评论中的问题
作为背景,pm.max_children 表示有多少 PHP 线程可用于处理请求。如果没有可用的线程,请求将排队,直到 Web 服务器超时,直到有工作可用。
PHP 非常占用内存,而且非常占用 CPU。如果您有足够的 RAM(例如)10 个 PHP 线程,但分配了 30 个,您的服务器将发生交换,性能将非常糟糕。如果您过度分配 CPU,它会变慢,但不会像 RAM 不足那么糟糕。
一般来说,您应该计算一下有多少个 PHP 工作线程可以运行而不会耗尽服务器的 RAM。假设您的服务器使用 2GB RAM,并且关闭了 PHP,并且每个线程使用 100MB RAM,那么您可以运行大约 20 个 PHP 工作线程。您应该尽量避免 RAM 饱和,因为它用作磁盘缓存,因此请留出一些空闲的 RAM。
您需要在缓慢的 PHP 线程和排队之间找到平衡。没有人可以为您做到这一点,这将是一个实验,直到您的服务器得到充分利用但不至于陷入困境。但是,首先,我们假设最多有 10 个线程,然后从那里开始。使用“top”来监视可用内存,但对于内存,您可能需要使用“res”(我认为驻留在内存中)列而不是“virt”来估计 PHP RAM 使用情况。
操作缓存
我怀疑(但不确定)启用 opcache 的建议已经过时了,因为 PHP7 已经相当优化并且很可能默认启用。
缓存
PHP 获得良好性能的关键是缓存。匿名用户访问未定制的页面通常可以被缓存,即使只有 1/5/60 秒,对于负载很高的服务器来说也有很大帮助。确保您的缓存标头正确描述页面到期时间,然后配置 Nginx/Apache 以进行适当缓存 - 如果您使用的是 Web 服务器。
您还可以在 CDN 上缓存静态资源,例如 CloudFront / CloudFlare(请注意,CloudFlare 有免费套餐,并且与 AWS 配合良好)。这不会占用太多 CPU 或 RAM,但可以节省带宽。对于负载过大的服务器来说,每一点都有帮助。
答案2
我会检查你使用的是哪种 CPU。如果你使用的是 Graviton Cpu,那么 CPU 与线程的比例是 1 比 1。
即 CPU 数量就是您应该拥有的数字pm.max_children
。如果您担心内存泄漏或担心这是一个重复出现的问题,您可以随时使用该pm.max_requests
功能并将其设置为适当的值。
该值在某种程度上取决于泄漏的增长速度。太小,您可能会不时遇到不良网关。