Rails Resque - AWS ECS 任务随机卡住

问题描述 投票:0回答:0

我们正在 AWS ECS 上运行我们的 Ruby on Rails 应用程序。应用程序每个集群有多个服务,每个服务运行 X 数量的任务,这些任务负责其队列中的作业。 对于队列,我们使用 Resque,它使用 Redis 作为数据库。版本:

  • 轨道 5.2.6
  • 红宝石 2.5.9p229
  • Resque 2.4.0

大部分时间一切正常,但有时某些任务会卡住。 经过一番调查,我发现了这一点:

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 的新分支并正常继续。

有谁知道这里的问题是什么,我还有其他方法可以调试吗?也许某处出现了僵局?

ruby-on-rails ruby linux amazon-ecs resque
© www.soinside.com 2019 - 2024. All rights reserved.