2014年1月31日金曜日

Entering Undertow Web server 和訳

本エントリは以下の和訳です。お手元に WildFly をぜひご用意ください。

Entering Undertow Web server

Java EE 7 のリリースへの対応と、 Web Sockets API や HTTP upgrades(例: HTTP 経由の EJB) といった先進的な機能を実現するため、WildFly の開発チームは重大な決断をしました。Apache Tomcat からフォークされた JBoss Web Server の長きにわたるコミットメントを経て、WildFly では新しい Web サーバ、その名も Undertow を基盤に据えています。

Undertow は 柔軟性に富み、高速な Java 製の Web サーバであり、J2SE New Input Output(NIO) API をベースにしています。Undertow はコンポジジョンベースのアーキテクチャを持ち、ハンドラと呼ばれる小さな単一のコンポーネントを組み合わせることで、Web サーバとして完全な機能を構築できます。これらハンドラは、Java EE Servlet 3.1 コンテナの完全な機能の実現であったり、ユーザのコード中に埋め込まれたシンプルな HTTP を処理するハンドラを実行するためにチェーンされます。

以下の図のように、ハンドラチェーンは様々な個々のハンドラからなり、最終的に Servlet レスポンスやエラー(例: リクエストされたパスが存在しない)を生成します。

Undertow Web サーバはまた、タスクを処理するためにノンブロッキング非同期ハンドラにするか、スレッドプールで管理されるブロッキングハンドラに処理を委譲するか選択できる柔軟性を持っています。

Undertow の設定内容を確認するために、設定ファイル(standalone*.xml もしくは domain.xml)を見てみましょう。そして、"undertow" サブシステムのところまで移動してください。デフォルトでは以下のようになっています。

<subsystem xmlns="urn:jboss:domain:undertow:1.0">
   <buffer-caches>
      <buffer-cache buffer-size="1024" buffers-per-region="1024" max-regions="10" name="default">
   </buffer-cache></buffer-caches>
   <server name="default-server">
      <http-listener max-post-size="10485760" name="default" socket-binding="http">
      <host alias="localhost" name="default-host">
         <location handler="welcome-content" name="/">
      </location></host>
   </http-listener></server>
   <servlet-container default-buffer-cache="default" name="default" stack-trace-on-error="local-only">
      <jsp-config>
      <persistent-sessions path="persistent-web-sessions" relative-to="jboss.server.data.dir">
   </persistent-sessions></jsp-config></servlet-container>
   <handlers>
      <file directory-listing="true" name="welcome-content" path="${jboss.home.dir}/welcome-content">
   </file></handlers>
</subsystem>

Undertow の設定のうち1つ重要な要素として Buffer Caches があります。バッファは原則として、データを書き込み及び、後で読み込むことのできるメモリのブロックです。メモリブロックは NIO Buffer オブジェクトにラップされ、メモリブロックを簡単に扱うことのできるメソッド郡を提供します。バッファを利用することの大きな利点として、物理アクセスよりも高速であることが挙げられます。
Java NIO に加え、WildFly は XNIO(http://www.jboss.org/xnio)を活用しています。XNIO は低レベル I/O レイヤを提供し、NIO API をシンプルに扱うことができるようになります。XNIO は NIO セレクタを利用することによる複雑さの解決、NIO に不足しているマルチキャストやシリアルポートのような非ソケット I/O へのサポートを提供します。また、NIO が持つ機能は全てそのまま利用できます。
Undertow を管理するために、管理コンソール上で Profile タブの Web パネルを見てください。以下のリストが含まれています。
  • Web Services: WSDL ホストやポートといった Web サービスの設定を行えます
  • Servlets: JSP の一括リロードができる開発モードを利用するかどうかの設定を行えます(デフォルト: false)
  • HTTP: HTTP コネクタの設定(例: IO リソースプールの設定)を行えます
  • Undertow Core: ハンドラとフィルタを HTTP コネクションと関連付ける設定を行えます

Web サーバのプールの設定

ここは JBoss AS 7 の設定から変わったところです。以前のバージョンでは Web サーバのスレッドプールをチューニングするために、Thread Executor を参照していました。一方 WildFly 8 では、IO サブシステム中で作成される Worker 要素を参照する必要があります。やり方を見てみましょう。左にあるメニューのツリーから Core を開いて、以下の図のように "IO" を選択してください。
メインのパネルから "Worker" パネルを選択してください。すでに "default" ワーカが存在していることがわかると思います。Add/Remove ボタンをクリックすることで、いつでも新しいワーカを作成、削除することができます。また、"Edit" リンクをクリックすることで、default ワーカのスレッド数を変更することができます。リンクをクリックすると以下のように属性を編集できます。
最初の Stack size は Web サーバのスレッドのスタックサイズです。スレッドのスタックサイズを大きくすると Web サーバはより多くのリソースを処理できます。よって、少数のユーザ向けです。Task keepalive は同じクライアントからのリクエストに対するコネクションを何秒維持するか設定できます(デフォルト: 60)。Keep-Alives を利用するとブラウザは初回リクエスト時に確立したコネクションを全てのリクエストに対して使いまわすため、通常、ページのロード時間が半減します。

Io threads  Web サーバが利用できるスレッド数です。これは Web アプリケーションが高負荷を受けるようになるにつれて増やす必要のある、チューニングすべき重要なパラメータです。Task Max Threads は同時に処理できるリクエスト数です。IO ワーカの設定が終わったら Save をクリックしてください。

ワーカの設定をしたので、Web サーバからこのワーカを参照させる必要があります。左にあるメニューのツリーから Web サブシステムを開いて HTTP を選択してください。HTTP サーバに関する見慣れない項目があり、設定することができます。
表中の "default" 要素をクリックし、Worker 要素が先ほどの IO ワーカと関連づけられていることを確認してください。ワーカを利用するためには enabled である必要があります。次に、HTTP リスナと Socket binding(左のメニューの General Configuration にある Socket Binding から、利用できるソケットバインディング設定を確認できます) を関連付ける必要があります。最後に、HTTP サーバを Java NIO Buffer Pool の実装を設定します。これについては、次のセクションで説明します。

HTTP のワーカ設定が完了すると、Web サーバのワーカスレッドの名前は [worker name]-[worker-id] という形式になります。以下の図では、ワーカの名前を "custom" と定義し、JDK に同梱されている JConsole を利用してスレッドを監視しています。

Web サーバのバッファプールの設定

すでに述べたとおり、Undertow は Java NIO API に基づいており、J2SE のプールを利用します。

バッファするためには java.nio.ByteBuffer が必要です。
バッファはオブジェクトであり、読み書き可能なデータを含みます。NIO におけるバッファオブジェクトの追加が、この新しいライブラリと元々の I/O との大きな違いです。ストリーム指向の I/O では、データの読み書きに直接ストリームオブジェクトを操作していました。NIO ライブラリでは、全てのデータは Buffers を介して操作されます。データが読み/書き込まれるとき、バッファに対して読み/書き込まれます。NIO においてデータアクセスする際は、バッファから取り出すことになります。
Undertow における IO バッファプール の設定は、以下の図のように左のメニューの Core | IO を選択し、Buffer Pools から行います。
表中の "default" 行をクリックすると、以下要素を設定できます。

Buffers per slice バッファの分割数を設定します。大きなバッファを分割して操作し、バッファ全体を処理する際のオーバヘッドを回避します。
Direct buffers バッファがダイレクトバッファとして設定されるかどうかを選択します。ダイレクトバッファは Java ヒープ外の領域に割り当てられ、バッファの存続期間中はメモリアドレスが固定されます。メモリアドレスを順番に固定することで、カーネルが安全にメモリに直接アクセスできるため、ダイレクトバッファによって I/O 操作がより効率的になります。
Buffer size java.nio.ByteBuffer のサイズを設定します。ダイレクトバッファが有効な場合、デフォルトの 16kb は最大パフォーマンスを提供するのに最適な値です(この値は Linux でのデフォルトのソケットバッファサイズと一致します)。

この記事は "WildFly 8 Book" からの引用です。この本はもっとも有名なオープンソースの Java アプリケーションサーバである JBoss WildFly(JBoss AS から改称)の実践的でわかりやすいガイドです。この本は新しくエキサイティングな WildFly の運用管理面の詳細を網羅しています。管理機能にフォーカスし、最新のアーキテクチャとパフォーマンスの変化を学べます。基本的な設定からクラスタリングや JDBC コネクティビティ、ロギングなど高度な設定まで順を追って習得できます。

0 件のコメント:

コメントを投稿