Hologres自V3.1版本起,支援針對查詢隊列配置自動限流,基於計算群組的負載情況,自動調整查詢隊列最大並發數的限制,最終實現自動限流(自動流控)。
適用情境
自動限流的原理是根據負載情況,動態調整查詢隊列的最大並發數,通過控制計算群組中並發執行的Query數量,達到避免計算資源負載過高的目的。因此該功能的適用情境如下:
高並發情境:如果並發數較高,且每個請求的開銷比較均勻,則自動限流功能會動態調整並發數限制,最終CPU曲線將穩定維持在高水位,且不會達到100%的佔用率。
說明如果並發數過低,則動態調整並發數限制時,CPU曲線容易忽高忽低,出現“鋸齒狀”,導致CPU使用率低下。
在更為極端的情況下,如果僅存在單個請求的大查詢,則自動限流功能不會生效。
可容忍請求適當延時:由於該功能為流量限制,超過限制的Query會在查詢隊列中排隊,因此這部分請求的延時會相應增加。
高並發的時間難以預知:無法確定流量請求突發的時間,難以提前預留計算資源應對該部分請求,可以通過自動限流功能降低系統穩定性風險。
如下情境建議使用其他方案:
時間周期性特徵明顯:如果每天的流量高峰時間相對固定,推薦使用計算群組分時彈性功能,定時擴縮容。
低並發的大查詢:自動限流功能對低並發的大查詢作用較小,建議使用Serverless Computing資源執行該部分請求,詳情請參見Serverless Computing使用指南。
無法容忍請求延時:需要增加計算資源量,以兼顧高並發與低延時的需求。可以擴容計算資源,或使用查詢隊列的大查詢控制功能,將執行慢的請求轉寄至Serverless中執行,詳情請參見大查詢控制。
前提條件
已建立查詢隊列。
注意事項
僅Hologres V3.1或以上版本的計算群組型執行個體支援自動限流,通用型執行個體不支援。
說明您可先將通用型執行個體轉為計算群組型,再使用該功能,詳情請參見通用型執行個體轉換為計算群組型執行個體。
僅進入查詢隊列的請求會受自動限流量控制,即engine_type為
HQE、PQE、SQE和HiveQE查詢,Query類型包括SELECT、INSERT、UPDATE、DELETE以及COPY、CTAS等命令產生的INSERT語句。由於Fixed Plan的Query不進入查詢隊列,因此不受自動限流功能的並發數限制,詳情請參見Fixed Plan加速SQL執行。建議使用不同的計算群組,將Fixed Plan的請求和其他請求隔離,以便更好地管理資源和請求,具體請參見計算群組執行個體快速入門。
使用自動限流
計算群組、查詢隊列的自動限流功能配置方法如下。
文法格式
配置計算群組的自動限流功能。
重要該功能開啟後,計算群組下的所有查詢隊列均預設開啟自動限流,可根據下文步驟按需關閉查詢隊列的自動限流功能。
該功能關閉後(預設關閉),自動限流功能即關閉,系統將忽略查詢隊列層級自動限流配置開關。
-- 計算群組層級開啟自動限流 CALL hg_set_warehouse_adaptive_concurrency_limiting ('<warehouse_name>', true); -- 計算群組層級關閉自動限流 CALL hg_set_warehouse_adaptive_concurrency_limiting ('<warehouse_name>', false);配置查詢隊列的自動限流功能。
-- 查詢隊列層級開啟自動限流。預設即開啟 CALL hg_set_query_queue_property ('<warehouse_name>', '<query_queue_name>', 'enable_adaptive_concurrency_limiting', 'true'); -- 關閉查詢隊列的自動限流,等價於將該隊列加入白名單,不參與限流 CALL hg_set_query_queue_property ('<warehouse_name>', '<query_queue_name>', 'enable_adaptive_concurrency_limiting', 'false');配置查詢隊列的自動限流功能的最小並發數。
說明在配置最小並發數後,即使系統達到該並發數限制且負載仍然較高,系統也不會自動進一步減少並發數限制。
-- 配置查詢隊列的自動限流功能的最小並發數,預設為1,最小為1 CALL hg_set_query_queue_property ('<warehouse_name>', '<query_queue_name>', 'adaptive_concurrency_limiting_min_concurrency', '<min_concurrency>');
參數說明
參數名 | 描述 |
warehouse_name | 計算群組名稱。詳情請參見計算群組執行個體快速入門。 |
query_queue_name | 查詢隊列名稱。詳情請參見查詢隊列Query Queue。 |
min_concurrency | 查詢隊列自動限流功能的最小並發數。預設值為1,取值範圍為[1, 建立查詢隊列時設定的最大並發數]。 |
監控與營運
您可單擊Hologres管理主控台的目標執行個體ID,在監控資訊頁面查看計算群組CPU使用率(%)監控指標,監測自動限流功能的使用方式。
使用樣本
本節以PG原生效能壓測工具pgbench為例,為您展示自動限流的使用樣本和效果。
在Hologres中建立測試表並寫入資料:
CREATE TABLE tbl_1 (col1 INT, col2 INT, col3 TEXT); CREATE TABLE tbl_2 (col1 INT, col2 INT, col3 TEXT); INSERT INTO tbl_1 SELECT i, i+1, md5(RANDOM()::TEXT) FROM GENERATE_SERIES (0, 500000) AS i; INSERT INTO tbl_2 SELECT i, i+1, md5(RANDOM()::TEXT) FROM GENERATE_SERIES (0, 500000) AS i;在Hologres中將查詢隊列的最大並發數設為100,以計算群組init_warehouse和查詢隊列default_queue為例:
CALL hg_set_query_queue_property ('init_warehouse', 'default_queue', 'max_concurrency', '100');在用戶端pgbench所在的
bin目錄下建立壓測SQL檔案select.sql,並寫入如下SQL:EXPLAIN ANALYZE SELECT * FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.col3 = tbl_2.col3 ORDER BY 1;在伺服器的設定檔中添加以下命令並儲存,將密碼設定為環境變數。
export PGPASSWORD='<AccessKey_Secret>'進入用戶端中pgbench所在的
bin目錄,執行如下壓測命令:./pgbench -c 30 \ -j 30 \ -f select.sql \ -d <Database> \ -U <AccessKey_ID> \ -h <Endpoint> \ -p <Port> \ -T 1800參數配置詳情請參見串連Hologres並開發。
壓測期間,在Hologres中依次開啟自動限流功能、關閉自動限流功能,並觀察計算群組的CPU使用率監控指標,直至壓測完成。
-- 開啟自動限流功能 CALL hg_set_warehouse_adaptive_concurrency_limiting ('init_warehouse', true); -- 關閉自動限流功能 CALL hg_set_warehouse_adaptive_concurrency_limiting ('init_warehouse', false);
結果分析:
壓測完成後,計算群組的CPU使用率監控指標有如下表現:
壓測初期:自動限流未開啟,查詢隊列排隊數為0,計算群組CPU使用率長期處於100%,系統存在穩定性風險。
壓測中期:自動限流開啟,查詢隊列排隊數和計算群組CPU使用率小幅度波動,而後查詢隊列排隊數穩定在17個左右,計算群組CPU使用率穩定在80%附近,系統穩定性風險顯著降低。
壓測後期:關閉自動限流,表現與壓測初期一致。