celery over beanstalk broker:任务执行延迟

2024-05-16 14:59:31 发布

您现在位置:Python中文网/ 问答频道 /正文

TL;DR:

我通过一个beanstalkd代理,使用task.delay(例如,myNotifyTask.delay()而不是myNotifyTask())将简短而简单的任务排队给celeryd。尽管延迟值应该是即时的,但是任务执行大约需要一个小时(而这些任务只需要几秒钟)。在

根据我的观察,似乎任务确实是在beanstalkd状态下接收的,但是在很长一段时间内都处于ready状态。尽管设置了CELERYD_CONCURRENCY = 8,但仍会发生这种情况。当查看beanstalkd的日志时,我会得到关于read(): Connection reset by peer的错误,但是这些任务最终会执行。在

你知道为什么会这样吗?在

详情如下。在


使用Beanstalk1.4.6版本,celery 3.0.20。在

beanstalk日志条目如下所示:

/usr/bin/beanstalkd: prot.c:709 in check_err: read(): Connection reset by peer

尝试使用celery诊断问题时:

^{pr2}$

当通过telnet连接到beanstalkd时,我看到了current-jobs-ready: 343,这表明作业停留在ready状态(而不是delayed)。以下是完整输出:

> telnet localhost 11300
stats
OK 850
---
current-jobs-urgent: 343
current-jobs-ready: 343
current-jobs-reserved: 0
current-jobs-delayed: 0
current-jobs-buried: 0
cmd-put: 2484
cmd-peek: 0
cmd-peek-ready: 7
cmd-peek-delayed: 1
cmd-peek-buried: 1
cmd-reserve: 0
cmd-reserve-with-timeout: 52941
cmd-delete: 2141
cmd-release: 0
cmd-use: 2485
cmd-watch: 42
cmd-ignore: 40
cmd-bury: 0
cmd-kick: 0
cmd-touch: 0
cmd-stats: 497655
cmd-stats-job: 2141
cmd-stats-tube: 3
cmd-list-tubes: 2
cmd-list-tube-used: 1
cmd-list-tubes-watched: 52954
cmd-pause-tube: 0
job-timeouts: 0
total-jobs: 2484
max-job-size: 65535
current-tubes: 3
current-connections: 6
current-producers: 2
current-workers: 2
current-waiting: 1
total-connections: 502958
pid: 989
version: 1.4.6
rusage-utime: 45.778861
rusage-stime: 56.595537
uptime: 2489047
binlog-oldest-index: 0
binlog-current-index: 0
binlog-max-size: 10485760

不久之后:

stats-tube celery
OK 257
---
name: celery
current-jobs-urgent: 348
current-jobs-ready: 348
current-jobs-reserved: 0
current-jobs-delayed: 0
current-jobs-buried: 0
total-jobs: 2739
current-using: 3
current-watching: 1
current-waiting: 0
cmd-pause-tube: 0
pause: 0
pause-time-left: 0

Tags: cmd状态statsjobsjobcurrentlistcelery
1条回答
网友
1楼 · 发布于 2024-05-16 14:59:31

原来问题是一个芹菜任务有很长的超时,这导致它的工作人员等待很长时间。即使打开了并发,超时时间也太长了,任务总是堆在豆茎上(没有芹菜吃,因为所有的工人最终都会忙起来)。在

相关问题 更多 >