きっかけは開発していたサービスが Windows Azure Web サイト上で CPU を 100% 使っていたことでした。
Web サイトは仮想マシンやクラウドサービスと違って、リモートデスクトップで直接調べることが出来ないので、どうしたものかと思って Twitter で聞いてみたところ、中の人である河野さんからお返事を頂きました。
@shibayan これ使ってダンプ取って下さい https://t.co/bwGmaxx6NB
— 帝国兵 (@superriver) July 28, 2013
なるほど、Web サイトの Git デプロイエンジンである Kudu に診断系の API が用意されているようです。
Process list and minidump · projectkudu/kudu Wiki · GitHub
wiki にはエンドポイントに関する情報が無いですが、Web サイトの場合では Kudu のエンドポイントは dnsname.scm.azurewebsites.net になっているみたいです。*1
アクセスするためには認証が要求されるので、デプロイ資格情報で設定したユーザー名とパスワードを入れるとログインできます。
dnsname.scm.azurewebsites.net/diagnostics/processes を叩くと JSON でプロセス一覧が取れたり、更に API を叩くことで指定したプロセスの情報など、かなり取れるようになっています。
例えば IIS のワーカープロセスの情報は以下のような JSON が取得出来ました。
{ "id": 25340, "name": "w3wp", "href": "http://wsoembed.scm.azurewebsites.net/diagnostics/processes/25340", "minidump": "http://wsoembed.scm.azurewebsites.net/diagnostics/processes/25340/dump", "parent": "http://wsoembed.scm.azurewebsites.net/diagnostics/processes/13880", "children": [ ], "file_name": "D:\\Windows\\SysWOW64\\inetsrv\\w3wp.exe", "handle_count": 636, "module_count": 171, "thread_count": 46, "start_time": "2013-07-29T16:50:50.1249335Z", "total_cpu_time": "00:00:04.2812500", "user_cpu_time": "00:00:03.3906250", "privileged_cpu_time": "00:00:00.8906250", "working_set": 73412608, "peak_working_set": 73433088, "private_working_set": 31424512, "private_memory": 63037440, "virtual_memory": 734519296, "peak_virtual_memory": 734584832, "paged_system_memory": 556600, "non_paged_system_memory": 84218, "paged_memory": 63037440, "peak_paged_memory": 63037440 }
そして minidump に記載されている URL を叩くと、本当にワーカープロセスのミニダンプファイルをダウンロードできます。
Web サイトは本当にダウンタイム無しで WS2008R2 から WS2012 にアップグレードしてたんですな。*2
しかし、API しか用意されていないのは非常にめんどくさいなーと思って検索していたら、以下のブログ記事が見つかりました。
実際はわざわざ API を手動で叩かなくても、Kudu のエンドポイントにブラウザから簡単に使える診断ログのダンプや、コンソールなどの機能が用意されていました。
コンソールからは cd や dir などの基本的なコマンドの他に、PowerShell を使ったプロセス一覧だけは使えるようになっているみたいです。
管理ポータルからだと CPU 時間やメモリ使用量などは遅れたものしか見れないですが、Kudu のコンソールからコマンドを叩けばすぐに見れて便利ですね。
仮想マシンやクラウドサービスほどではないですが、Web サイトで動かすレベルのアプリであれば十分な診断機能だと思います。