Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2016年06月29日

sakata

Java Flight Recorderを起動後に実行しよう

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

概要

Java Flight Recorder(JFR)について、以下のような記事を書いてきました。

Java Flight RecorderとJava Mission Controlを使ってみよう

アプリケーションでJava Flight Recorderファイルを出力しよう

これらの記事で、JFRとJava Mission Control(JMC)の使い方を学びました。
今回は、アプリケーションの起動後にJFRを実行することをやってみます。JFRで情報を取りたいというときは、このアプリケーション起動後に実行する場合がほとんどだと思います。

対象アプリケーション

以前の記事と同じく、Spring Bootで定期的に現在日時を出力するアプリケーションを使います。
https://spring.io/guides/gs/scheduling-tasks/を参照、もしくは上記の記事を読んでいただいてアプリケーションを起動してください。

jcmd

みなさんはjcmdというコマンドをご存知でしょうか?Javaにはjstackやjmapなどなどいろいろなコマンドがありましたが、JDK 7から導入されたjcmdだけでそれら全部と同じことを実行できるようになっています。
「jcmdユーティリティを使用してJVMに診断コマンド・リクエストを送信し、JVMではこれらのリクエストを使用してJavaフライト記録の制御、トラブルシューティング、JVMおよびJavaアプリケーションの診断を行います。JVMが実行されているものと同じマシン上で使用され、JVMの起動で使用されたものと同じ有効なユーザーおよびグループ識別子を持っている必要があります。」
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/tooldescr006.html
Javaフライト記録、というのがJFRの日本語訳です。

ではjcmdを使ってみましょう。

オプションをつけなければ起動しているJavaのプロセスIDを出力します。

そのプロセスで使用できるコマンドは、helpオプションで見ることができます。

JFRやGC、VMといったものはドメインと呼ぶそうです。

商用機能のロックを解除する

jcmdで商用機能のロックを解除できます。まずは商用機能のロックの状態を確認します。

「Commercial Features are locked.」とあるので、商用機能はロックされています。
次にJFRの状態も確認してみましょう。

「Java Flight Recorder not enabled」とあるので、有効化されていません。VM.unlock_commercial_featuresを実行して有効化するようにという記述があります。

「Commercial Features now unlocked」となり、商用機能が解除されました。
では商用機能の状態を確認します。

「Java Flight Recorder has not been used」とあるので、有効にはなっているが利用していない状態になりました。

JFRを実行する

JFRの状態を確認できます。

この指示の通り、JFR.startしましょう。

状態を確認します。

runningとあるので、JFRを実行していることがわかります。
今回はduration(期間)を2分にしたので、2分経過すると以下のようになります。

stoppedと出力されています。
durationではなくdumponexit=trueを指定して、exitするときにdumpさせることもできます。
javaコマンドを実行したディレクトリにsample.jfrがあります。
JMCで開いてみましょう。
スクリーンショット 2016-06-28 16.47.23
見れますね。

サマリー

アプリケーションの起動後にJFRを実行することで、トラブルシューティングなどさまざまな状況でJFRを使って収集した情報を元に判断をすることができます。ライセンスがあり利用できる環境であれば、ぜひ積極的に利用しましょう!


2016年06月27日

Kayo

Ansible Meetup in Tokyo 2016.06に行ってきました!

みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ担当の藤本佳世です。前回のブログの続き、「OpenStack構築手順」などご紹介する予定ですが、その前に2016年6月1日(水)に開催された「Ansible Meetup in Tokyo 2016.06」に参加したお話しをしたいと思います。自称「Ansible女子」の私。3年前にも参加したことがあり、今回は3回目の参加でした。

詳細URL http://ansible-users.connpass.com/event/31222/

Ansible

Ansibleとは、今回Meetupの会場でもあるレッドハットが開発するオープンソースの構成管理自動化ツールです。
ssh通信を利用して、クライアントサーバに直接命令を送り込むことができます。
フリューでは約3年前にAnsibleを導入し、ミドルウェアのインストールなどサーバ構築・管理には欠かせないツールとして利用しています。Ansibleを使うメリットはとても大きく、導入したことで、今まで手動で3時間もかかっていたサーバ構築作業を、1時間以内まで時間短縮を実現することができました。
使い始めた頃は、参考書も少なく、公式HPの英語ドキュメントを参考にしていましたが、今年の4月にO’Reillyから本も発売され、ますます注目されています。

公式ホームページ https://www.ansible.com/

発表内容

  • 「Ansible Core 2.0 Overview and future releases」 by Dylan Siliva
  • 「Jupyter+AnsibleによるLiterate Computing(手順書 as a Code)への挑戦」 @ enakai00
  • 「共通言語Ansible」 @seri_wb
<LT詳細>
  • 「ansible-vaultについて何か」 (ynn)
  • 「Ansibleの教育トレーニングはじめました」 (spchildren)
  • 「Ansible2.0とOpenStackの関係」 (saito_hideki)
  • 「Playbookからのドキュメント自動生成やってみてる」 (h-hirokawa)
  • 「Ansibleとterraformで実現するタグベース複数環境プロビジョニング実例」 (takuya_onda_3)

内容まとめ

Ansible2.0新機能と今後のリリース関連

  1. 200以上の新しいモジュールが追加された
  2. エラーメッセージの改善:よりわかりやすくエラーメッセージ内容を記載するようになった
  3. アーキテクチャが変更され、より簡単に開発できるようになった
  4. ansible-vaultと呼ばれる機密情報が書かれたファイルを暗号化するツールがリリースされた
  5. 36個の OpenStackモジュール追加され、バージョン1と比べて、とても使いやすく親和性が高い
  6. sudo機能が使えなくなる予定。ansible_ssh_hostnameを ansible_hostname, ansible_userに変更する必要がある
  7. 約400以上のモジュールをリリース予定(Dockerモジュールも追加予定)
  8. python3対応予定
  9. クラウド技術にも力を入れる予定 (AWS, OpenStackなど)

運用について

  1. 開発とインフラの作業ラグをなくす取り組みについて、ミドルウェアバージョンアップなどインフラではなく、開発メンバーにAnsibleを実行してもらっている
  2. ansible-vaultと呼ばれる機密情報が書かれたファイルを暗号化するツールの利用
  3. Ansibleは自動化だが、やはりメンテナンスする必要がある。複雑なplaybookを書いてしまい、結果ブラックボックス化してしまう。手順書を用いることで、だれが見ても分かるようにする
  4. Ansibleコードをシンプルに保つことが大切

感想

Ansibleバージョン2.0の新機能や今後リリース予定のモジュールなどの紹介がありました。
個人的には、【Jupyter+AnsibleによるLiterate Computing(手順書 as a Code)への挑戦 @ enakai00 】の発表が非常に興味深かったです。手順書作成の必要性について、いかにAnsible(コード)だけに頼らず、うまく手順書にAnsibleを載せるかについて紹介されていました。

私が所属するインフラチームは、Ansibleを導入して約3年ほど経ちます。新規サーバ構築以外に、ミドルウェアのアップデート、脆弱性対応など、様々なケースで利用しています。しかし、Ansibleの構成が複雑化してしまい、他のメンバーが使いこなす事が非常に難しい状態です。そんな時、やはり手順書があればと思っていました。発表で「Jupyter」を使った手順書作成についてのお話しを聞くことができました。Jupyterの知識はゼロですが、是非検証してみたいなと思いました。

その他にもOpenStackについて、Ansibleバージョン2以降、とても使いやすくなったとの発表もありました。
前回のブログで紹介したOpenStackは、Ansibleを使って構築しました。今後のブログで、その手順をご紹介するので、是非読んでいただければ嬉しいです。


2016年06月20日

sakata

アプリケーションでJava Flight Recorderファイルを
出力しよう

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

概要

今回の内容はこちらの続きです。

Java Flight RecorderとJava Mission Controlを使ってみよう


上記の記事ではJava Flight Recorder(JFR)のファイルとして、JDKに付属しているサンプルのものを使いました。
今回は、自分で起動したアプリケーションにJFRのファイルを出力させ、Java Mission Controlで内容を見ることにします。

対象アプリケーション

対象のアプリケーションには要件がとくにないので、起動しやすいSpring Bootアプリケーションにします。
https://spring.io/guides/gs/scheduling-tasks/
このアプリケーションは定期的に日時を出力するだけのアプリです。GitHubから取得できます。Gitクライアントがない場合はZIPファイルでダウンロードもできます。

build/libs/gs-scheduling-tasks-0.1.0.jarという実行可能JARファイルができます。

Java Flight Recorderの出力設定

以前の記事でJFRは以下のようなものだと記載しました。
「Java Flight Recorderは、Oracle JDKに組み込まれているプロファイリングとイベント収集フレームワークです。Javaの管理者および開発者は、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。」
http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html

JFRのガイドは以下のページにあります。
http://docs.oracle.com/javacomponents/jp/jmc-5-5/jfr-runtime-guide/toc.htm

JFRのファイルを出力するためには、javaコマンドに次のオプションを指定します。

-XX:+UnlockCommercialFeaturesオプションは、JFRと直接関係はありませんが、商用機能のロックを解除するものです。JFRを使うためには必要です。-XX:+FlightRecorderオプションでJFRをオンにし、-XX:StartFlightRecording=duration=60s,filename=sample.jfrで記録する期間と出力先のファイル名を指定します。この例の場合、収集する時間は60秒で、javaコマンドを実行したディレクトリにsample.jfrというファイルを出力します。
なお、商用機能のロック解除は「Java SEのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義されている開発用途での利用の場合」のみに限られていることに注意してください。

アプリケーションの起動

ではJFRを有効にしてSpring Bootアプリケーションを、JFRのオプションをつけて起動しましょう。

Started recording 1. The result will be written to:という出力があるので、JFRが起動してファイルに出力していることがわかります。今回は120秒を指定したので、2分経過したらアプリケーションを停止してもらって大丈夫です。sample.jfrが出力されているか確認します。

ありました。

Java Mission Controlで見てみよう

ではJava Mission Control(JMC)でsample.jfrを開きます。
スクリーンショット 2016-06-17 17.43.20
高負荷なアプリケーションではないので、たいしたデータはありませんが、見れています。
メモリーを見てみます。ガベージ・コレクションタブを開きます。
スクリーンショット 2016-06-17 17.45.19
ガベージコレクションは起動時にしかなかったようです。フルGCはなくScavenge(New領域のGC)だけでした。次にGC構成のタブを開きます。
スクリーンショット 2016-06-17 17.45.40
GCアルゴリズムもデフォルトのままですので、パラレルGCです。ヒープサイズは初期128MB、最大2GBです。こういったこともJFRを通じてわかります。

サマリー

やはりJFR、JMCはすごいですね!今回は起動時にJFRの収集を開始させましたが、次の機会には起動後のアプリケーションに対してJFRに収集させる方法について書きたいと思います。


2016年06月16日

sakata

Java Flight RecorderとJava Mission Controlを
使ってみよう

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
突然ですが、みなさんはJava Flight RecorderとJava Mission Controlをご存知でしょうか?

Java Flight Recorder

「Java Flight Recorderは、Oracle JDKに組み込まれているプロファイリングとイベント収集フレームワークです。Javaの管理者および開発者は、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。」
http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html
Java Flight Recorder(JFR)はアプリケーションとJVMの詳細な情報をファイルに出力することができます。

Java Mission Control

「Java Mission Controlは、Java Flight Recorderによって収集されたデータを効率的かつ広範囲に詳細な分析を可能にする高度なツール・セットです。ツール・チェーンは、開発者や管理者が、ローカルで実行している、あるいは本番環境でデプロイされているJavaアプリケーションからデータを収集し分析することを可能にします。」
Java Mission Control(JMC)は直接アプリケーションに接続して情報を収集することもできますが、JFRのファイルから分析することができます。

注意事項

JFRとJMCはともに商用機能です。使用するためにはOracle Java SE Advancedのライセンスが必要となります。ただし、Java SEのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義されている開発用途での利用の場合は無料です。
BCLはこちらです。
http://www.oracle.com/technetwork/java/javase/terms/license/index.html
基本的には、本番環境で使用する場合は必ずライセンスがいるということです。

JMCの起動

JMCはOracle JDK 7 Update 40 (7u40)以降バンドルされています。$JAVA_HOME/binディレクトリにjmcコマンド(jmc.exe)があるので実行します。次のような画面が表示されます。今回のJMCのバージョンは5.5です。

WS000048

起動したけどどうしよう?

さてJMCを起動しましたが、JFRのファイルがないため、何も見るものがありません。ですが、JDKのDemos and SamplesにJFRのファイルが含まれています。今回はそれを使います。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
このページからJDKのダウンロードに進み、ページの下部に「Java SE Development Kit xxx Demos and Samples Downloads」という項目があります。ここからダウンロードしてください。そして解凍します。

JFRのファイルを開いてみる

解凍したディレクトリのsample/missioncontrol/flightrecordingsディレクトリに、拡張子がjfrのファイルがあります。このファイルをJMCで開きます。wldf.jfrを開いてみます。ロードに少し時間がかかります。それから次のような画面になります。

WS000049

本当にさまざまな情報を見ることができます。ヒープ、CPU使用状況、スレッド数といった一般的な情報からJITコンパイルの状況、ホット・メソッド、ロック・インスタンスなどの細かい情報が見れます。

サマリー

JFRとJMCは本当に強力なツールです。もしライセンスを持っているなら、すぐにJFRでファイルを出力してデータを収集されるとよいと思います。持っていなくても、こうしてサンプルで試してみることができます。ぜひ一度JFRとJMCを触ってみてください!


2016年06月9日

sakata

OpenJDKのJDK 9をビルドしよう #openjdk

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
みなさん、JDK 9は使っていますか?この記事ではOpenJDKのJDK 9をMacでビルドします。
実はビルドせずともダウンロードしてインストールすることもできます。
https://jdk9.java.net/download/
ですが、最新ではない場合もありますので、ここではビルドします!

Mercurial

OpenJDKのソースコードはMercurialで管理されています。まだMercurialをセットアップしていない場合は、インストールしましょう。MacでHomebrewを使っている方であればbrew install hgです。

ソースコードの取得

OpenJDKのソースコードを取得します。defaultブランチの最新のソースコードを取得するよりも、バージョンのタグが付いている方がよいでしょう。タグの一覧は次のURLで見れます。
http://hg.openjdk.java.net/jdk9/jdk9/tags
上部にあるものが新しいタグです。jdk-9+xxx形式の最新のタグ名を使いましょう。今回はjdk-9+121のタグを使います。
Mercurialでソースコードを取得します。

最後のjdk-9+121はクローンしたソースコードを格納するディレクトリ名です。ディレクトリに移動します。

ここからさらにソースコードを取得します。

ビルド

これでconfigureできます。私の環境は複数のJDKが入っているので、ビルドに使うJDKを指定します。デバッグ版がほしい場合はさらに--enable-debug --with-target-bits=64オプションをつけます。

configureできたので、make allコマンドを実行します。

JDK9がインストールされました。さっそく使いましょう。

JDK 9を使う

build/macosx-x86_64-normal-server-release/jdkディレクトリがJAVA_HOMEとなります。

JDK 9から入ったjhsdbjmodというコマンドがありますね。

ヒャッハー!9になりました。これでJavaのREPL、jshellが使えますよ!

サマリー

さて今回はOpenJDK 9をビルドしてみました。次回はJava 9の機能のどれかを使ってみます。

2016/06/09追記

コマンドではないですが、HSDB自体ははJava 7から使える、とのご指摘をいただけました。