本文分享自華為雲社區《GaussDB(DWS)監控工具指南(四)運算元級監控【綻放吧!GaussDB(DWS)雲原生數倉】》,作者: 幕後小黑爪 。 隨著數據量的增大和數據處理的複雜性增加,資料庫系統的性能問題變得越來越突出。應用程式對資料庫的訪問頻率和數據量也越來越大。因此,優化資料庫系統的性能成為 ...
本文分享自華為雲社區《GaussDB(DWS)監控工具指南(四)運算元級監控【綻放吧!GaussDB(DWS)雲原生數倉】》,作者: 幕後小黑爪 。
隨著數據量的增大和數據處理的複雜性增加,資料庫系統的性能問題變得越來越突出。應用程式對資料庫的訪問頻率和數據量也越來越大。因此,優化資料庫系統的性能成為了資料庫管理員和開發人員的重要任務。通過SQL性能調優,可以提高資料庫系統的響應速度和吞吐量,減少資源消耗,提高系統的穩定性和可靠性,從而提高應用程式的性能和用戶體驗。目前GaussDB(DWS)已有的explain工具無法滿足用戶實時定位問題的需求,為此DWS推出了運算元級監控,以解決實時運算元難以觀測的問題。
1. 需求描述
舉個例子,用戶下發語句後,無法知道當前語句的執行計劃生成的是否合理,目前語句的執行進度和消耗資源等情況。如下圖所示,用戶僅能看到執行花費了多長時間,並不能看到語句後面執行的什麼信息?運算元是咋樣運行的?每個運算元怎麼交互的,生成的計劃是否合理,無法進行判斷。
為此,DWS提供了explain performance的方式進行事後分析,而explain performance需要將語句執行完後才能看到結果,對於某些新上業務的語句,不知道會運行多久,甚至說能不能運行出來結果都不知道,所以無法直接通過explain performance分析結果。
因此亟需一種實時觀測語句運算元運行的手段來確定執行計劃的優化點,以便SQL調優。
2. 解決方案
針對這些情況,GaussDB(DWS)在新版本821新推出了運算元監控,運算元監控能看到語句具體運行的情況,能追蹤到具體某個運算元的進度以及消耗資源情況。使用步驟如下:
1)設置guc參數resource_track_level為operator_realtime級別,然後執行語句;
2)重新打開一個視窗,連接gaussdb,通過pgxc_wlm_operator_statistics查詢集群所有打開運算元監控的語句,又或者通過查詢pg_stat_get_wlm_realtime_operator_info(queryid)可以獲取到該queryid對應語句的信息。
select * from pgxc_wlm_operator_statistics;
註:該功能對性能有一定影響,執行基線測試,同樣情況下可能會最大新增2%左右的性能劣化,建議用戶在追蹤性能問題時使用。
運算元監控跟語句監控功能類似,同樣包含的語句的靜態信息和運行態信息。
1)語句靜態信息是語句在真正執行前就已經由優化器生成的信息,如執行計劃plan_node_name,queryid,預估行數estimated rows等信息。可用來分析生成的執行計劃是否合適。
2)語句動態信息是語句在執行器中執行過程中所占用的資源信息,如運算元執行進度progress、記憶體peak_memory、運算元下盤spill_size、網路net_size、磁碟IO(read_bytes、write_bytes),CPU(cpu_time)等不同DN的實時的信息記錄。可用來分析語句執行過程中的進度和資源消耗情況,通過該欄位可以分析出語句在運行是消耗較久的在什麼地方,便於後續優化。
3. 實際使用
我們下發某個查詢,在另一個會話中查詢運算元視圖,結果如下:
1)當前運算元進度:欄位progress展示了當前運算元的運行進度,對於第一個運算元而言,該欄位展示的是當前語句的整體進度。
2)不斷刷新視圖,能看到語句執行情況,觀察進度介於(0,100)之間的進度運算元,這些代表該運算元正在運行。
3)觀察當前運算元實際消耗資源情況,判斷可能阻塞的原因。
4. 總結
以往需要explain performance執行完畢後才能獲取運算元運行信息,現在通過該視圖可以直接在運行期間獲取,且該視圖對結果集無影響。本文提供的視圖可以支持用戶對語句運算元進行實時監控,能較為準確的反應語句的執行情況,通過觀察運行時長較久的運算元和消耗資源,可以判斷計劃生成是否合理,又或者通過進度欄位觀察語句運行進度可用來定位SQL性能問題。當然,該視圖也許和其他運行態的視圖結合使用,最終確定SQL性能較慢的原因,並採取措施進行調優。