*/5 * * * * /usr/bin/flock -n /var/lock/etl.lock \
  /bin/bash /opt/jobs/etl.sh
ps -eo pid,etimes,cmd | grep etl.sh | grep -v grep

每五分钟一次的任务跑到第十五分钟才结束 进程数一路涨到十几个 队列里排着上千条待处理记录 越跑越慢。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:调度器只负责按点启动 不看上一次是否结束 单轮耗时已经超过调度间隔 积压让数据库更慢 单轮拖得更久 形成正反馈。

「定时任务堆积」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:调度间隔改成明显大于最慢一轮的耗时 留出余量;入口加一层判断 有实例在跑就跳过本轮并记日志;把一轮的工作量拆小 让单轮耗时稳定在间隔以内。

确认没问题再收工,进程数稳定在一到两个 单轮耗时回到间隔内 待处理数持续下降。

作者 9823189