MySQL では、リソースグループの作成および管理がサポートされており、グループで使用可能なリソースに従ってスレッドが実行されるように、サーバー内で実行されているスレッドを特定のグループに割り当てることができます。 グループ属性を使用すると、そのリソースを制御して、グループ内のスレッドによるリソース消費を有効にしたり制限したりすることができます。 DBA は、様々なワークロードに応じてこれらの属性を変更できます。
>現在、CPU 時間は管理可能なリソースであり、CPU コア、ハイパースレッド、ハードウェアスレッドなどを含む用語として「「仮想 CPU」」の概念で表現されています。 サーバーは起動時に使用可能な仮想 CPU の数を決定し、適切な権限を持つデータベース管理者はこれらの CPU をリソースグループに関連付け、スレッドをグループに割り当てることができます。
たとえば、高優先度で実行する必要のないバッチジョブの実行を管理するために、DBA は Batch
リソースグループを作成し、サーバーのビジー状態に応じて優先度を上下に調整できます。 (おそらく、グループに割り当てられたバッチジョブは、日中は低い優先度で実行し、夜間は高い優先度で実行する必要があります。) DBA は、グループで使用可能な 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
グループに割り当てられます。
ユーザー定義のリソースグループの場合、すべての属性はグループの作成時に割り当てられます。 グループを作成した後は、name 属性と type 属性を除き、その属性を変更できます。
ユーザー定義リソースグループを作成および管理するには、次の SQL ステートメントを使用します:
CREATE RESOURCE GROUP
により、新しいグループが作成されます。 セクション13.7.2.2「CREATE RESOURCE GROUP ステートメント」を参照してください。ALTER RESOURCE GROUP
は、既存のグループを変更します。 セクション13.7.2.1「ALTER RESOURCE GROUP ステートメント」を参照してください。DROP RESOURCE GROUP
は、既存のグループを削除します。 セクション13.7.2.3「DROP RESOURCE GROUP ステートメント」を参照してください。
これらのステートメントには RESOURCE_GROUP_ADMIN
権限が必要です。
リソースグループ割当を管理するには、次の機能を使用します:
SET RESOURCE GROUP
は、スレッドをグループに割り当てます。 セクション13.7.2.4「SET RESOURCE GROUP ステートメント」を参照してください。RESOURCE_GROUP
オプティマイザヒントは、個々のステートメントをグループに割り当てます。 セクション8.9.3「オプティマイザヒント」を参照してください。
これらの操作には、RESOURCE_GROUP_ADMIN
または RESOURCE_GROUP_USER
権限が必要です。
リソースグループ定義は、サーバーの再起動後もグループが保持されるように、resource_groups
データディクショナリテーブルに格納されます。 resource_groups
はデータディクショナリの一部であるため、ユーザーは直接アクセスできません。 リソースグループ情報は、データディクショナリテーブルのビューとして実装される INFORMATION_SCHEMA.RESOURCE_GROUPS
テーブルを使用して使用できます。 セクション26.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
値が 10 ではなく 0 の場合は、プラットフォームまたはシステム構成によってリソースグループの機能が制限されているかどうかを確認します。リソースグループの制限 を参照してください。
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 サーバー構成では、リソースグループは使用できないか、制限があります:
-
スレッドプールプラグインがインストールされている場合、リソースグループは使用できません。
リソースグループは、CPU をスレッドにバインドする API を提供しない macOS では使用できません。
-
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 4.3 以降) のサポートを使用する Linux プラットフォームでは、
CAP_SYS_NICE
機能を有効にするには、MySQL サービスファイルを変更し、mysqld バイナリを変更しないでおくことをお薦めします。 MySQL のサービスファイルを調整するには、この手順を使用します:-
ご使用のプラットフォームに適したコマンドを実行します:
-
Oracle Linux、Red Hat および Fedora システム:
shell> sudo systemctl edit mysqld
-
SUSE、Ubuntu および Debian システム:
shell> sudo systemctl edit mysql
-
-
エディタを使用して、次のテキストをサービスファイルに追加します:
[Service] AmbientCapabilities=CAP_SYS_NICE
MySQL サービスを再起動します。
前述のように
CAP_SYS_NICE
機能を有効にできない場合は、mysqld 実行可能ファイルへのパス名を指定して、setcap コマンドを使用して手動で設定できます (sudo アクセスが必要です)。 getcap を使用して機能を確認できます。 例:shell> sudo setcap cap_sys_nice+ep /path/to/mysqld shell> getcap /path/to/mysqld /path/to/mysqld = cap_sys_nice+ep
安全対策として、mysqld バイナリの実行を
root
ユーザーおよびmysql
グループメンバーシップを持つユーザーに制限します:shell> sudo chown root:mysql /path/to/mysqld shell> sudo chmod 0750 /path/to/mysqld
重要setcap を手動で使用する必要がある場合は、再インストールのたびに実行する必要があります。
-
-
Windows では、スレッドは 5 つのスレッド優先度レベルのいずれかで実行されます。 -20 から 19 のリソースグループスレッド優先順位の範囲は、次のテーブルに示すレベルにマップされます。
表 5.5 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