Heroku PHP 立即消耗所有内存

Sam*_*Sam 5 php heroku

我有一个 Heroku 1X dyno,它在重新启动时立即消耗其所有内存。

这是日志中的重启:

2020-05-18T16:57:54.119229+00:00 app[web.1]: Stopping php-fpm...
2020-05-18T16:57:54.119814+00:00 app[web.1]: Stopping httpd gracefully...
2020-05-18T16:57:54.121897+00:00 app[web.1]: Stopping httpd...
2020-05-18T16:57:54.131154+00:00 app[web.1]: Shutdown complete.
2020-05-18T16:57:54.194178+00:00 heroku[web.1]: Process exited with status 143
2020-05-18T16:57:57.194751+00:00 app[web.1]: Detected 536870912 Bytes of RAM
2020-05-18T16:57:57.231186+00:00 app[web.1]: PHP memory_limit is 4M Bytes
2020-05-18T16:57:57.245920+00:00 app[web.1]: Starting php-fpm with 128 workers...
2020-05-18T16:57:57.386605+00:00 app[web.1]: Starting httpd...
2020-05-18T16:57:58.220510+00:00 heroku[web.1]: State changed from starting to up
Run Code Online (Sandbox Code Playgroud)

我的 procfile 只是:

web: vendor/bin/heroku-php-apache2
Run Code Online (Sandbox Code Playgroud)

我的 .user.ini 是:

memory_limit = 4M
Run Code Online (Sandbox Code Playgroud)

这些代码都没有设置为在后台运行,它只是一个处理请求的 API。然而,它立即消耗了最大内存并抛出了 R14 错误,有 0 个请求进入。https://share.getcloudapp.com/GGukb5QZ

有谁知道会发生什么?

Rob*_*bie 2

这是您需要阅读的文档:https://devcenter.heroku.com/articles/php-concurrency

\n\n

您用评论回答了这个问题“我可以通过增加内存限制来减少内存底限(这样它就不会在启动时占用所有内存)。”

\n\n

长话短说,Heroku 说:

\n\n
    \n
  • 我有多少内存?(您有 512MB)
  • \n
  • 每个 PHP 进程的最大内存量(您设置为 4MB)
  • \n
  • 将两者相除并启动那么多的工人(你得到 128)
  • \n
\n\n

此计算忽略的是运行 HTTP 和其他进程的开销。正如该页面上所澄清的“这些默认值是有意选择的,不留下任何 \xe2\x80\x9cheadroom\xe2\x80\x9d ...因为应用程序极不可能消耗其整个内存限制...这意味着测功机稍微超过了- 默认订阅。”

\n\n

通常,如果您将限制设置为 128MB = 4 个工作进程,那么这并不重要:

\n\n
    \n
  • 每个 php 进程 128MB,但平均仅使用 100MB(那是巨大的:))
  • \n
  • 每个 http 进程添加 1MB = 101MB
  • \n
  • 乘以 4 = 404MB
  • \n
  • 再加上日志记录、日志轮换、SSH 和所有数百个其他进程的开销,比如说 40MB
  • \n
  • 总计 = 404 + 40 = 444MB < 512MB。
  • \n
  • 如果每个进程仅使用 3.5MB = 充足的空闲空间。
  • \n
  • 耶!
  • \n
\n\n

但是,您有:

\n\n
    \n
  • 每个 php 进程 4MB,平均仅使用 3.5MB(检查PHP 中的内存获取峰值使用情况
  • \n
  • 每个 http 进程添加 1MB = 4.5MB
  • \n
  • 乘以 128 = 576MB
  • \n
  • 再加上日志记录、日志轮换、SSH 和所有数百个其他进程的开销,比如说 40MB
  • \n
  • 总计 = 576 + 40 = 616MB > 512MB。
  • \n
  • Heroku 开始内存管理。
  • \n
\n\n

您需要找到合适的平衡点,例如像您所做的那样设置为 8M = 64 个进程。

\n\n
\n\n

注意:有关开销和 HTTP 进程的陈述是一种简化,仅用于说明目的。

\n\n

配置 FPM 总体来说有点噩梦,因为您可以运行多个池,每个池都包含初始工作人员和备用工作人员。https://www.php.net/manual/en/install.fpm.configuration.php

\n\n

Heroku 正在尝试为您简化这个过程。

\n