我们正在 AWS ECS 上运行我们的 Ruby on Rails 应用程序。应用程序每个集群有多个服务,每个服务运行 X 数量的任务,这些任务负责其队列中的作业。 对于队列,我们使用 Resque,它使用 Redis 作为数据库。版本:
大部分时间一切正常,但有时某些任务会卡住。 经过一番调查,我发现了这一点:
htop 命令结果
8 root 20 0 239M 137M 13928 S 0.0 1.8 0:04.73 `- /usr/local/bundle/bin/rake resque:workers QUEUE=import COUNT=1
11 root 20 0 1091M 377M 32640 S 0.0 4.9 0:21.33 | `- resque-2.4.0: Forked 27 at 1680393903
28 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.11 | | `- ruby-timer-thr
27 root 20 0 1027M 308M 20588 S 0.0 4.0 0:48.67 | | `- resque-2.4.0: Processing import since 1680
32 root 20 0 1027M 308M 20588 S 0.0 4.0 0:00.00 | | | `- connection_poo*
30 root 20 0 1027M 308M 20588 S 0.0 4.0 0:00.00 | | | `- connection_poo*
29 root 20 0 1027M 308M 20588 S 0.0 4.0 0:48.46 | | | `- ruby-timer-thr
26 root 20 0 1091M 377M 32640 S 0.0 4.9 0:08.19 | | `- worker.rb:527
23 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.03 | | `- ruby
20 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.00 | | `- jemalloc_bg_thd
19 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.35 | | `- connection_poo*
18 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.39 | | `- connection_poo*
17 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.49 | | `- connection_poo*
16 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.29 | | `- connection_poo*
15 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.43 | | `- connection_poo*
13 root 20 0 1091M 377M 32640 S 0.0 4.9 0:00.46 | | `- connection_poo*
10 root 20 0 239M 137M 13928 S 0.0 1.8 0:00.00 | `- tasks.rb:32
9 root 20 0 239M 137M 13928 S 0.0 1.8 0:00.00 | `- ruby-timer-thr
当我在 PID 27 上做 strace 时它返回这个
futex(0x7f7027dc52d0, FUTEX_WAIT_PRIVATE, 2, NULL
我的理解是进程正在等待一些不可用的资源,所以也许其他一些进程正在使用这些资源,或者它与远程连接(Redis、Postgres 等)有关,但我不确定如何检查那个。
我还注意到我们有多个“ruby-timer-thr”进程 PID 29 上的 strace 每隔几分钟返回“-1 EAGIN”,一旦某些任务再次卡住,将发布整个消息。
PID 28 上的 strace 每秒返回一次
restart_syscall(<... resuming interrupted read ...>) = 0
poll([{fd=3, events=POLLIN}], 1, 100) = 0 (Timeout)
poll([{fd=3, events=POLLIN}], 1, 100) = 0 (Timeout)
poll([{fd=3, events=POLLIN}], 1, 100) = 0 (Timeout)
poll([{fd=3, events=POLLIN}], 1, 100) = 0 (Timeout)
poll([{fd=3, events=POLLIN}], 1, 100) = 0 (Timeout)
我尝试 SIGKILL PID 29(SIGTERM 没有工作)并且任务创建了 Resque 的新分支并正常继续。
有谁知道这里的问题是什么,我还有其他方法可以调试吗?也许某处出现了僵局?