CloudSQL のQuery Insightで各指標が表示されるが、その中でも「CPU and CPU Wait」指標が理解できなかったので、整理しておくことにする。
以下は、表示される指標の例
CPU and CPU Wait: The ratio of the time taken by queries in an active state to wall-clock time. IO and Lock waits don’t block queries that are in an active state. This metric might mean that the query is either using the CPU or waiting for the Linux scheduler to schedule the server process running the query while other processes are using the CPU.
Note: CPU load accounts for both the runtime and the time waiting for the Linux scheduler to schedule the server process that’s running. As a result, the CPU load can go beyond the maximum core line.
ドキュメントより
をアクティブな状態のクエリとした場合の、アクテイブ状態のクエリにかかった時間の経過時間に対しての割合を表すもの。(I/O(disk or network)やロック待ちはこの指標には含まれない。) また、CPU 使用中と CPU 待機中の両方に対しての CPU ロード(負荷)の計測値は、最大コア数を超えることがある。
とのこと
アクティブな状態のクエリにかかった時間の経過時間に対しての割合について見ていくことにする。
アクティブ状態のクエリ時間 = 実際に CPU を使った時間(使用中 or 待機中)
割合 = アクティブ状態のクエリ時間 / 経過時間
例: 以下の時間がかかったとする
アクテイブ状態のクエリ時間 = 10s 経過時間 = 20s
10s / 20s = 0.5
クエリが実行中にどの程度 CPU に依存しているか、この場合 50%依存する負荷状況になっている。 つまり、この指標を使用することで、CPU ロード(負荷)を把握することができる。
また、CPU ロード(負荷)という単語が出てきたので、少し深堀ってみる。
CPU ロード(負荷)とは、その時点でシステム内に存在する「Active」なタスク(プロセス)の数を数えたもの。→ インフラを支える技術より 「Active」なタスクとはランキュー内の TASK_RUNNING, TASK_UNINTERRUPTIBLE のプロセス数に相当する。
ロードアベレージは上記について、特定時間内の平均数をとったもの。
Linux では、TASK_RUNNING + TASK_UNINTERUPTIBLE = CPU ロード(負荷)である。 TASK_UNINTERUPTIBLE は I/O 待ちを含む待ち状態であるため、Query Insight の 実行中の TASK_RUNNING + ランキューにあるがまだ実行されていない TASK_RUNNING の合計= CPU ロ(負荷)ードである点がやや異なる。
Query Insight の CPU ロード(負荷)と Linux における CPU ロード(負荷)の概念はやや異なることに注意する。
「CPU and CPU Wait」は CPU ロード(負荷)を表す指標である。
例えば、指標がコア数を超える場合は、
逆に、コア数に対して指標が低すぎる(CPU をうまく使い切れていない)場合は
「CPU and CPU Wait」の指標を使って、CPU 負荷に起因する問題の分析や対策を行うことができる。