晚上八点上传高峰过后,转码队列长度从 20 涨到 400,最老的任务等了 3 小时还没开始。worker 日志里一直是 started job,没有 failed,CPU 却只有 15%。乍看像缓存或者权限的锅,追下去往往不是。

celery -A tasks worker -Q transcode -c 8 --loglevel=info
redis-cli llen transcode
redis-cli lrange transcode 0 5

追下去是这么回事:worker 进程数固定为 2,每个任务又是同步阻塞跑完才取下一个。上传量翻了三倍,消费速度没变,队列只进不出。任务本身不报错,监控只看失败率就发现不了。

「转码队列积压」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,先按 enqueued_at 算排队时长分布 确认是消费不足而不是任务卡死;把 worker 并发按 CPU 核数调 转码是 CPU 密集型 别超过核数;给队列长度和最长等待加告警 提前于用户投诉;长视频拆成分片并行 缩短单个任务占用。

验收就看一点,队列长度在高峰后 20 分钟内回落到个位数,最老任务等待时间从 3 小时降到 5 分钟以内。

作者 9823189