在受限服务器上限制 php-fpm 内存使用量

在受限服务器上限制 php-fpm 内存使用量

我将这个问题从超级用户那里“移”过来,因为我认为它在这里更合适。实际上,我发现了一些重复的问题,但没有一个能解决我的问题。

一般范围

我有一个在运行的 Nextcloud (php) 实例Olimex LIME2家庭服务器,只有 1GB 的 RAM。我对硬件很满意,但现在遇到了内存问题。

我手动(没有 docker)部署了 mysql、nginx 和 php-fpm,所有这些都是从 Debian repos 安装的。

问题

通常情况下,它运行良好,但我发现过一种情况,由于内存滥用,OOM 会终止 php-fpm 服务。当时,通过 Web UI 将数百张图片上传到共享文件夹。所有 php-fpm 子进程都会生成,并开始获得越来越多的内存,甚至超过允许的内存。它们应该保持在 128MB 以下,但最终每个进程都占用了多达 200MB。最后,系统耗尽了可用内存并终止了该服务。

试用:调整 php-fpm 设置

我尝试调整 php.ini 和池配置,但在这种情况下 php-fpm 似乎忽略了内存限制。我有这个配置,应该允许所有这些 www 池仅消耗4*128MB = 512MB of RAM,这为数据库和系统其余部分留下了足够的内存。实际上,我认为在 750MB 以下是安全的。

# /etc/php/7.4/fpm/pool.d/www.conf
pm = dynamic

pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 2

; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
;pm.process_idle_timeout = 10s;

; Default Value: 0
;pm.max_requests = 500
# /etc/php/7.4/fpm/php.ini
memory_limit = 128M

我已经查找过辅助 php 配置文件,但没有适用的。

试用:php-fpm 的 cgroup jailing

正如建议的那样限制PHP-FPM的总内存使用量,我也尝试过通过 cgroup 和 systemd 来限制内存,像这样:

sudo systemctl set-property php7.4-fpm.service MemoryLimit=700M

我尝试了不同的值,比如低得离谱的 300M,但结果并不理想。服务没有适应限制,而是试图获取更多内存,最终 cgroup 系统将其杀死。难道没有更平和的方法吗?

试用:更少的 worker,更多的内存

如果只有 2 个 worker,并且每个 worker 有更多内存,问题会稍后出现,但仍然会被终止。此外,由于缺少可用的 worker,一些应该并行的操作被阻止

试用:使用更少的内存来增加更多的工作线程

128MB 已经是一个很低的值了,而且并非所有操作都需要很多工作线程。所以我冒着达到其他限制的风险。此外,这个实例几乎没有来自多个人类用户的并发使用。

试用:“管理员”设置

正如建议的那样限制 PHP-FPM 内存消耗,我设置了php_admin_value[memory_limit] = 128M,但结果仍然是相同的:顶部显示每个孩子的使用量从 15% 上升到 19%,从 报告的总共 998 MiB 来看free -h,这远远超过了限制(189 >> 128

解决方法

我还在服务中添加了一行,以便当服务被终止时,它会自动重新启动。

Restart=always

这让我可以上传更多的图片,但却产生了一系列问题,例如错误消息和锁定文件的 GUI 通知。

致谢

问题

我做错了什么吗?对于某些进程,无法强制执行内存限制,这正常吗?你会怎么做?更换硬件对我来说不是一个选择,我从 2016 年开始就一直在使用自托管的 nextcloud(当时是 owncloud),当时我的内存只有一半。

答案1

考虑使用

pm = STATIC 

限制 RAM 请求。当您通过 pic 下载推送多个请求时,自动队列也许会及时覆盖负载。

您的服务器上有多少个可用核心?

查看个人资料以获取联系信息。

相关内容