normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

AppInsights の Java SDK を利用して CentOS の CPU 使用率、メモリ使用量、Process IO rate を確認する

前回までの記事で、Application Insights の JavaSDK を利用することで、Windows の場合に CPU 使用率、メモリ使用量、Process IO rate が取得できることが分かった。
Unix の場合はどうなのかと確認したところ、ApplicationInsights-Java/core/src/main/java/com/microsoft/applicationinsights/internal/perfcounter/ 内に Unix の性能情報を取得することができそうなクラスが存在することが分かった。

AppInsights の JavaJDK を仕込んだアプリを CentOS で動かしてみる

Azure のテンプレートから CentOS 7.1 を選択し、OpenJDK 1.8.0 と Tomcat をインストールし、Windows の場合と同様の war をデプロイして Java Web アプリを動かしてみた。
アプリ稼働後、数分でパフォーマンス情報が Application Insights のポータルに反映される。念のため yes >> /dev/null コマンドで CPU 負荷をかけると、以下のグラフの様に CPU 使用率が増加していることもわかる。
f:id:waritohutsu:20151206141759p:plain

どこの情報を取得しているのかソースコードを確認してみる

パッケージを確認すると、以下の7クラスが存在する。Abstract の名前が含まれるクラスは置いておくとして、CPU 使用率、メモリ使用量、Process IO rate を取得していることが推察できる。

  • AbstractUnixPerformanceCounter.java
  • UnixParsingState.java
  • UnixProcessIOPerformanceCounter.java
  • UnixProcessIOtParser.java
  • UnixTotalCpuPerformanceCounter.java
  • UnixTotalMemInfoParser.java
  • UnixTotalMemoryPerformanceCounter.java

CPU 使用率はどこを見ているのかを確認すると、UnixTotalCpuPerformanceCounter.java に記載されるように /proc/stat の値を確認していることが分かる。

メモリ使用量については UnixTotalMemoryPerformanceCounter.java を確認すると /proc/meminfo の情報を取得していることが分かる。

Process IO rate は UnixProcessIOPerformanceCounter.java より、/proc/"自身のプロセスID"/io から取得していることが分かる。

また、ここでは詳細に解説しないが、上記の各 PerformanceCounter クラスは、war アプリケーション起動時に初期化される。このため、特に開発者側が意識をせずに利用することができる点も利便性が高いといえる。