MySQL 支援建立和管理資源群組,並允許將伺服器內執行的執行緒指派給特定的群組,以便執行緒根據群組可用的資源執行。群組屬性可以控制其資源,以啟用或限制群組中執行緒的資源消耗。資料庫管理員可以根據不同的工作負載修改這些屬性。
目前,CPU 時間是一種可管理的資源,以「“虛擬 CPU”」的概念表示,這個詞彙包含 CPU 核心、超執行緒、硬體執行緒等等。伺服器會在啟動時判斷有多少虛擬 CPU 可用,且具有適當權限的資料庫管理員可以將這些 CPU 與資源群組關聯,並將執行緒指派給群組。
例如,為了管理不需要以高優先順序執行的批次作業,資料庫管理員可以建立一個 Batch
資源群組,並根據伺服器的繁忙程度向上或向下調整其優先順序。(也許指派給群組的批次作業應該在白天以較低的優先順序執行,在晚上以較高的優先順序執行。)資料庫管理員也可以調整群組可用的 CPU 集合。可以啟用或停用群組,以控制是否可將執行緒指派給它們。
以下章節描述了 MySQL 中資源群組使用的各個方面
在某些平台或 MySQL 伺服器組態上,資源群組不可用或有其限制。特別是,Linux 系統可能需要針對某些安裝方法執行手動步驟。如需詳細資訊,請參閱資源群組限制。
這些功能提供 MySQL 中資源群組管理的 SQL 介面
SQL 陳述式可以建立、修改和捨棄資源群組,並允許將執行緒指派給資源群組。最佳化器提示可以將個別陳述式指派給資源群組。
資源群組權限可以控制哪些使用者可以執行資源群組操作。
Information Schema
RESOURCE_GROUPS
表格會公開資源群組定義的相關資訊,而效能架構threads
表格會顯示每個執行緒的資源群組指派。狀態變數提供每個管理 SQL 陳述式的執行計數。
資源群組具有定義群組的屬性。所有屬性都可以在建立群組時設定。某些屬性在建立時是固定的,其他屬性則可以在之後隨時修改。
這些屬性在資源群組建立時定義,且無法修改
每個群組都有一個名稱。資源群組名稱是類似於表格和欄名稱的識別符號,除非它們包含特殊字元或保留字,否則不需要在 SQL 陳述式中加上引號。群組名稱不區分大小寫,且長度最多可達 64 個字元。
每個群組都有一個類型,可以是
SYSTEM
或USER
。資源群組類型會影響可指派給群組的優先權值範圍,如稍後所述。此屬性連同允許優先權的差異,可以識別系統執行緒,以保護它們免受使用者執行緒的 CPU 資源競爭。系統和使用者執行緒對應於效能架構
threads
表格中所列的背景和前景執行緒。
這些屬性在資源群組建立時定義,且之後可以隨時修改
CPU 親和性是資源群組可以使用的虛擬 CPU 集合。親和性可以是可用 CPU 的任何非空子集。如果群組沒有親和性,則可以使用所有可用的 CPU。
執行緒優先權是指派給資源群組的執行緒的執行優先權。優先權值範圍從 -20 (最高優先權) 到 19 (最低優先權)。系統群組和使用者群組的預設優先權皆為 0。
系統群組允許比使用者群組更高的優先權,確保使用者執行緒永遠不會比系統執行緒具有更高的優先權
對於系統資源群組,允許的優先權範圍為 -20 到 0。
對於使用者資源群組,允許的優先權範圍為 0 到 19。
每個群組都可以啟用或停用,讓管理員可以控制執行緒指派。執行緒只能指派給已啟用的群組。
預設情況下,有一個名為 SYS_default
的系統群組和一個名為 USR_default
的使用者群組。這些預設群組無法刪除,且其屬性也無法修改。每個預設群組都沒有 CPU 親和性,且優先權為 0。
新建立的系統和使用者執行緒會分別指派給 SYS_default
和 USR_default
群組。
對於使用者定義的資源群組,所有屬性都會在建立群組時指派。建立群組後,除了名稱和類型屬性外,其屬性可以修改。
若要建立和管理使用者定義的資源群組,請使用這些 SQL 陳述式
這些陳述式需要 RESOURCE_GROUP_ADMIN
權限。
若要管理資源群組指派,請使用這些功能
SET RESOURCE GROUP
會將執行緒指派給群組。請參閱第 15.7.2.4 節,「SET RESOURCE GROUP 陳述式」。RESOURCE_GROUP
最佳化工具提示會將個別陳述式指派給群組。請參閱第 10.9.3 節,「最佳化工具提示」。
這些操作需要 RESOURCE_GROUP_ADMIN
或 RESOURCE_GROUP_USER
權限。
資源群組定義會儲存在 resource_groups
資料字典表格中,以便群組在伺服器重新啟動後仍保持存在。由於 resource_groups
是資料字典的一部分,因此使用者無法直接存取它。資源群組資訊可使用資訊架構 RESOURCE_GROUPS
表格取得,該表格是以資料字典表格的檢視形式實作的。請參閱第 28.3.26 節,「INFORMATION_SCHEMA RESOURCE_GROUPS 表格」。
最初,RESOURCE_GROUPS
表格具有描述預設群組的這些列
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-3
THREAD_PRIORITY: 0
*************************** 2. row ***************************
RESOURCE_GROUP_NAME: SYS_default
RESOURCE_GROUP_TYPE: SYSTEM
RESOURCE_GROUP_ENABLED: 1
VCPU_IDS: 0-3
THREAD_PRIORITY: 0
THREAD_PRIORITY
值為 0,表示預設優先權。VCPU_IDS
值顯示包含所有可用 CPU 的範圍。對於預設群組,顯示的值會因執行 MySQL 伺服器的系統而異。
先前的討論提及一個涉及名為 Batch
的資源群組的案例,用於管理不需要以高優先權執行的批次作業執行。若要建立此類群組,請使用類似於以下的陳述式
CREATE RESOURCE GROUP Batch
TYPE = USER
VCPU = 2-3 -- assumes a system with at least 4 CPUs
THREAD_PRIORITY = 10;
若要驗證資源群組是否如預期建立,請檢查 RESOURCE_GROUPS
表格
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
如果 THREAD_PRIORITY
值為 0 而不是 10,請檢查您的平台或系統設定是否限制資源群組功能;請參閱資源群組限制。
若要將執行緒指派給 Batch
群組,請執行以下操作
SET RESOURCE GROUP Batch FOR thread_id;
之後,具名執行緒中的陳述式會使用 Batch
群組資源執行。
如果工作階段本身的目前執行緒應位於 Batch
群組中,請在工作階段中執行此陳述式
SET RESOURCE GROUP Batch;
之後,工作階段中的陳述式會使用 Batch
群組資源執行。
若要使用 Batch
群組執行單一陳述式,請使用 RESOURCE_GROUP
最佳化工具提示
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
指派給 Batch
群組的執行緒會使用其資源執行,這些資源可以根據需要修改
在系統負載過高時,請減少指派給群組的 CPU 數量、降低其優先權,或 (如所示) 兩者皆執行
ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = 19;
在系統負載較低時,請增加指派給群組的 CPU 數量、提高其優先權,或 (如所示) 兩者皆執行
ALTER RESOURCE GROUP Batch VCPU = 0-3 THREAD_PRIORITY = 0;
在某些平台或 MySQL 伺服器設定上,資源群組不可用或具有限制
如果已安裝執行緒集區外掛程式,則資源群組不可用。
資源群組在 macOS 上不可用,因為該系統未提供將 CPU 繫結至執行緒的 API。
在 FreeBSD 和 Solaris 上,會忽略資源群組執行緒優先權。(實際上,所有執行緒都以優先權 0 執行。)嘗試變更優先權會導致警告
mysql> ALTER RESOURCE GROUP abc THREAD_PRIORITY = 10; Query OK, 0 rows affected, 1 warning (0.18 sec) mysql> SHOW WARNINGS; +---------+------+-------------------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------------------+ | Warning | 4560 | Attribute thread_priority is ignored (using default value). | +---------+------+-------------------------------------------------------------+
在 Linux 上,除非設定
CAP_SYS_NICE
功能,否則會忽略資源群組執行緒優先權。授予程序CAP_SYS_NICE
功能會啟用一系列權限;請參閱 http://man7.org/linux/man-pages/man7/capabilities.7.html 以取得完整清單。啟用此功能時請小心。在使用 systemd 和核心支援 Ambient Capabilities (Linux 4.3 或更新版本) 的 Linux 平台上,啟用
CAP_SYS_NICE
功能的建議方式是修改 MySQL 服務檔案,並保持 mysqld 二進位檔不修改。若要調整 MySQL 的服務檔案,請使用此程序針對您的平台執行適當的命令
Oracle Linux、Red Hat 和 Fedora 系統
$> sudo systemctl edit mysqld
SUSE、Ubuntu 和 Debian 系統
$> sudo systemctl edit mysql
使用編輯器,將以下文字新增至服務檔案
[Service] AmbientCapabilities=CAP_SYS_NICE
重新啟動 MySQL 服務。
如果您無法如上述說明啟用
CAP_SYS_NICE
功能,可以使用 setcap 命令手動設定該功能,指定 mysqld 可執行檔的路徑名稱 (這需要 sudo 存取權)。您可以使用 getcap 來檢查功能。例如$> sudo setcap cap_sys_nice+ep /path/to/mysqld $> getcap /path/to/mysqld /path/to/mysqld = cap_sys_nice+ep
作為安全措施,請將 mysqld 二進位檔的執行限制為
root
使用者和具有mysql
群組成員資格的使用者$> sudo chown root:mysql /path/to/mysqld $> sudo chmod 0750 /path/to/mysqld
重要事項如果需要手動使用 setcap,則必須在每次重新安裝後執行。
在 Windows 上,執行緒會以五個執行緒優先權等級之一執行。資源群組執行緒優先權範圍 -20 到 19 會對應到下表所示的這些等級。
表 7.6 Windows 上的資源群組執行緒優先權
優先權範圍 Windows 優先權等級 -20 到 -10 THREAD_PRIORITY_HIGHEST
-9 到 -1 THREAD_PRIORITY_ABOVE_NORMAL
0 THREAD_PRIORITY_NORMAL
1 到 10 THREAD_PRIORITY_BELOW_NORMAL
11 到 19 THREAD_PRIORITY_LOWEST