#chiroito ’s blog

Java を中心とした趣味の技術について

CPUによるOpenJDKのビルド時間の推移

OpenJDK の開発環境を E3-1265 V2 から i9-9900K へ変えてみたのでビルド時間を計ってみました。

それぞれの性能はこんな感じです。

  • E3-1265 V2 は 4コア、ベース動作周波数 2.5GHz、ターボブースト時の周波数3.5GHz
  • i9-9900K は 8コア、ベース動作周波数 3.6GHz、ターボブースト時の周波数5GHz

どちらも IOPS が 10万近いSSD上にHyper-Vで仮想マシンを構築して、割り当てのCPU数はHT分も含めた全論理コアを割り当ててます。

OpenJDKのビルドはコア数に合わせて並列に処理をするようにできています。個人的には、コア数が倍で動作周波数がおよそ1.5倍なので掛け合わせて1/3ぐらいの時間で終わるようになれば良いかなと思ってました。

f:id:chiroito:20191011223348p:plain

結果としては、E3-1265 V2では25分かかっていたビルドが、i9-9900K では7分で終わるようになり、28%の時間で終わるようになり予想よりも速くなりました。

また、OpenJDKではテストも並列で処理をするようにできてます。そのため、途方もなく時間がかかっていたTier1テストの時間も52分で終わるようになったり、よくやる JFR のテストも7分半で終わるようになったのでかなりの時短につながりました。

CPUの性能を上げると開発に必要な時間がグッと短くなるので、みなさんもぜひ良いCPUを積んでみてください。

Windows Subsystem for Linux を使って OpenJDK をビルド

Windows 上で Windows Subsystem for Linux (WSL) を使用して OpenJDK 14 の Windows バイナリをビルドする方法をまとめます。

やりがちですが、Windows Subsystem for Linux (WSL)側のUbuntu 側で hg するのは必須ではありません。(やった) Windows側で好きな git クライアントがあればそれを使ってダウンロードしても大丈夫です。
Windows では環境変数とかもやらなくて大丈夫です。

全体の手順は以下のとおり。

  1. Windows の環境構築
  2. Windows Subsystem for Linux (WSL) 上の Ubuntu の環境構築
  3. ソースをダウンロード
  4. Windows Subsystem for Linux (WSL) 上の Ubuntu 上でビルド

Windows の環境構築

OpenJDK14をビルドするためにWindowsでインストールする物は以下の4つです。

  • Visual Studio Community
  • Windows Subsystem for Linux (今回はUbuntu 18.04 LTS)
  • Boot JDK (今回はOracle OpenJDK 12)
  • Mercurialクライアント

Visual Studio Community

以下の URL からVisual Studio Community 2017をダウンロードしてインストールします。

以前の Visual Studio ソフトウェアのダウンロード | Visual Studio - Visual Studio

最初は何もバイナリがありませんでしたが、ログインしたらダウンロードできるようになりました。 今回はVisual Studio Community 2017 (version 15.9)を使いました。

最低限必要なコンポーネントは分からなかったのでC++によるデスクトップ開発を入れています。 f:id:chiroito:20190727172428p:plain

Windows Subsystem for Linux (WSL)

Windows Subsystem for Linux は Ubuntu 18.04 LTS を入れています。Microsoft Storeを開いてインストールします。 f:id:chiroito:20190727172749p:plain

Boot JDK

Boot 用に使う JDK をインストールします。インストールするのはただのJDKです。Oracle OpenJDK の 12.0.2 を入れました。普通に入れるとProgram Files以下にインストールされますが、空白があるとなんか怖いなと思ってc:\Users\xxxx\develop\jdk-12.0.2にインストールしました。

※注:Windows版のJDKが必要です。

インストール後はこんな感じです。

C:\Users\xxxx\develop\jdk-12.0.2>dir /B
bin
conf
include
jmods
legal
lib
release

Mercurial クライアント

Mercurial のクライアントはお好きな物を使ってください。TortoiseHgを使いました。

Windows Subsystem for Linux 上の Ubuntu の環境構築

以下の4つをインストールします。

  • zip
  • unzip
  • autoconf
  • make
sudo apt-get install zip unzip autoconf make

ソースをダウンロード

ソースのダウンロードは Windows 上でもWindows Subsystem for Linux 上でも大丈夫です。 Windows Subsystem for Linux 側でダウンロードして、ソースをWindowsのIDEで修正したり見る場合には Windows から見えるパス上にダウンロードすることを忘れないでください。

以下は Windows 上でダウンロードします。 適当なディレクトリでMercurialクライアントを使ってhttp://hg.openjdk.java.net/jdk/jdkからクローンします。hgコマンドでC:\Users\xxxx\developディレクトリへクローンする場合は、コマンドプロンプトで以下のコマンドを実行します。

cd C:\Users\xxxx\develop
hg clone http://hg.openjdk.java.net/jdk/jdk

Windows Subsystem for Linux 上の Ubuntu でビルド

ビルドは Windows Subsystem for Linux (WSL) 上の Ubuntu でやります。configureでは--with-boot-jdkでは Windows へインストールしたJDKのパスを指定します。C:\のマウントポイントは/mnt/c/なので適宜指定してください。

gtest のコンパイルで失敗するので --disable-hotspot-gtest を付けてgtest は無効化します。

以下は Slow Debug モードでのビルドです。

configureが終わったらmake imagesでビルドしましょう。

bash configure --with-boot-jdk=/mnt/c/Users/xxxx/develop/jdk-12.0.2 --enable-debug --with-native-debug-symbols=internal --disable-hotspot-gtest
make images

これで、Windows Subsystem for Linux (WSL) 上の Ubuntu を使って Windows 用のバイナリをビルドできたはずです。

エンタープライズ向けのシステムを自動構築するツール

エンタープライズで使われるミドルウェアを使うためには、環境が使えるようになるまで構築に膨大な時間がかかるほか、開発用途などでちょっと使うだけで莫大なライセンス料がかかります。

クラウドが当たり前になって、ライセンス料が非常に安価になって触りやすくなったものの、エンタープライズなシステムではInfrastructure as a Codeや自動化などといったレガシーと比べて新しい仕組みを導入するのはハードルが高く、クラウドらしさを得ているエンタープライズなシステムは多くありません。 そのため、クラウド移行というとオンプレと同じ構成・リソースをクラウドにリフトするだけのシステムが多く、開発環境においても常にうごかしっぱなしのため、インフラコストは下がるどころか高くなります。また、インフラ担当者が温かみのある手作業で環境を構築・運用するため構築や運用のコストもこれまでどおりです。その結果、システム全体のコストはクラウド移行前と比べて高くなります。

ミッションクリティカルなシステムで使われるレベルのシステムを1から構築するのは骨が折れるものです。複数環境を手作業でとなると尚更です。

なので、エンタープライズなシステムを自動化するためのベースとなるツールを作成しました。基本的な構成はツールの設定変更だけでできることを目標とし、設定変更では対応できないケースではカスタマイズするベースとなることを目的としています。ツールといってもただのTerraformのファイル群です。

GitHub - chiroito/rapid-build-tool

このツールを使うと以下のような構成のシステムを設定だけで作れるようになります。実行してしばらく待つだけで環境が構築でき不要になったらすぐに環境が削除できる上、システム全体で100~200円程度からさわり始めることができます。

f:id:chiroito:20190219014813p:plain
LB経由でアプリケーションと管理ツールへアクセスし、システムのバックアップをオブジェクトストレージに取得する

f:id:chiroito:20190219014828p:plain
アプリケーションと管理ツールへのアクセスはアプリケーションサーバが直接受け付け、システムのバックアップは取らない

システムの開発時には必要な時だけ立ち上げて、不要なときだけ停止することでかなりのコスト削減に繋がります。また、同時に複数面を構築できるので、環境の構築待ちや開放待ちなども無くなり、開発の生産性向上にも繋がります。アプリケーションの単体試験や、Java EE のコンテナとの結合試験、外部システムをモック化した結合試験などの自動テストなどは既にある場合には、このツールと組み合わせることで開発者がソースをコミットしたら環境が自動で立ち上がり、これらのテストを実施し、テストが終わったらレポートを送信して環境は無くなるという使い方がエンタープライズなシステムでも可能となります。

エンタープライズなシステムでもよりクラウドらしさが得られることを願っています。