文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  資源群組

7.1.16 資源群組

MySQL 支援建立和管理資源群組,並允許將伺服器內執行的執行緒指派給特定的群組,使執行緒根據群組可用的資源執行。群組屬性可控制其資源,以啟用或限制群組中執行緒的資源消耗。資料庫管理員可以根據不同的工作負載修改這些屬性。

目前,CPU 時間是可管理的資源,以 虛擬 CPU 的概念表示,該術語包括 CPU 核心、超執行緒、硬體執行緒等等。伺服器在啟動時會判斷有多少虛擬 CPU 可用,具有適當權限的資料庫管理員可以將這些 CPU 與資源群組關聯,並將執行緒指派給群組。

例如,為了管理不需要以高優先順序執行的批次作業,資料庫管理員可以建立一個 Batch 資源群組,並根據伺服器的忙碌程度上下調整其優先順序。(也許指派給該群組的批次作業應該在白天以較低的優先順序執行,在晚上以較高的優先順序執行。) 資料庫管理員也可以調整群組可用的 CPU 集合。可以啟用或停用群組,以控制是否可將執行緒指派給它們。

以下章節描述 MySQL 中資源群組使用的各個方面

重要

在某些平台或 MySQL 伺服器設定上,資源群組可能不可用或有限制。特別是,Linux 系統可能需要針對某些安裝方法進行手動步驟。詳細資訊請參閱資源群組限制

資源群組元素

這些功能為 MySQL 中的資源群組管理提供 SQL 介面

  • SQL 陳述式允許建立、變更和刪除資源群組,並允許將執行緒指派給資源群組。最佳化工具提示允許將個別陳述式指派給資源群組。

  • 資源群組權限可控制哪些使用者可以執行資源群組操作。

  • 資訊綱要RESOURCE_GROUPS表格會公開關於資源群組定義的資訊,而效能綱要threads表格會顯示每個執行緒的資源群組指派。

  • 狀態變數會提供每個管理 SQL 陳述式的執行計數。

資源群組屬性

資源群組具有定義群組的屬性。所有屬性都可以在群組建立時設定。某些屬性在建立時會固定;其他屬性可以在其後隨時修改。

這些屬性在資源群組建立時定義,且無法修改

  • 每個群組都有一個名稱。資源群組名稱是類似表格和欄名稱的識別碼,除非它們包含特殊字元或保留字,否則不需要在 SQL 陳述式中加上引號。群組名稱不區分大小寫,且長度最多可以為 64 個字元。

  • 每個群組都有一個類型,可以是 SYSTEMUSER。資源群組類型會影響可指派給群組的優先順序值範圍,如下所述。此屬性以及允許優先順序的差異使得能夠識別系統執行緒,以便保護它們免受使用者執行緒的 CPU 資源爭用。

    系統和使用者執行緒對應於效能綱要threads表格中列出的背景和前景執行緒。

這些屬性在資源群組建立時定義,且可以在其後隨時修改

  • CPU 親和性是指資源群組可以使用的虛擬 CPU 集合。親和性可以是可用 CPU 的任何非空子集。如果群組沒有親和性,則可以使用所有可用的 CPU。

  • 執行緒優先權是指定給資源群組的執行緒的執行優先級。優先權值範圍從 -20(最高優先級)到 19(最低優先級)。系統群組和使用者群組的預設優先級均為 0。

    系統群組允許比使用者群組更高的優先級,確保使用者執行緒永遠不會比系統執行緒具有更高的優先級。

    • 對於系統資源群組,允許的優先級範圍為 -20 到 0。

    • 對於使用者資源群組,允許的優先級範圍為 0 到 19。

  • 每個群組都可以啟用或停用,讓管理員可以控制執行緒的指派。執行緒只能指派給已啟用的群組。

資源群組管理

預設情況下,有一個名為 SYS_default 的系統群組和一個名為 USR_default 的使用者群組。這些預設群組不能被刪除,並且其屬性不能被修改。每個預設群組都沒有 CPU 親和性,優先級為 0。

新建立的系統和使用者執行緒分別指派給 SYS_defaultUSR_default 群組。

對於使用者定義的資源群組,所有屬性都在建立群組時指派。建立群組後,其屬性可以修改,但名稱和類型屬性除外。

若要建立和管理使用者定義的資源群組,請使用以下 SQL 語句

這些語句需要 RESOURCE_GROUP_ADMIN 權限。

若要管理資源群組的指派,請使用以下功能

這些操作需要 RESOURCE_GROUP_ADMINRESOURCE_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;

資源群組複寫

資源群組管理是伺服器本機發生的。資源群組 SQL 語句和對 resource_groups 資料字典資料表的修改不會寫入二進位日誌,也不會進行複寫。

資源群組限制

在某些平台或 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 的服務檔案,請使用此程序

    1. 執行適用於您平台的指令

      • Oracle Linux、Red Hat 和 Fedora 系統

        $> sudo systemctl edit mysqld
      • SUSE、Ubuntu 和 Debian 系統

        $> sudo systemctl edit mysql
    2. 使用編輯器,將以下文字新增至服務檔案

      [Service]
      AmbientCapabilities=CAP_SYS_NICE
    3. 重新啟動 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