天天看點

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

摘要:現網在使用動态負載管理的時候,經常出現很多wait in ccn的情況,大家處理起來就會認為是hung住或者怎麼着了,很着急,但wait ccn其實就是一個等待資源的狀态,在此總結一個ccn問題處理的博文,ccn的問題都可以通過此貼處理。

本文分享自華為雲社群《GaussDB(DWS) wait in ccn queue的時候,怎麼迅速定位處理?》,作者:Malick 。

前言

現網在使用動态負載管理的時候,經常出現很多wait in ccn的情況,大家處理起來就會認為是hung住或者怎麼着了,很着急,但wait ccn其實就是一個等待資源的狀态,在此總結一個ccn問題處理的博文,ccn的問題都可以通過此貼處理。

背景知識:

  • 哪個是ccn:

連接配接環境,

source 環境變量

source /opt/huawei/Bigdata/mppdb/.mppdbgs_profile           

執行:

cm_ctl query -Cv | grep Cen -A 4           

結果如下:

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

5003就是叢集的ccn。

ccn是什麼:ccn作為叢集并發控制大腦,所有複雜作業都會到ccn去申請資源,申請到資源的語句才能下發。複雜語句都會在ccn統一記錄。

視圖解釋:

  • pg_stat_get_workload_struct_info();
數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?
  • totalsize代表ccn總體能配置設定的記憶體,totalsize:即最大動态記憶體;freesize_limit即最大可用于ccn配置設定的記憶體,為最大動态記憶體的80%。freesize代表目前剩餘記憶體。
  • 隻需要關注圖中的central waiting/running number(global的可以不用關注,屬于另一個資料結構,和central waiting是重複資訊。)。每一行代表一個語句。running代表語句正在運作,waiting代表語句正在排隊。queryId代表語句的線程号,對應pg/pgxc_thread_wait_status中的lwtid、pg_sessiion_wlmstat中的processid。
  • pg_session_wlmstat/pgxc_session_wlmstat();
數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

步驟一、判斷問題場景

  • 連接配接ccn查詢以下語句, 判斷問題場景:

第一步,查詢pgxc_stat_activity,判斷是否語句大量在wait ccn。或者某個資源池的語句都在wait ccn。

  • 查詢pg/pgxc_session_wlmstat,判斷是否所有複雜語句都在排隊。或者同一隊列的語句都在排隊。

第一步,連接配接 ccn節點,查詢

select * from pg_stat_get_workload_struct_info();

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

第二步,查詢pgxc_session_wlmstat();

select threadid,processid,usename,attribute,status,enqueue,statement_mem,active_points,control_group,resource_pool,substring(query,position('explain' in query),20) as subquery from pg_session_wlmstat order by status,attribute,usename,subquery,resource_pool;           
數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

根據以下場景判斷使用後續哪種處理辦法:

1)如果workload視圖中有個别語句處于Running狀态,并且running的語句占用記憶體很大, 占據freesize,大量語句處于waiting狀态,那麼基本可以确定走問題處理場景一。

2)如果是有workload視圖中有running狀态的語句,但是實際上pgxc_stat_activity或者pg_session_wlmstat視圖中隻有waiting狀态的語句,并且workload視圖中,存在兩條或者多條語句的qid.queryId的值相同。那麼基本确定走問題處理場景二。

3)如果所有語句都在waiting狀态,沒有running狀态的語句,那麼基本确定走處理場景三。

處理場景一 大記憶體語句導緻問題

第一步 找到workload視圖中占用記憶體過大的語句。

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

如上圖:總共可用記憶體為1638MB,目前正在運作的一個語句占用記憶體為1048MB,剩餘記憶體freesize=590MB

此時,其餘語句記憶體估算大小都是600MB,是以記憶體不足全都無法下發下去,隻有等到該1048的語句結束,記憶體釋放才能恢複正常。

第二步 根據語句對應的qid.queryId,找到語句的pid。如上圖為9145

select coorname,pid,usename,substr(query,0,30) from pgxc_stat_activity a,pgxc_thread_wait_status b where a.pid = b.tid and b.lwtid = $qid.query_id;

第三步 根據pid和cn,清除大記憶體語句。釋放記憶體後即可恢複。

處理場景二 hash殘留或者其他語句殘留問題

第一步 确認有問題的資源池上的并發配置:

select * from pg_resource_pool;

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

第二步 如果隻是達到了資源池并發上限,例如,資源池并發設定為10,殘留的running語句數量是10,因為并發達到上限,語句都處于等待狀态,那麼調整隊列并發為-1,不限制之後,等待并發的語句即可下發下去。

修改辦法,以son_pool為例:

alter resource pool son_pool with(active_statements=-1);

第三步 清理掉問題語句(連接配接不斷開,線程不釋放,殘留資訊不會自動清理)

備注:清理已經失效的語句資訊,是根據/proc/processed是否還存在進行判斷,如不存在,則清理,如一直占有該連接配接,則不會釋放線程。殘留也不會自動清理。

  • 問題語句的判定:

在workload視圖中qid.queryId重複的語句便是問題語句,問題線程,重複兩條,可能其中一條是正常的,另一條是殘留的。也可能都是有問題的,但是終究實際上隻有一個活躍的語句在排隊或者執行。

2)清理問題語句方法,根據上述1)中提到的重複的qid.queryId,找到問題語句:

第三步 根據pid和cn,使用pg_terminate_backend(pid)清除殘留語句。釋放并發以及記憶體資源之後恢複。

處理場景三 長跳轉鎖問題

第一步 确認問題

打堆棧

gstack $ccn_pid > ccnStack.log

grep grep pthread_mutex_lock ccnStack.log

如有類似如下結果,則确認該問題

數倉出現“wait in ccn queue”的時候,怎麼迅速定位處理?

第二步 應急處理

處理方法:

kill -9 ccn_pid

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀