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

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

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

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管控。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章