更新时间:2024-06-20 GMT+08:00
动态负载管理下的CCN排队
问题现象
业务整体缓慢,只有少量语句在执行,其余业务语句都在排队中(wait in ccn queue)。
原因分析
动态负载管理下,语句会根据估算内存计数排序,例如,最大动态可用内存为10GB(单实例),语句估算使用内存大小为5GB,这样的语句运行两个,其余语句就会等待前两个语句运行完毕才能执行,此时的状态即为wait in ccn queue。
处理方法
- 场景一:语句估算内存过大,造成排队。
- 查询pg_session_wlmstat视图,查看状态为running的语句是否个数很少,而且statement_mem字段数值是否较大(单位为MB,一般认为大于max_dynamic_memory 1/3即为大内存语句)。如果都符合就可以判断是此类语句占据内存导致整体运行缓慢。
1
SELECT usename,substr(query,0,20),threadid,status,statement_mem FROM pg_session_wlmstat where usename not in ('omm','Ruby') order by statement_mem,status desc;
如上图所示,只有最后一个语句是running状态,其余语句都是pending状态。根据statement_mem可以看到该语句占据2576MB内存。此时根据语句的threadid,执行以下命令终止对应的查询语句,终止后即可释放资源,其余语句正常运行。1
SELECT pg_terminate_backend(threadid);
- 查询pg_session_wlmstat视图,查看状态为running的语句是否个数很少,而且statement_mem字段数值是否较大(单位为MB,一般认为大于max_dynamic_memory 1/3即为大内存语句)。如果都符合就可以判断是此类语句占据内存导致整体运行缓慢。
- 场景二:所有语句状态都是pending状态,没有运行的语句。此时应是管控机制出现异常,直接终止所有线程,即可恢复正常。
1
SELECT pg_terminate_backend(pid) FROM pg_stat_activity where usename not in ('dbadmin','Ruby');
父主题: 集群性能