也许是一个非常简单的问题 - 我经常看到系统上运行的 celery 任务进程在使用 celery.task.control.inspect() 的 active() 方法时找不到。通常这个进程会运行几个小时,我担心它是某种僵尸。通常它也会占用大量内存。
有没有办法通过linux pid查找任务? celery 或 AMPQ 结果后端会保存它吗?
如果没有,还有其他方法可以找出哪个特定任务正在消耗内存吗?
----更新:
当 active()
告诉我特定机器上没有任务运行,但该机器的内存已完全使用,并且 htop 显示这些工作池线程正在运行时,我该怎么办那些使用它但同时使用 0% CPU 的人?如果事实证明这与我当前机架空间设置的某些怪癖有关并且没有人可以回答,我仍然会接受 Loren 的。
谢谢~
最佳答案
我将假设“任务”指的是“ worker ”。否则这个问题就没有意义。
对于某些上下文,了解 Celery 工作池的进程层次结构非常重要。工作池是一组共享相同配置(处理同一组队列的消息等)的工作进程(或线程)。每个池都有一个管理该池的父进程。该进程控制 fork 多少子进程,并负责在子进程死亡时 fork 替代子进程。父进程是唯一绑定(bind)到 AMQP 的进程,子进程通过 IPC 从父进程获取和处理任务。父进程本身并不实际处理(运行)任何任务。
此外,为了回答您的问题,父进程是负责响应 Celery 检查广播的进程,并且池中列为工作人员的 PID 仅是子工作人员。不包括父 PID。
如果您使用 --pidfile 命令行参数启动 Celery 守护进程,该文件将包含父进程的 PID,并且您应该能够将该 PID 与您所引用的进程交叉引用确定它是否实际上是池父进程。如果您使用 Celery multi 启动多个实例(多个工作池),那么默认情况下 PID 文件应位于您调用 Celery multi 的目录中。如果您没有使用这两种方法来启动 Celery,请尝试使用其中一种方法来验证该进程不是僵尸进程,而实际上只是一个父进程。
关于Python Celery - 通过 pid 查找任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444015/