レベル: 初級 上野 憲一郎, WebSphere サービス , IBM 河本 一輝, WebSphere サービス, IBM
2009年 11月 09日 WebSphere Application Server(以下、WAS)を利用しているLinux環境において、WAS起動ユーザーとして非rootユーザーを使用した「Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振り方法」を説明します。
1. はじめに
当記事では、我々がWebSphere Application Serverを利用しているLinux環境において経験した事例をもとに、「Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振り」における「非rootユーザー」によるラージ・ページの割り振り方法について解説を行います。まずは、InfoCenterの記述をおさらいし、その後で、「非rootユーザー」を使用した際の設定方法について説明を行います。
参考)オペレーティング・システム(以下、OS)がメモリーを管理する際の単位である「ページ」の大きさは通常4kB~8kBですが、大きなメモリー空間を扱う際に効率を上げるためMB単位の大きなページを扱えるようにしたものが「ラージ・ページ」です。
WASのパフォーマンスチューニングのひとつとして、OSの設定調整に関する情報がオンラインマニュアルであるInfoCenterに記載されています。OSごとに異なるチューニング方法が記載されており、以下がLinuxの場合の情報になります。
「Linux システムの調整」
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tprf_tunelinux.html
それらのチューニングを実施することにより、WASのパフォーマンス性能を更に引き出すことが可能になります。
Linuxのチューニングとして以下の項目が記載されています。
- timeout_timewait パラメーター
- SUSE Linux Enterprise Server 8 (SLES 8) SP2A - sched_yield_scale の調整
- RedHat Advanced Server 2.1 カーネルの更新
- Linux ファイル記述子 (ulimit)
- 接続バックログ
- TCP_KEEPALIVE_INTERVAL
- TCP_KEEPALIVE_PROBES
- Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振り (SLES 9 によりテスト済み)
2.ラージ・ページの利用
WASでラージ・ページを利用するための第一ステップとして、“-Xlp”パラメータをJVM引数に指定します。 以下にInfoCenterから“-Xlp”についての説明を抜粋します。
このパラメーターは、IBM Java 仮想マシンで、16 MB のページのようなラージ・ページを使用する際のヒープを割り振るために使用します。このパラメーターを指定する前に、オペレーティング・システムがラージ・ページをサポートするように構成されていることを確認してください。ラージ・ページを使用すると、ヒープ・メモリーの追跡に必要となる CPU オーバーヘッドを削減することができ、より大きなヒープを作成することもできます。
「Linux システムの調整」より、ラージ・ページを利用する際にOSに対して必要な設定方法を以下に抜粋します。
Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振り (SLES 9 によりテスト済み)
一部のアプリケーションでは、最適なパフォーマンスのために非常に大きなヒープを必要とします。 CPU とオペレーティング・システムによって提供される「ラージ・ページ」サポートを使用して、大きなヒープを管理する CPU オーバーヘッドを削減できます。以下の例では、ラージ・ページ・サイズが 4 MB、希望するヒープ・サイズが 2300 MB であると仮定します。
- sysctl.conf ファイル (通常は /etc/sysctl.conf にある) によって以下の 3 つの設定値を設定します。
注: このファイルを変更するには、root アクセス権を持っている必要があります。変更する前に、ファイルに読み取り専用とマークされていないことも確認してください。
a. 以下のコマンドを実行して、ラージ・ページ (2300 MB = 575 * 4 MB) 数を設定します。
vm.nr_hugepages = 575
b. 以下のコマンドを発行して、最大共用セグメント・サイズを 2300 MB にある程度の余裕 (約 95 MB) を持たせた値に設定します (2511724800 = 2300 MB * 1048576 バイト/MB + 100000000 バイト)。
kernel.shmmax = 2511724800
c. 以下のコマンドを実行して、共用するメモリーの合計量を設定します。
kernel.shmall = 2511724800
- Xmx JVM オプションを 2300 MB に設定します。
- プログラム・テキストを低い仮想メモリー・アドレス (0x10000000) に再配置し、大きなヒープ用により多くのアドレス・スペースを提供します。 SUSE Linux Enterprise Server 9 で以下のコマンドを実行して、JVM を起動するスクリプトまたは .profile ファイルにテキストを再配置します。
echo "0x10000000" > /proc/self/mapped_base
3.システム環境
ラージ・ページを利用する場合、上記のInfoCenterの記述を参照しながら設定を行うことになります。我々は事前に使用するシステム環境がInfoCenterの記述に適しているかを確認しました。
3.1.使用したシステム環境
今回、対象としたシステム環境は以下の通りです。
| ハードウエア | IBM Blade Center |
|---|
| OS | Red Hat Enterprise Linux 5.2 64bit版 (以下、RHEL 5.2) |
|---|
| WAS | v7.0.0.3 Network Deployment 32bit版 |
|---|
3.2.InfoCenterの記述と使用したシステム環境の違い
上記のシステム環境は、InfoCenterの「Linuxシステムの調整」で記載した内容と異なる点がいくつかあります。 (以下の1~3はラージ・ページの割り振りとは関係しません)
- sched_yield_scale に関する記述です。 これは、SUSE Linux Enterprise Server (以下、SLES) 8 向けの記述であり、RHEL 5.2には該当しません。
- RedHat Advanced Server 2.1 カーネルの更新に関する記述です。この記述は、RHEL 5.2には該当しません。
- Linux ファイル記述子 (ulimit)に関する記述です。 SLES 9について言及しておりますが、この記述に関しては、RHEL 5.2にも同様の内容があてはまります。
- Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振りに関する記述の中の、mapped_baseのサポートについてです。 SLES 9 における/proc/self/mapped_baseの設定方法が記載されていますが、RHEL 5.2では不要となっております(Linux Kernel version 2.4.19以降では不要)。
上記を踏まえて、RHEL 5.2において、以下のチューニングを実施しました。
- timeout_timewait パラメーター
- Linux ファイル記述子 (ulimit)
- 接続バックログ
- TCP_KEEPALIVE_INTERVAL
- TCP_KEEPALIVE_PROBES
- Java™ 仮想マシン (JVM) ヒープ用のラージ・ページの割り振り(ただし、mapped_basedの調整は実施せず)
4.ラージ・ページの設定に失敗?!
上記の項目をInfoCenterを参照しながら以下のように設定を実施し、設定確認を行いました。
まず、「2. ラージ・ページの利用」で記したsysctl.conf ファイルの設定を行います。その際に、どの程度のサイズをラージ・ページとして割り当てるかを決定し、それに合わせてsysctl.confファイルの設定を実施します。今回はヒープ用のラージ・ページとして3GBを割り当てることとしました。
ラージ・ページに関する情報は、“/proc/meminfo”に記載されます。以下のコマンドを実行することにより、ラージ・ページの使用状況を確認できます。
上記コマンドにてラージ・ページの大きさ(Hugepagesize)を確認したところ、今回の環境では2MBでした(InfoCenterの例では4MBとなっています)。それを踏まえてsysctl.confファイルに以下を設定します。
vm.nr_hugepages = 1536 ・・・3GB(割り当てるサイズ)/2MB(ラージ・ページの大きさ)
kernel.shmmax = 3321225472 ・・・3072MB *1048576バイト/MB + 100000000バイト
kernel.shmall = 3321225472 ・・・同上
|
3.2 のチューニングを実施し、-XlpをJVMの引数に指定して再起動した後、
cat /proc/meminfo
を実行し、確認したところ、以下の結果(抜粋)となりました。
HugePages_Total: 1536
HugePages_Free: 1536
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
|
上記コマンドにより出力される HugePages_Total の値と HugePages_Free の値の差が現在の使用量となります。
言い換えれば、HugePages_Total の値と HugePages_Free の値が同じ値であれば、ラージページは使用されていないことになります。
これから、HugePagesに全く割り当てられていないことがわかります。
残念なことに、InfoCenterの記述に基づいて(ただし、3.2で論じた差異は反映)設定を行ったにも関わらず、ラージ・ページの設定が不成功に終わりました。
その理由は、InfoCenterの記述は、「root」ユーザーを前提としているからです。
次項において、本記事のメイントピックである「非root」ユーザーによるラージ・ページの設定について記述します。
5.非rootユーザー使用時のラージ・ページの設定方法
InfoCenterに記載されているラージ・ページの割り振りの設定を行った上で、以下の設定を追加で実施することにより、WASをLinuxで稼動させる場合において、非rootユーザーでのラージ・ページの使用が可能になります。
5.1.WAS起動ユーザーのGIDの特定
まずは、WAS起動ユーザーのGIDを確認します。
以下の例では、WAS起動ユーザー “was000”のGIDは、”150”です。
例:
# id was000
uid=1500(was000) gid=150(wasusers) 所属グループ=150(wasusers)
|
5.2.ラージページを使用可能なユーザーのGIDの指定
ラージページを使用可能なユーザーのGIDが以下のファイルで指定されています。 /proc/sys/vm/hugetlb_shm_group
デフォルトで 0 (=root) となっています。
例:
# cat /proc/sys/vm/hugetlb_shm_group
0
|
これを以下のコマンドで設定変更し、使用するユーザーのGIDを指定します。
# echo [WAS起動ユーザーのGID] > /proc/sys/vm/hugetlb_shm_group
例:
# echo 150 > /proc/sys/vm/hugetlb_shm_group
|
上記内容をシステム起動時にも有効となるようにするためには、以下のいづれかを実施します。
- /etc/rc.d/rc.local に上のコマンドを追記する
- /etc/sysctl.conf に以下の行を追加する
(“150”部分を、該当するGIDに読み替えて指定して下さい)
vm.hugetlb_shm_group = 150
|
5.3 ロック・メモリー・サイズの変更
/etc/security/limits.conf に以下の2行を追加し、ロック・メモリーのサイズを増やします。 デフォルトは32KBです。
@wasusers soft memlock 3145728
@wasusers hard memlock 3145728
|
環境に応じて、適宜、適切な値を指定して下さい。
@の後にグループを指定 (例: @wasusers)
memlock の後に割り振るラージページのサイズを指定
(例: 3145728 = [ラージページ数] * [ラージページサイズ] = 1536 * 2048)
詳細は、[2] を参照してください。
5.4 ラージ・ページの割り振りの確認
上記設定を追加した後、OSを再起動します。
その後、 cat /proc/meminfo
を実行し、確認します。
我々の環境では、以下の結果(抜粋)となりました。
HugePages_Total: 1536
HugePages_Free: 1150
HugePages_Rsvd: 417
Hugepagesize: 2048 kB
|
これにより、ラージ・ページの割り振りに成功したことがわかります。
6 まとめ
WASをより高速に動かすためのチューニング項目として、Linuxを利用した環境において、非rootユーザーをWAS起動ユーザーとして使用する場合のラージ・ページの割り振りについて解説をいたしました。ラージ・ページの割り振りは、アプリケーションへの修正を必要とせず、OSおよびWASランタイムへの設定を行うだけで性能向上が見込まれる機能のひとつであり、WASのパフォーマンス・チューニングを行う際の参考となれば幸いです。
参考文献
著者について  | |  | 上野 憲一郎 (うえの けんいちろう)
日本アイ・ビー・エム株式会社 WebSphere サービス WebSphereパフォーマンス・アナリスト
入社後、システム・エンジニアとして10年ほど活動した後、米国IBMへ赴任。米国IBM Raleighソフトウェア開発研究所にて、WebSphere開発部門のパフォーマンス専門グループのメンバーとして活動。帰国後、東京基礎研究所にて、XML、Web サービス、SOA関連技術の研究開発に従事。WebSphereパフォーマンス専門家として、セミナーなどで講演も実施。
主な著書「WebSphere V3.5 Handbook」(Prentice Hall)、訳書「Webサービスプラットフォームアーキテクチャ」(エスアイビーアクセス)。 |
 | |  | 河本 一輝 (かわもと かずてる)
日本アイ・ビー・エム株式会社 WebSphere サービス ITスペシャリスト
入社後、IBM社内システムの構築・運用業務に従事し、主にWebSphere Application Serverを担当する。2006年にソフトウェア・サービスへ異動後、WebSphere Application Serverのインフラ設計・構築プロジェクトや提案活動に参画する。現在は、WebSphereサービスのFoundationチーム一員として、WebSphere Application Server、WebSphere eXtended DeploymentなどWebSphere関連製品を担当している。 |
記事の評価
|