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 后死掉(我知道是因为 dostuff
是 psql
命令 运行 真空并且 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 失败,它 运行 就不会出现在常规事务中,所以如果它失败了,它不会强制进行长时间的恢复
我运行parallel
这样,抽象出一些细节:
generate_job_list | parallel -j10 -q bash -c 'echo -n "running {}" ; dostuff {}'
我注意到有时 parallel
生成的子进程在收到 SIGKILL 后死掉(我知道是因为 dostuff
是 psql
命令 运行 真空并且 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 失败,它 运行 就不会出现在常规事务中,所以如果它失败了,它不会强制进行长时间的恢复