RDS for MySQL（8.0.30 以降）で Optimized Writes を試してみた

こちらは **[MySQL Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mysql)** 21 日目の記事です。

昨日は ryuichi1208 さんでした。

- **[【RDS】RDSでBlue/Greenデプロイ！すごい！！すごい！！！！(色々修正版)](https://ryuichi1208.hateblo.jp/entry/2022/11/30/010158)**

https://ryuichi1208.hateblo.jp/entry/2022/11/30/010158

---

AWS の re:Invent の前後に、今年もいろいろな新サービスや改良などが発表されていますが、RDS for MySQL 関連では、

- **[Amazon RDS Optimized Reads で、Amazon RDS for MySQL のクエリが最大 50% 高速化](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-optimized-reads-available-faster-queries-amazon-rds-mysql/)**

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-optimized-reads-available-faster-queries-amazon-rds-mysql/

- **[Amazon RDS Optimized Writes により、追加料金なしで書き込みスループットが最大 2 倍に](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-optimized-writes-2x-higher-write-throughput-no-cost/)**

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-optimized-writes-2x-higher-write-throughput-no-cost/

がありました。

このうち、前者（Read 高速化）は検証が難しそうなので、後者（Write 高速化）を少しだけ試してみました。

## RDS Optimized Writes とは？

通常、MySQL ではストレージへの書き込み時に（障害対策のため）Double Write Buffer を使って二重に書き込みを行うのですが、これをクラウド基盤側（Nitro System）にオフロードして 1 回の書き込みで済ませてしまおう、という機能のようです。

:::note
「クラウド基盤側にオフロードする」といっても基盤側で二重書き込みするわけではなく、二重書き込みの代わりに「データページ単位でアトミックな書き込みができるようにする」という意味です。
:::

現時点（2022/12/20）では
- RDS for MySQL 8.0.30 以降

で、

- db.r6i
- db.r5b

のインスタンスのみ対応、とのことです（東京で使えるのは後者だけ）。

今回は db.r5b インスタンスを使って試してみました。

## 試した内容

- db.r5b.large（2vCPU Mem:16GiB）Single-AZ に対して`mysqlslap`で負荷を掛ける
- `mysqlslap`では`mixed`タイプ（読み書き両方）の負荷を 150・300・450 スレッドで
  - 追加で`write`（書き込みのみ）タイプの負荷も 450 スレッドで
- パラメーター`rds.optimized_writes`を`AUTO`（デフォルト）・`OFF`の状態で比較
  - 前者が Optimized Writes 有効（基盤へオフロード）、後者が無効（従来どおり DB 本体で二重書き込み）

### マネジメントコンソールでの設定（画面の一部）

![スクリーンショット 2022-12-20 18.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/97d248a9-1937-a8f4-f251-320566d2abc6.png)

RDS の MySQL インスタンスを作る際のマネジメントコンソールに、Optimized Writes に関する項目が見えていますね。

2022/11 からストレージとして gp3 が使えるようになっています。

- **[Amazon RDS が新しい汎用 gp3 ストレージボリュームのサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-general-purpose-gp3-storage-volumes/)**

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-general-purpose-gp3-storage-volumes/

EC2 コンピューティングリソースへの接続は、2022/8 に追加された機能（設定を楽にする項目）のようです。

- **[Amazon RDS が RDS データベースと EC2 コンピューティングインスタンス間のワンクリック接続セットアップをサポート](https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-rds-setting-up-connectivity-rds-database-ec2-compute-instance-1-click/)**

https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-rds-setting-up-connectivity-rds-database-ec2-compute-instance-1-click/

## 結果

3 回実行したうちの平均を取りました。

※数値は所要時間（秒）です。

- **mixed（読み書き両方）**

```sh:mysqlslap(mixed)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=【スレッド数】 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=mixed -u admin -h 【エンドポイント】 -p
```

rds.optimized_writes | 150 スレッド | 300 スレッド | 450 スレッド |
:--------------------|----------:|----------:|----------:|
a. AUTO | 59.069 | 127.198 | 213.588 |
b. OFF  | 60.430 | 131.648 | 218.756 |
(b / a) | 1.02   | 1.03    | 1.02    |

かなり微妙な結果ですね。

- **write（書き込みのみ）**

```sh:mysqlslap(mixed)
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=【スレッド数】 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=write -u admin -h 【エンドポイント】 -p
```

rds.optimized_writes | 450 スレッド |
:--------------------|----------:|
a. AUTO | 262.810 |
b. OFF  | 270.420 |
(b / a) | 1.03    |

やはり微妙でした。

もう少し大きめのインスタンスを使って高い書き込み負荷を掛けないと実力が発揮できないのかもしれません。

---

明日は knktknk さんです。

- **[MySQLで更新した行を確認する](https://qiita.com/knktknk/items/158f680e1678c6b4ff51)**

https://qiita.com/knktknk/items/158f680e1678c6b4ff51