MySQL 8.0.3 リリース候補版がリリースされました。
8.0.3はDMR(Developer Milestone Release) ではなく、 RC(リリース候補) でした。正式リリースまで一歩前進。正式リリースが楽しみですね。
「ワークロードごとに割り当てるCPUを分けることで性能が上がるケースがある」とあるのは、固定することで CPUのキャッシュヒット率が上がるようなケースを指していると思われます。
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.