做好數據庫運維,資源管理技術必須要掌握


摘要:通過引入資源監控和控制等手段,實現資源在可控的情況下被合理利用的目的,避免出現資源的無序使用,防止數據庫系統性能變慢、停止響應。

1 資源管理是什么?

1.1 資源管理簡介

通過引入資源監控和控制等手段,實現資源在可控的情況下被合理利用的目的,避免出現資源的無序使用,防止數據庫系統性能變慢、停止響應。資源管理可以實現以下功能:

  1. 通過創建和管理隊列,實現隊列級別資源(CPU、內存、存儲空間)隔離和作業的異常處理;
  2. 通過設置CN和隊列的並發上限,限制允許運行的並發數,超出並發數后作業排隊等待喚醒,防止並發過多導致性能下降;
  3. 通過優先級控制實現資源的有效調度,實現高優先級作業優先運行;
  4. 支持多維度資源監控視圖,可以監控作業、用戶和實例的資源消耗。

1.2 資源管理功能

資源管理主要包含並發控制、資源管控、資源監控以及異常作業處理。並發控制主要分為全局並發控制和資源池並發控制,其中資源池並發管控由快慢車道實現,快車道管控簡單作業,慢車道管控復雜作業,支持自動識別和手動切換快慢車道,理論上快車道並發大、作業運行時間短、占用資源少;慢車道並發少、作業運行時間長,占用資源多。

資源管控通過對計算資源和存儲資源分別管控實現作業間資源隔離,保證單作業異常不會影響到其他作業運行。下面分別對計算資源和存儲資源管控進行概述:

(1)計算資源

計算資源包含:CPU、IO和內存。GaussDB中CPU和內存資源關聯在隊列上,用戶通過關聯隊列使用計算資源。隊列按使用場景分為超戶隊列、默認隊列和用戶隊列。其中超戶隊列不受資源管控,用於運維和故障修復;默認隊列(default_pool)為數據庫初始化階段創建的隊列,未關聯用戶隊列的用戶使用默認隊列;用戶隊列為用戶自己創建的隊列,按照用戶配置的並發和資源進行管控。IO管控基於邏輯IO實現,根據作業運行時間及優先級對IO進行管控,配置異常處理規則后,在系統IO達到瓶頸后,主動降低作業IO優先級。

(2)存儲資源

存儲資源管控包含以下幾個方面:

  • 數據庫只讀檢測

數據庫只讀檢測主要為防止出現磁盤滿的問題,實現邏輯如下:cm_server開啟enable_transaction_read_only情況下,每十分鍾檢查一次磁盤空間占用率,當 磁盤空間占用率超過閾值(默認90%)時,就通過guc參數設置數據庫只讀,數據庫只讀后只允許只讀作業運行,作業發生寫盤操作報錯退出。但是因為數據庫只讀會導致用戶所有業務無法運行,因此在磁盤空間占用率達到80%時會提前告警提示用戶。

  • 用戶/schema空間管控

存儲資源包含:持久表空間、臨時表空間和算子落盤空間。臨時表空間和算子落盤空間是作業運行過程中占用的空間,屬於臨時占用空間。持久表空間和臨時占 用空間采用兩種不同的管控策略,持久表空間管控通過對用戶(隊列)和schema空間限制實現,8.1.1版本之后的GaussDB空間管控均為單實例空間,防止出現數據傾斜導致的磁盤使用問題。臨時占用空間同樣支持在用戶層級設置空間限額,另外還提供異常規則查殺臨時空間占用異常的作業。

  • 異常處理規則

GaussDB目前支持算子落盤異常規則,用戶通過管控面或gs_cgroup工具設置算子落盤異常規則,設置異常規則后作業執行過程中算子落盤空間達到閾值后報錯退出。

1.3 資源管理框架

用戶連接數據庫執行SQL后,SQL會經過全局並發隊列管控以及資源池隊列管控。在作業進入管控邏輯前設置定時器,作業pending超時報錯退出,作業經過隊列管控開始運行前重新設置定時器,作業運行超時報錯退出。作業下推DN執行時實時監控作業消耗的資源並上報CN,CN根據DN上報資源信息提供異常處理和監控視圖。

下面對並發、內存和CPU管控配置方式進行簡要說明:

(1)全局並發隊列

全局並發隊列采用GUC參數max_active_statements控制單個CN上運行並發執行的作業數量。采用全局並發隊列機制將控制所有普通用戶的執行作業,不區分復雜度,即執行語句都將作為一個執行單元,當並發執行的作業數量達到此參數閾值時,將進入隊列等待。對於初始用戶(Oid=10)執行的作業,不走全局並發控制邏輯。

注:max_active_statements限制單CN上運行的作業數,默認值為60,假設用戶有3個DN,則實際全局並發上限為3*60=180;

DDL和DML語句均受max_active_statements並發控制。

(2)資源池並發隊列

資源池並發隊列包含快車道並發隊列和慢車道並發隊列,配置方式如下:

CREATE RESOURCE POOL respool_a WITH (max_dop=10,active_statements=5);

其中max_dop為快車道並發上限,active_statements為慢車道並發上限。

注:資源池隊列只限制DML語句,不限制DDL語句;

max_dop限制單CN上資源池快車道並發數;

active_statements在靜態負載管理模式下限制單CN上資源池慢車道並發數,在動態負載管理模式下限制所有CN上資源池慢車道並發數之

(3)內存管控

實例級別內存管控:guc參數max_process_memory限制DN和CN實例的最大可用內存,當使用內存超過max_process_memory時,作業報錯退出;

可動態申請內存:max_dynamic_memory=max_process_memory-cstore_buffers(max_cstore_memory)-(udf_memory_limit - 200M) - max_shared_memory;

資源池內存管控:使用並發點數計算可執行的並發數量,active_statements<=0情況下資源池內存不受控。資源池總點數:total_points = active_statements * 100,作業使用點數:active_points = (estimate_mem/respool_mem) * active_statements * 100,estimate_mem為優化器估算的作業內存,資源池點數耗盡出發排隊。

(4)CPU管控

GaussDB主要利用cgroups做cpu資源的管控,涉及cpu、cpuacct、cpuset子系統,cpu配額管控基於cpu子系統的cpu.shares實現,該配置方法的好處是:OS cpu沒有占滿的情況下,不觸發cpu管控;cpu限額管控基於cpuset實現;cpuacct子系統主要用於cpu資源使用的監控。

使用gs_cgroup工具設置cpu限額和配額,gs_cgroup工具常用命令如下:

  • root用戶掛載cgroup

gs_cgroup -U user -d #刪除當前掛載信息

gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

  • 創建Class控制組

gs_cgroup -S class1 -s 40 -c

  • 創建Workload控制組

gs_cgroup -S class 1 -G wg1 -c

  • 為控制組分配cpu配額

gs_cgroup -S class 1 -G wg1 -g 20 -u

  • 設置cpu限額

gs_cgroup -S class 1 -G wg1 -g 30 -u –fixed

  • 刪除控制組

gs_cgroup -S class 1 -G wg1 -d

  • 查看控制組信息

gs_cgroup -p #靜態配置文件信息

gs_cgroup -P #掛載信息(樹形結構)

  • 查詢規則

設置查詢規則

gs_cgroup -S class -G wg -E "blocktime=1200,elapsedtime=2400" –a

gs_cgroup -S class -G wg -E "spillsize=256,broadcastsize=100" –a

gs_cgroup -S class -E "allcputime=100" –penalty

gs_cgroup -S class -E "qualificationtime=2400,cpuskewpercnt=90

查詢異常規則

select gs_respool_exception_info('rp_name')。

cpu管控原理:

  • cgroup掛載:使用root用戶掛載cgroup;

gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

  • cgroup創建:使用數據庫安裝用戶創建cgroup;

gs_cgroup -S class1 -G wg1 -c

  • cgroup關聯資源池:創建組資源池pr1關聯class控制組class1,創建業務資源池resp1關聯workload控制組wg1

CREATE RESOURCE POOL pr1 WITH(CONTROL_GROUP='class1');

CREATE RESOURCE POOL resp1 WITH(CONTROL_GROUP='class1:wg1');

  • 用戶關聯資源池:創建組用戶role1關聯組資源池pr1,創建業務用戶usr1關聯業務資源池resp1

CREATE ROLE role1 RESOURCE POOL 'pr1' PASSWORD disable;

CREATE USER usr1 RESOURCE POOL 'resp1' PASSWORD 'Gauss_234' USER GROUP 'role1';

  • 使用業務用戶usr1執行復雜作業,作業執行過程中調用api函數cgroup_attach_task將作業attach到class1:wg1控制組上實現cpu管控。

 本文分享自華為雲社區《GaussDB(DWS) 資源管理技術淺析》,原文作者:門前一棵葡萄樹 。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM