更新时间:2024-07-01 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); 
      
  • 场景二:所有语句状态都是pending状态,没有运行的语句。此时应是管控机制出现异常,直接终止所有线程,即可恢复正常。
    1
    SELECT pg_terminate_backend(pid) FROM pg_stat_activity where usename not in ('dbadmin','Ruby');