
# 动态负载管理下的CCN排队
#### 问题现象
业务整体缓慢，只有少量语句在执行，其余业务语句都在排队中（wait in ccn queue）。
#### 原因分析
动态负载管理下，语句会根据估算内存计数排序，例如，最大动态可用内存为10GB（单实例），语句估算使用内存大小为5GB，这样的语句运行两个，其余语句就会等待前两个语句运行完毕才能执行，此时的状态即为wait in ccn queue。
#### 处理方法
- 场景一：语句估算内存过大，造成排队。
  - 查询pg_session_wlmstat视图，查看状态为running的语句是否个数很少，而且statement_mem字段数值是否较大（单位为MB，一般认为大于max_dynamic_memory 1/3即为大内存语句）。如果都符合就可以判断是此类语句占据内存导致整体运行缓慢。
    ```
    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;
    ```
    ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001278052901.png "点击放大")
    如上图所示，只有最后一个语句是running状态，其余语句都是pending状态。根据statement_mem可以看到该语句占据2576MB内存。此时根据语句的threadid，执行以下命令终止对应的查询语句，终止后即可释放资源，其余语句正常运行。
    ```
    SELECT pg_terminate_backend(threadid);
    ```
    
   

- 场景二：所有语句状态都是pending状态，没有运行的语句。此时应是管控机制出现异常，直接终止所有线程，即可恢复正常。
  ```
  SELECT pg_terminate_backend(pid) FROM pg_stat_activity where usename not in ('dbadmin','Ruby');
  ```
  
 
