新機能・ロール内異常検知の使いかた

こんにちは。Mackerelチームディレクターの id:daiksy です。

ミートアップなどのイベントで開発中である旨をお知らせしていました、機械学習を用いたMackerelの新機能「ロール内異常検知」β版の提供を開始しました。

mackerel.io

異常検知は、これまでの閾値を設定する監視とはすこし考え方が異なります。ここでは、異常検知とはどういうものなのか、どのように使えばいいのかを見ていこうと思います。

ロール内異常検知とは

「ロール内異常検知」とは、機械学習により、Mackerelで設定されたロール内にあるホストに対して、特別な監視項目を設定することなくサーバーの異常を検知する機能です。

これまでのサーバー監視では、監視ルールを的確に設定するために、深い経験やノウハウが必要でした。CPUが高負荷な時にアラートを出したい、と思ったとしても、そもそも高負荷とはCPUの使用率が何%の状態でそうといえるのか。アプリケーションの異常を検知したいとしてもどの項目にどんな閾値を設定すればよいのか。それらを判断するためには運用に関する経験や専門的な知識が必要です。また、アプリケーションの特性は日々変化しますし、それによって監視ルールの設定も放置しておくと古びてしまうので、定期的なメンテナンスがどうしても必要となります。

「ロール内異常検知」は、こういった監視ルールの複雑さを補助することができる機能です。

Mackerelでは、サーバーをロールという単位に整理することを推奨しています。ロールとは、あるサービスにおけるサーバーの役割のことです。ロールを適切に設定することで、"アプリケーションサーバー"や"データベースサーバー"など、負荷の傾向が同一のサーバー群がロールという単位で分類されることになります。Mackerelの「ロール内異常検知」では、機械学習を使ってロール全体のメトリックの過去の傾向から、サーバーの「正常な状態」を学習します。学習された結果に対して、新しく投稿されたメトリックを監視し、この「正常な状態」から外れるものを異常とみなしてアラートを発報します。つまり、個別の監視ルールを設定することなくサーバーの異常を検知するのが「ロール内異常検知」という機能の概要です。

検知の精度を高めるためにはロールの設定が重要

「ロール内異常検知」は、監視対象としてロールを指定します。Mackerelは、指定されたロールに登録されているホストの、過去数十日分のシステムメトリックから傾向を学習します。前述のとおり、ロールはサーバーの役割による分類を推奨していますので、アプリケーションサーバーやデータベースサーバーなど、メトリックの傾向のよく似たサーバーがロール内に集められていることを前提として、ロール全体の傾向を学習します。したがって、監視対象のロール内に、著しく傾向の異なるサーバーが混在していたり、サーバースペックに極端に差異があるサーバーが含まれていると、精度は落ちてしまいます。例えば、「アクティブ」と「スタンバイ」のサーバーが長期間同居している場合などが、ロール内に傾向の異なるサーバーが混在する要因となります。

Mackerelの「ロール内異常検知」を高精度に活用するためには、まずはロールによるサーバーの分類を適切に行うことが重要です。

ロール内異常検知の使い方

「ロール内異常検知」は、過去のメトリックから傾向を学習します。それに対して新しく投稿されたメトリックが、学習された過去の傾向から外れていると判断された場合、アラートが発報されます。このとき、アラート通知には異常と判定される根拠となったメトリックがあわせて通知されます。アラートを受け取ったユーザーは、この情報から、たとえばメモリ使用量が普段と違う増加傾向をしめしている可能性がある、など、サーバーにどのような異常が起きているのか、あたりをつけることが可能となります。

しかし、「ロール内異常検知」によって検知されたアラートに、たとえば「メモリ使用量のメトリックを根拠として異常を検知しました」という情報が記載されたとしても、それが必ずメモリに異常の原因があることを知らせているとは限りません。この点注意が必要です。

「ロール内異常検知」は、ロールに設定されたホストのシステムメトリックの傾向に対して、複合的に学習・判定を行います。サーバーで障害が発生するとき、その要因に対して複数のメトリックが影響を受けることもよくあることです。たとえばディスクへの書き込み量が増加している場合、そのサーバーに対してデータを送り込むためのネットワークの転送量も同時に増加したり、それらの影響を受けてメモリ使用量も増加したり、といったことがありえます。「ロール内異常検知」のアラートでは、このように複合的に傾向が変化した場合でも、検知した根拠となるメトリックは1つしかアラートには記載されません。ですので、「ロール内異常検知」によってアラートが発報された場合は、ロールグラフを横断的に見ていく必要があります。

このような性質の機能なので、「ロール内異常検知」のアラートをトリガーに、「この監視アラートが発生したらこのサーバーを再起動する」とった定型的な障害対応フローを定義するのはすこし難しいだろうと思います。「ロール内異常検知」の使い方としては、これまでの運用経験などにもとづいた閾値による監視を設定しつつ、そこから漏れてしまうようなレアな異常のケースにいち早く気づきたい、など監視運用の補助的な利用をオススメします。また、異常検知でのアラート受信をきっかけとして、閾値による監視を追加していく、という運用サイクルも考えられそうです。

今のロール内異常検知ではできないこと

「ロール内異常検知」が現時点で対応しているのは、mackerel-agentがインストールされているLinux環境のみで、Windowsやインテグレーション環境は現状サポートしていません

ロール内異常検知の技術的詳細について

より詳しく技術的詳細を知りたい場合は、下記スライドをご参照ください。

www.slideshare.net