GNU 并行子进程(Postgres vacuum)意外终止

GNU Parallel child process (Postgres vacuum) killed unexpectedly

我运行parallel这样,抽象出一些细节:

generate_job_list | parallel -j10 -q bash -c 'echo -n "running {}" ; dostuff {}'

我注意到有时 parallel 生成的子进程在收到 SIGKILL 后死掉(我知道是因为 dostuffpsql 命令 运行 真空并且 Postgres 日志告诉我命令收到了 SIGKILL)。我没有设置超时,所以我不清楚什么可能会做这样的事情。这发生在子进程 运行ning 数小时之后。

parallel 是否有默认超时(文档似乎没有暗示它有)或关于可能导致此问题的任何其他想法?

ETA:添加一些帮助我在问题正文中找到它的内容,因为它可能会帮助遇到同样问题的其他人找到这个问题。

在您的 Postgres 日志中,您应该会找到一些这样的消息:

LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
FATAL:  the database system is shutting down

尽管您没有要求 Postgres 关闭,但它仍会生成。

所以正如评论中提到的,问题出在 OOM 杀手上。我通过做几件事来修复它:

  • 分区表实际上太大而无法在不遇到内存问题的情况下清理
  • 将内存过量使用模式更改为 2 并将过量使用率设置为 95
  • 将 autovacuum 更改为更具攻击性,这样我就不必 运行 那样多的手动维护任务,这更好,因为如果 autovacuum 失败,它 运行 就不会出现在常规事务中,所以如果它失败了,它不会强制进行长时间的恢复