文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

7.1.16 資源群組

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

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

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

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

重要事項

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

資源群組元素

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

  • SQL 陳述式可以建立、修改和捨棄資源群組,並允許將執行緒指派給資源群組。最佳化器提示可以將個別陳述式指派給資源群組。

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

  • Information Schema 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 是資料字典的一部分,因此使用者無法直接存取它。資源群組資訊可使用資訊架構 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 和核心支援 Ambient Capabilities (Linux 4.3 或更新版本) 的 Linux 平台上,啟用 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