GaussDB是一个内存自适应的数据库,会自动根据全局内存的负载情况,来对每个语句进行仲裁,当当前资源合理的情况下,才会让语句下发并执行,如果在资源不足的情况下,就不让他继续执行,等到资源充足才进行执行,避免会出现比如内存占用过大,导致进程OOM之后异常退出之类的情况。

有时候会出现一种情况,就是大量作业都提交了没有结果,表现出的现象就是业务完全不执行,所有作业都卡住,此时可以这样检查一下:

1)show enable_dynamic_workload;

如果结果为on,就继续按照下面步骤处理,如果为off,需要参照其他处理办法。

2) 查看当前作业的状态,判断是在排队,还是阻塞:

select coorname,pid,sysdate – query_start as dur,enqueue from pgxc_stat_activity where state = ‘active’ order by 3,4;

结果示例:

image.png

可以看到很多的作业都在排队,状态是 waiting in queue,或者还有版本不同时,enqueue字段会显示为 wait in  ccn queue

此时就可以判断,是否是有语句占用了资源,并且不释放,导致发生了阻塞,比如上图中,

红框中的几个语句,都已经在执行状态,没有排队,并且已经执行了10h+没有结束,根据pid我们可以看到语句的详细情况,是否复杂,是否已经卡住,这些语句就是导致所有作业都执行不动的罪魁祸首。

处理方法:

1)将对应已经hang住的语句清理掉,可以使用如下方式,连接到数据库对应语句下发的节点,上图为cn_5001,执行pg_terminate_backend(pid)

image.png

2)再次观察作业排队状态:

还是上面的语句,查看是否还是在waiting in queue的状态。

3)如果排队已经迅速减少,就说明资源已经释放,其余作业已经可以正常运行。

PS:如果想保留定位信息,可以在清理语句之前,连接到ccn节点,查询视图:

select * from pg_stat_get_workload_struct_info();

将其打印到一个文件中,这里可以看到具体的内存使用情况,包括总体内存 freesize_limit,以及当前在运行的语句Central Running Number中对应的memsize[xxxxx],可以判断所有Running状态的memsize加起来是否已经接近freesize_limit。