機械学習を用いた	
Mackerelの異常検知機能について	
Mackerel	Meetup	#12	
id:syou6162
自己紹介	
•  id:syou6162(本名:	吉田康久)	
•  専門は自然言語処理や機械学習	
•  2年前にはてなに転職	
– アプリケーションエンジニア	
– はてなブックマーク/Mackerel	
2
はじめに	
•  現在開発中の機能につき、リリース時には詳
細が変更されている可能性があります	
3
アジェンダ	
•  サーバー監視の困り事	
•  異常検知によるアラートの実例	
•  異常検知とは?	
•  異常検知のアルゴリズム	
4
5	
サービス/ロール毎に監視ルール設定	
静的な閾値によるアラートの発報	
サービス/ロールでホストを	
分かりやすくグルーピング	
はてな	
ブックマーク	
DB	
App	
Proxy	
DB_01	
DB_02	
App_01	
App_02	
Proxy_01	
Proxy_02	
はてなブログ	
DB	
App	
Proxy	
DB_01	
DB_02	
App_01	
App_02	
Proxy_01	
Proxy_02	 例:	CPUの使用率が90%	
越えたらCriHcalアラート
サーバー監視の困り事	
•  サーバー監視初心者の場合	
•  サーバー監視玄人の場合	
6
サーバー監視初心者の場合	
•  例:	アプリケーションエンジニア	
•  クラウドを使うようになって、サーバーも自分
で立てるようになった	
– しかし、サーバー監視はよく分からない	
•  本質的にはアプリケーションコードの開発に
集中したい	
7
サーバー監視玄人の場合	
•  インフラ周りの知識が豊富、何を監視すれば
いいか経験的に知っている	
•  見なければいけないサービスも多く、多忙な
ことも	
•  監視ルールを一度設定すれば終わり、では
なく定期的にメンテナンスする必要がある	
8
複数条件を考慮した障害の早期発見	
•  人間が複数のAND条件を網羅するのは困難	
–  例:	「cpu使用率はそれほど高くない」かつ「memory使
用量は多い」	
9	cpu	
memory	
休日や夜間等比較的	
負荷の低いケース	
平日を中心とした比較的
負荷の高いケース	
高負荷で障害に	
なりそうなケース	
cpu使用率の割にmemoryを
異常に食っているケース	
(例:	メモリリークが起きてる?)
機械学習による監視のサポート	
•  以下を実現したい	
– インフラの知識があまりなくても、低コストで監視
ルールが作れる	
– 人間が列挙するには困難な複数の条件を考慮し
た監視ができる	
•  機械学習による異常検知機能でユーザーを
サポートしたい!	
10
作りました🎉
アジェンダ	
•  サーバー監視の困り事	
•  異常検知によるアラートの実例	
•  異常検知とは?	
•  異常検知のアルゴリズム	
12
ロールを選択してもらうだけ!	
個別のメトリックを一つずつ	
設定していく必要はありません	
13
実例1(成功事例)	
14	
full	GCが走り	
負荷が一時的に上昇	
cpu/memoryなど個別の	
ルールは指定していない。	
ロールの指定のみ
実例2(成功事例)	
明け方からswapが多発	
loadavgの上昇時に異常検知アラートが発報。	
問題のプロセスをkillし、障害を未然に防げた!	
15
社内の喜びの声	
16
社内の喜びの声	
その後、原因となっていたメトリックに監視
ルールを設定(一次対応策がメモ欄に書ける)。	
人間のドメイン知識と機械学習の組み合わせ
でサーバー監視をサポート	
17
アジェンダ	
•  サーバー監視の困り事	
•  異常検知によるアラートの実例	
•  異常検知とは?	
•  異常検知のアルゴリズム	
18
代表的な問題設定:	外れ値検知	
19	
仲間から外れている	
図は hTps://qiita.com/kenmatsu4/items/68e48a00aaebf338bedc	より生成	
時刻	
メモリ	
使用量
アジェンダ	
•  サーバー監視の困り事	
•  異常検知によるアラートの実例	
•  異常検知とは?	
•  異常検知のアルゴリズム	
20
ガウス分布に基づく方法(教師なし学習)	
21	
異常と判定	
正常と判定	 •  起きる確率の高い事象
は正常と見なし、低い事
象は異常と見なす	
•  CPU使用率を例に挙げ
ていますが、実際にはシ
ステムメトリックの約20
個を総合的に見て判定
します	CPU使用率	
確	
率
負荷の波がある場合…	
昼間/深夜で負荷傾向が異なる場合、
一つのガウス分布ではサーバー負荷
の状態を表現しきれず、誤報が多く
なってしまう	
高負荷の場合、低負荷の場合…
といくつかガウス分布を用意する
とよさそう🤔	
22
混合ガウス分布に基づく異常検知	
•  複数のガウス分布の足し合わせで対応	
23	
cpu	
memory	
休日や夜間等比較的	
負荷の低いケース	
平日を中心とした比較的
負荷の高いケース	
異常と判定されるケース1	異常と判定されるケース2
負荷の波があっても誤検知しない	
混合ガウス分布に基づいているので	
負荷の傾向がいくつかあっても誤検知しない	
24
異常検知によるサーバー監視	
•  サーバー監視初心者/玄人どちらのユーザー
もサポートできる機能	
•  はてな社内での高負荷の早期発見の事例	
•  混合ガウス分布を用いたシンプルな方法	
•  懇親会で気軽に質問してください!	
25

機械学習を用いたMackerelの異常検知機能について