MackerelのMySQL Threadsの見方

会社でMackerelを使ってMysqlサーバーの監視を行っているのですが、Mysql Threadsの見方が初めはさっぱり分からなかったので、自分で調べたり、先輩に聞いたりして得た自分の理解を残しておこうと思います。

メトリック

Mysql Threadsのグラフには5つのメトリックが表示されます。

  • Cache Size
  • Connected
  • Running
  • Created
  • Cached

(グラフは会社で実運用しているものなので出せませんが、知らないとこの記事には辿り着かなそう、、)

こちらに説明している記事がありますが、自分はMysqlのスレッドとコネクションについて知らなかったので、理解できない箇所が多くありました。

soudai.hatenablog.com

コネクションとスレッド

まず、Mysqlはシングルプロセスマルチスレッド構成になっています。(PostgreSQLはマルチプロセス構成)

クライアントが接続する(=コネクションを作る)と、スレッドが一つ作られます。 自分でMysqlにログインした時のことを考えてもらうと分かりやすいと思いますが、ログインした時にコネクションが作られ、ログアウトした時にコネクションが破棄されます。 同様にアプリケーションからクエリを実行する時も、ドライバを通してコネクションが作られ、処理が終わればコネクションが破棄されます。

f:id:kawasaki_dev:20210221194128p:plain
引用: https://mysqlserverteam.com/mysql-connection-handling-and-scaling/

以上のようなイメージ。(引用元に詳細な説明があります)

ConnectedとRunning

メトリックの一つConnectedは、存在しているコネクションの数(=スレッドの数)を表しています。 そして、Runningは実際にSQLを実行中のスレッドの数を表しています。

ConnectedとRunningの差分は、接続はしているがSQLの実行は行っていないスリープ中のスレッドの数になります。

キャッシュ

コネクションが作られるとスレッドも作られるのですが、スレッドの作成にはある程度サーバーのリソースを使うらしいです。

接続があるたびにスレッドを作成していたのでは、それだけ負荷がかかってしまうので、Mysqlでは一度作成したスレッドをキャッシュしておいて、接続があればそのキャッシュされたスレッドを使うように出来ます。

Cache Sizeはキャッシュしておくと設定したスレッドの数です。これは設定を変えない限り一定なはずです。

Cachedは実際にキャッシュされているスレッドの数です。

Createdは一分間あたりに作成されたスレッドの数です。

見方

ConnectedとRunnningが増えているということは、そのまま接続と実行中のスレッドが増えているということですね。

Cachedが減り、Createdが増えている場合はそれだけスレッドの作成にリソースが割かれているということなので、Cache Sizeを増やした方がいいかもしれないです。

障害時などは他のグラフとも比較しながら原因は特定していく必要があり、このグラフからだけで何かが分かることは少ないと思いますが、ヒントの一つにはなると思います。 他のグラフについても知見を深めていこうと思います。