我将这个问题从超级用户那里“移”过来,因为我认为它在这里更合适。实际上,我发现了一些重复的问题,但没有一个能解决我的问题。
一般范围
我有一个在运行的 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 通知。
致谢
- nextcloud 建议将脚本的 memory_limit 设置为 512MB,但这对我来说太高了。我需要至少 3 个 worker 才能让 Nextcloud 正常工作,而我没有这个 1.5 GB 的内存。
- 有关的:https://stackoverflow.com/questions/15962634/nginx-or-php-fpm-ignores-memory-limit-in-php-ini#21959895
问题
我做错了什么吗?对于某些进程,无法强制执行内存限制,这正常吗?你会怎么做?更换硬件对我来说不是一个选择,我从 2016 年开始就一直在使用自托管的 nextcloud(当时是 owncloud),当时我的内存只有一半。
答案1
考虑使用
pm = STATIC
限制 RAM 请求。当您通过 pic 下载推送多个请求时,自动队列也许会及时覆盖负载。
您的服务器上有多少个可用核心?
查看个人资料以获取联系信息。