目次
LightsailにデプロイしているWebサービスのレスポンスが妙に遅くてサーバのメトリクスを確認したらMySQLのCPU使用率が200%超えてました。
100%って超えられるもんなんですね。自分で限界を決めちゃ駄目だなと思いました。

この記事は上記の問題の原因を調べた記事になります。
原因はCPUクレジットの枯渇
結論から言いますとCPUクレジットが枯渇してました。
CPUクレジットとはAWSの用語で、CPUのフルパワーを使うために必要なポイントみたいなもんです。
仕組みとしてはソーシャルゲームのスタミナに近いかもしれません。
そのCPUクレジットを使い切ってしまって使えるCPUパワーが20%に制限されていました。
CPUクレジットとベースライン使用率
AWSのt系のインスタンスはランニングコストが安い代わりにCPUクレジットとベースライン使用率という仕組みがあります。
(今回使用していたLightsailは内部的にはt2インスタンスらしいです。)
以下の画像はLightsailのCPU使用率のグラフです。
20%の高さにラインがあり、それ以上はオレンジ色で「バースト可能ゾーン」となっています。
これはCPU使用率が20%を超えるとCPUクレジットを消費する事を表しています。
この20%のラインの事をベースライン使用率と呼びます。

続いて、CPUクレジットの残高のグラフです。
変動が少なくて分かりにくいですが、CPU使用率が20%を超えている時間が多いためCPUクレジットが消費されていってます。(右肩下がりに減ってます)
このCPUクレジットが枯渇すると、CPU使用率が20%を超えられなくなります。
なお、CPUクレジットは時間で回復します。(まんまソシャゲのスタミナですね)

以下は、t2インスタンスのCPUクレジットとベースライン使用率の一覧です。
インスタンスサイズに応じて1時間あたりに貰えるCPUクレジットとベースライン使用率が異なる事が分かります。

まとめ
Lightsailやt系インスタンスを使うときはCPUクレジットとベースライン使用率に留意しましょう!
余談
CPUクレジットが枯渇した時のvmstat
の表示は、cpuのst(Stolen Time)が71や69と言った高い数値を示していました。
これは「ゲストOSがリソース要求を行ったにもかかわらずCPUリソースを割り当ててもらえなかった時間の割合」だそうです。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st UTC
8 3 0 71512 0 158832 0 0 1444 1098 19 67 12 4 48 28 9 2020-09-27 11:26:45
10 1 0 77492 0 152984 0 0 14488 194 380 1992 26 3 0 0 71 2020-09-27 11:26:47
12 0 0 76536 0 153888 0 0 12074 230 427 2190 25 6 0 0 69 2020-09-27 11:26:49
以上です!
Webエンジニアをやっています
UX/UIデザインからプログラミング、DB設計、SEO、インフラ構築など幅広く対応してます
PHP/PHPUnit/Laravel/Vue/Nuxt/Docker/Terraform
ご連絡はTwitterのDMまで。