MySQL8.0新特性——資源管理
參考官方文檔:
https://dev.mysql.com/doc/refman/8.0/en/resource-groups.html
MySQL支持資源組的創建和管理,並允許將服務器內運行的線程分配給特定組,以便線程根據組可用的資源執行。組屬性可以控制其資源,以啟用或限制組中線程的資源消耗。DBA可以根據不同的工作負載修改這些屬性。
目前,CPU時間是可管理的資源,由“ 虛擬CPU ”的概念表示為包括CPU核心,超線程,硬件線程等的術語。服務器在啟動時確定可用的虛擬CPU數量,具有適當權限的數據庫管理員可以將這些CPU與資源組關聯,並將線程分配給組。
例如,要管理不需要以高優先級執行的批處理作業的執行,DBA可以創建 Batch資源組,並根據服務器的繁忙程度向上或向下調整其優先級。(也許分配給該組的批處理作業應該在白天以較低的優先級運行,在夜間以較高的優先級運行。)DBA還可以調整該組可用的CPU集。可以啟用或禁用組來控制線程是否可分配給它們。
1、資源組組件:
這些功能為MySQL中的資源組管理提供了SQL接口:
①:SQL語句支持創建,更改和刪除資源組,並允許將線程分配給資源組。優化程序提示可以將單個語句分配給資源組。
②:資源組權限可控制哪些用戶可以執行資源組操作。
③:該 INFORMATION_SCHEMA.RESOURCE_GROUPS 表公開了有關資源組定義的信息,而Performance Schema threads表顯示了每個線程的資源組分配。
④:狀態變量為每個管理SQL語句提供執行計數。
2.資源組屬性
資源組具有定義組的屬性。可以在創建組時設置所有屬性。某些屬性在創建時被修復; 其他人可以在此後的任何時間修改。
如下屬性在資源組創建時定義,無法修改:
①:每個組都有一個名字。資源組名稱是表和列名稱之類的標識符,除非它們包含特殊字符或保留字,否則無需在SQL語句中引用。組名稱不區分大小寫,最長可達64個字符。
②:每個組都有一個類型,或者是 SYSTEM或者USER。資源組類型會影響可分配給組的優先級值範圍,如稍後所述。此屬性與允許的優先級的差異一起使得能夠識別系統線程,以便保護它們免於針對用戶線程爭用CPU資源。
註意:系統和用戶線程對應於Performance Schema threads表中列出的後臺和前臺線程 。
如下這些屬性在資源組創建時定義,並且可以在以後的任何時間進行修改:
①:CPU親緣關系是資源組可以使用的一組虛擬CPU。親和關系可以是可用CPU的任何非空子集。如果組沒有親和力,則可以使用所有可用的CPU。
②:線程優先級是分配給資源組的線程的執行優先級。優先級值的範圍從-20(最高優先級)到19(最低優先級)。系統組和用戶組的默認優先級均為0。
③:可以啟用或禁用每個組,從而使管理員可以控制線程分配。線程只能分配給已啟用的組。
註意:
系統組的優先級高於用戶組,確保用戶線程的優先級不會高於系統線程:
①:對於系統資源組,允許的優先級範圍是-20到0。
②:對於用戶資源組,允許的優先級範圍是0到19。
3、資源組管理:
默認情況下,有一個系統組和一個用戶組,分別名為SYS_default和 USR_default。無法刪除這些默認組,並且無法修改其屬性。每個默認組都沒有CPU關聯,優先級為0。
註意:
①:新創建的系統和用戶線程分別分配給 SYS_default和 USR_default組。
②:對於用戶定義的資源組,將在創建組時分配所有屬性。創建組後,可以修改其屬性,但名稱和類型屬性除外。
③:創建和管理資源組需要有:RESOURCE_GROUP_ADMIN權限
--查看mysql默認的組:一個用戶組和系統組:
mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS\G *************************** 1. row *************************** RESOURCE_GROUP_NAME: USR_default RESOURCE_GROUP_TYPE: USER RESOURCE_GROUP_ENABLED: 1 VCPU_IDS: 0-0 THREAD_PRIORITY: 0 *************************** 2. row *************************** RESOURCE_GROUP_NAME: SYS_default RESOURCE_GROUP_TYPE: SYSTEM RESOURCE_GROUP_ENABLED: 1 VCPU_IDS: 0-0 THREAD_PRIORITY: 0 2 rows in set (0.01 sec)
其中:THREAD_PRIORITY值是0,表示默認的優先級; VCPU_IDS值示出了包括所有可用CPU的範圍內;對於默認組,顯示的值取決於運行MySQL服務器的系統。
例子:創建一個用戶資源組: CREATE RESOURCE GROUP Batch TYPE = USER VCPU = 2-3 THREAD_PRIORITY = 10; mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS WHERE RESOURCE_GROUP_NAME = 'Batch'\G ---查看這個用戶資源組 *************************** 1. row *************************** RESOURCE_GROUP_NAME: Batch RESOURCE_GROUP_TYPE: USER RESOURCE_GROUP_ENABLED: 1 VCPU_IDS: 2-3 THREAD_PRIORITY: 10
--:要將線程分配給Batch組,請執行以下操作:
SET RESOURCE GROUP Batch FOR thread_id;
--:如果自己的當前線程應該在 Batch組中,請在會話中執行以下語句:
SET RESOURCE GROUP Batch;
(此後,會話中的語句將使用Batch組資源執行 。)
例子2:要使用Batch組執行單個語句 ,請使用 RESOURCE_GROUP優化程序提示:
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
例子3:對於系統高負載的時間,減少分配給組的CPU數量,降低其優先級,或者(如圖所示):
ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = 19;
例子4:在系統負載較輕的情況下,增加分配給組的CPU數量,提高其優先級,或者(如圖所示):
ALTER RESOURCE GROUP Batch VCPU = 0-3 THREAD_PRIORITY = 0;
4、資源組復制
資源組管理是發生它的服務器的本地管理。資源組SQL語句和對resource_groups數據字典表的修改 不會寫入二進制日誌,也不會被復制。
5、資源組的限制:
①:如果安裝了線程池插件,則資源組不可用。
②:資源組在macOS上不可用,它不提供用於將CPU綁定到線程的API。
③:在FreeBSD和Solaris上,忽略資源組線程優先級。(實際上,所有線程都以優先級0運行。)嘗試更改優先級會導致警告:
④:在Linux上,除非CAP_SYS_NICE設置了功能,否則將忽略資源組線程優先級。Linux系統的MySQL軟件包安裝程序應該設置此功能。對於使用壓縮 tar文件二進制分發或從源安裝,CAP_SYS_NICE可以使用setcap 命令手動設置該功能,指定mysqld可執行文件的路徑名 (這需要 sudo訪問)。您可以使用getcap檢查功能。例如:
shell> sudo setcap cap_sys_nice+ep ./bin/mysqld
shell> getcap ./bin/mysqld
./bin/mysqld = cap_sys_nice+ep
⑤:在Windows上,線程以五個線程優先級之一運行。資源組線程優先級範圍-20到19映射到這些級別。
MySQL8.0新特性——資源管理