2017年9月22日金曜日

MySQL 8.0 で導入されたリソースグループを試す

MySQL 8.0.3 リリース候補版がリリースされました。
8.0.3はDMR(Developer Milestone Release) ではなく、 RC(リリース候補) でした。正式リリースまで一歩前進。正式リリースが楽しみですね。

8.0.3 ではリソースグループという機能が導入されました。

The purpose of Resource Groups is to decide on the mapping between user/system threads and CPUs. This can be used to split workloads across CPUs to obtain better efficiency and/or performance in some use cases.
リソースグループはMySQLのスレッドを特定のCPUに割り当てることができる機能。
「ワークロードごとに割り当てるCPUを分けることで性能が上がるケースがある」とあるのは、固定することで CPUのキャッシュヒット率が上がるようなケースを指していると思われます。

デフォルトで、以下の2つのリソースグループが設定されている。
RESOURCE_GROUP_TYPEがSYSTEMのものはInnoDBのpurge thread のようなバックグランドスレッドに割り当てられるリソースグループ。

デフォルトではVCPU_IDSが0-3となっていて、すべてのCPUを使う設定になっている。 つまり、特に制限はかかってない状態。

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+------------------------+-----------------------+------+-----+---------+-------+
| Field                  | Type                  | Null | Key | Default | Extra |
+------------------------+-----------------------+------+-----+---------+-------+
| RESOURCE_GROUP_NAME    | varchar(64)           | NO   |     | NULL    |       |
| RESOURCE_GROUP_TYPE    | enum('SYSTEM','USER') | NO   |     | NULL    |       |
| RESOURCE_GROUP_ENABLED | tinyint(1)            | NO   |     | NULL    |       |
| VCPU_IDS               | blob                  | YES  |     | NULL    |       |
| THREAD_PRIORITY        | int(11)               | NO   |     | NULL    |       |
+------------------------+-----------------------+------+-----+---------+-------+

mysql> SELECT * from INFORMATION_SCHEMA.RESOURCE_GROUPS;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default         | USER                |                      1 | 0-3      |               0 |
| SYS_default         | SYSTEM              |                      1 | 0-3      |               0 |
+---------------------+---------------------+------------------------+----------+-----------------+
2 rows in set (0.00 sec)
$ cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

デフォルトリソースグループは消したり、変更したりできない。

mysql> DROP RESOURCE GROUP USR_default;
ERROR 4557 (HY000): Drop operation  operation is disallowed on default resource groups.

mysql> ALTER RESOURCE GROUP USR_default VCPU=0-1;
ERROR 4557 (HY000): Alter operation is disallowed on default resource groups.

mysql> ALTER RESOURCE GROUP USR_default DISABLE;
ERROR 4557 (HY000): Alter operation is disallowed on default resource groups.

CPUを1個しか使わないリソースグループを試しに作ってみる

mysql> CREATE RESOURCE GROUP OneCPU TYPE=USER VCPU=0 ;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * from INFORMATION_SCHEMA.RESOURCE_GROUPS;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default         | USER                |                      1 | 0-3      |               0 |
| SYS_default         | SYSTEM              |                      1 | 0-3      |               0 |
| OneCPU              | USER                |                      1 | 0        |               0 |
+---------------------+---------------------+------------------------+----------+-----------------+
3 rows in set (0.00 sec)
まずは、何もしない状態でsysbench で負荷をかけてみます。 CPU0-3まですべて使われてることがわかります。
$ mpstat -P ALL 1
02:20:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:20:37 PM  all   44.50    0.00    5.50    0.00    0.00    0.00   50.00    0.00    0.00   0.00
02:20:37 PM    0   43.56    0.00    5.94    0.00    0.00    0.00   50.50    0.00    0.00   0.00
02:20:37 PM    1   44.00    0.00    6.00    0.00    0.00    0.00   50.00    0.00    0.00   0.00
02:20:37 PM    2   44.00    0.00    6.00    0.00    0.00    0.00   50.00    0.00    0.00   0.00
02:20:37 PM    3   45.00    0.00    5.00    0.00    0.00    0.00   50.00    0.00    0.00   0.00
次に、OneCPU グループを使うようにsysbench に細工してから実行します。
$ vim /usr/share/sysbench/oltp_read_only.lua
function prepare_statements()
   con:query("SET RESOURCE GROUP oneCPU")

   prepare_point_selects()
意図したとおり、1つのCPU(CPU0だけ)使うようになってますね!
$ mpstat -P ALL 1
02:24:08 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:24:09 PM  all   11.11    0.00    3.28    0.00    0.00    0.00   12.63    0.00    0.00   72.98
02:24:09 PM    0   41.00    0.00    9.00    0.00    0.00    0.00   50.00    0.00    0.00    0.00
02:24:09 PM    1    1.02    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.98
02:24:09 PM    2    1.02    0.00    1.02    0.00    0.00    0.00    0.00    0.00    0.00   97.96
02:24:09 PM    3    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00   97.98

ヒント句でも指定できる。 QueryRewrite プラグインでリソースグループを使うようにヒント句を差し込んで、特定の重い処理を隔離して他への影響を抑える・・・みたいな用途にも使えそう。
1. /*+ RESOURCE_GROUP(resource_group_name) */ -- for executing this SQL query switch the given thread to Resource Group 'name', then switch it back once the query execution is finished.

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。