我和一位同事都在同一个 postgres 数据库上工作。我们都开始了内存密集型查询,这些查询现在已经运行了几个小时。托管数据库的机器内存有限,因此我们的两个进程运行速度都非常慢。我同事的查询(创建物化视图)通常需要 4 小时才能完成,但现在大部分时间都在运行。
由于我同事的查询比我的更重要,需要在一定时间内完成;有什么方法可以暂停我的查询,从而增加可用 RAM 并允许我同事的流程完成?
我的查询是对表的大型“更新”,理想情况下我不想杀死它,必须重新开始。无论如何我可以减少或暂时暂停我的进程消耗的资源吗?
Postgres 9.4/红帽 6.8
如果您有权访问运行 postgres 的操作系统帐户,则可以识别进程的 PID(使用
top
、 orps
、 orpg_stat_activity
),然后执行kill -SIGSTOP <pid>
. 稍后您将执行 akill -SIGCONT <pid>
以使其再次运行。这不是一件没有风险的事情。如果您在进程持有自旋锁时停止该进程(几乎不可能,但肯定有可能),您可以冻结整个数据库,直到最终它意识到有问题然后自己崩溃(终止您同事的工作)。如果您在进程持有轻量级锁时停止该进程,它也会冻结数据库(或其中的一部分)并保持冻结状态,直到您继续该进程并释放锁为止。
此外,停止进程的内存不会被释放。系统将能够将该内存换出,而不会不断地争取换回,也许这已经足够了。但是如果真的发布就更好了。
总而言之,取消更新并稍后重复可能是一个更好的主意。