2

celery.task.control.inspect()一个非常简单的问题,也许 - 我经常看到我的系统上运行的 celery 任务进程,当我使用'sactive()方法时我找不到。通常这个过程会运行几个小时,我担心它是某种僵尸。通常它也会占用大量内存。

有没有办法通过 linux pid 查找任务?celery 或 AMPQ 结果后端会保存它吗?

如果不是,还有其他方法可以确定哪个特定任务正在消耗内存?

- - 更新:

active()告诉我在特定盒子上没有运行任何任务,但盒子的内存已被充分使用时,我该怎么办,并且 htop 显示这些工作池线程正在使用它,但同时使用 0%中央处理器?如果事实证明这与我当前机架空间设置的一些怪癖有关并且没有人可以回答,我仍然会接受 Loren 的。

谢谢~

4

1 回答 1

4

我将假设“任务”是指“工人”。否则这个问题将毫无意义。

在某些情况下,了解 Celery 工作池的进程层次结构很重要。工作池是一组共享相同配置(处理同一组队列的消息等)的工作进程(或线程)。每个池都有一个管理该池的父进程。这个过程控制有多少童工被分叉,并负责在儿童死亡时分叉替代儿童。父进程是唯一绑定到 AMQP 的进程,子进程通过 IPC 从父进程摄取和处理任务。父进程本身实际上并不处理(运行)任何任务。

此外,为了回答您的问题,父进程是负责响应您的 Celery 检查广播的进程,并且在池中列为工作人员的 PID 只是子工作人员。不包括父 PID。

如果您使用 --pidfile 命令行参数启动 Celery 守护程序,该文件将包含父进程的 PID,您应该能够将该 PID 与您所指的进程交叉引用以确定它是否实际上是一个池父进程。如果您使用 Celery multi 启动多个实例(多个工作池),那么默认情况下 PID 文件应位于您调用 Celery multi 的目录中。如果您没有使用这些方法中的任何一种来启动 Celery,请尝试使用其中一种方法来验证该进程不是僵尸进程,而实际上只是父进程。

于 2013-01-22T06:48:09.533 回答