Laravel queue:listen 一直占用服务器所有内存

Posted

技术标签:

【中文标题】Laravel queue:listen 一直占用服务器所有内存【英文标题】:Laravel queue:listen takes up all the server memory all the time 【发布时间】:2016-06-27 07:00:41 【问题描述】:

我正在使用 Amazon Beanstalk 来托管我的 Laravel 应用程序。我创建了一个特殊配置,以便我的 queue:listen 在部署时自动重新启动 supervisor

[unix_http_server]
file=/tmp/supervisor.sock
chmod=0777

[supervisord]
logfile=/var/app/support/logs/supervisord.log
logfile_maxbytes=25MB
logfile_backups=2
loglevel=warn
pidfile=/var/run/supervisord/supervisord.pid
nodaemon=false
nocleanup=true
user=webapp

[program:laravel_queue]
command=php artisan queue:listen --queue=email,activity,purging,misca --memory=256 --env=production
directory=/var/app/current
stdout_logfile=/var/app/support/logs/laravel-queue.log
logfile_maxbytes=25MB
logfile_backups=2
redirect_stderr=true
autostart=true
autorestart=true
startretries=86400

这很好用,我的问题是一天后我的服务器内存总是达到 95%!

我检查了内存并注意到一堆由 queue:listen 启动的 http 进程,但由于某种原因从未被杀死(注意所有作业都成功,​​没有失败)。

webapp   22923  0.0  0.4 673948 19032 ?        S    18:10   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22926  0.0  0.8 674588 35512 ?        S    18:10   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22929  0.0  0.4 673948 19032 ?        S    18:11   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22931  0.0  0.9 674932 37576 ?        S    18:11   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22932  0.0  0.4 673948 19032 ?        S    18:11   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22934  0.0  0.8 674600 35536 ?        S    18:11   0:00 /usr/sbin/httpd -D FOREGROUND
webapp   22935  0.0  0.8 674588 35512 ?        S    18:11   0:00 /usr/sbin/httpd -D FOREGROUND

为什么我认为这些 http 进程是 queue:workers 没有终止?

【问题讨论】:

你能发布你的工作代码吗? 嗯,我有几十个工作,但他们真的没有做任何特别的事情。一些触发处理程序的调用事件和一些处理程序调度其他被推送到队列中的作业。总而言之,队列永远不会让所有作业都完成失败,但这些僵尸进程仍然存在。 嗯,我的猜测是 apache 进程是监听传入网络流量的线程,但我希望看到线程的所有者是 apache 而不是 webapp。如果 web 服务器作为 webapp 运行,那么这是有道理的。我不认为 Laravel 的队列使用 apache 运行 - 它们在命令行上运行,不是吗? 嗯,webapp 是我指定给主管运行队列的用户:listen。当我禁用队列时,我并没有到处都有这些进程,所以我很确定这些正是 queue:listen 或 queue:work 进程。 (顺便说一句,当我运行命令并得到上面的输出时,没有任何工作正在处理,所有工作都在几个小时前完成,但这些过程仍然存在) 我假设您的某些作业失败,并且由于您已将 autorestart 设置为 true,因此作业试图一次又一次地运行。查看有关失败作业的文档laravel.com/docs/5.1/queues#dealing-with-failed-jobs 【参考方案1】:

虽然我遇到了同样的问题,但您缺少主管的程序配置属性

尝试添加numprocs,然后添加您想要运行的单个进程

Reference Laravel's Example Supervisor Config in the Documentation

【讨论】:

以上是关于Laravel queue:listen 一直占用服务器所有内存的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 运行队列处理器 queue:work 与 queue:listen 区别及 Windows 终端命令问题

Laravel 运行队列处理器 queue:work 与 queue:listen 区别及 Windows 终端命令问题

在Laravel的工匠队列中捕获ProcessTimedOutException:listen

Laravel:队列:听PDOException:找不到驱动程序

queue:work --daemon 和 queue:listen 有啥区别

Laravel:获取有关队列作业的详细信息