MySQL 支援建立和管理資源群組,並允許將伺服器內執行的執行緒指派給特定的群組,使執行緒根據群組可用的資源執行。群組屬性可控制其資源,以啟用或限制群組中執行緒的資源消耗。資料庫管理員可以根據不同的工作負載修改這些屬性。
目前,CPU 時間是可管理的資源,以 「虛擬 CPU」 的概念表示,該術語包括 CPU 核心、超執行緒、硬體執行緒等等。伺服器在啟動時會判斷有多少虛擬 CPU 可用,具有適當權限的資料庫管理員可以將這些 CPU 與資源群組關聯,並將執行緒指派給群組。
例如,為了管理不需要以高優先順序執行的批次作業,資料庫管理員可以建立一個 Batch
資源群組,並根據伺服器的忙碌程度上下調整其優先順序。(也許指派給該群組的批次作業應該在白天以較低的優先順序執行,在晚上以較高的優先順序執行。) 資料庫管理員也可以調整群組可用的 CPU 集合。可以啟用或停用群組,以控制是否可將執行緒指派給它們。
以下章節描述 MySQL 中資源群組使用的各個方面
在某些平台或 MySQL 伺服器設定上,資源群組可能不可用或有限制。特別是,Linux 系統可能需要針對某些安裝方法進行手動步驟。詳細資訊請參閱資源群組限制。
這些功能為 MySQL 中的資源群組管理提供 SQL 介面
SQL 陳述式允許建立、變更和刪除資源群組,並允許將執行緒指派給資源群組。最佳化工具提示允許將個別陳述式指派給資源群組。
資源群組權限可控制哪些使用者可以執行資源群組操作。
資訊綱要
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
是資料字典的一部分,因此使用者無法直接存取。資源群組資訊可使用 Information Schema 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 且核心支援環境功能的 Linux 平台(Linux 4.3 或更新版本)上,啟用
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