システム 安 定 稼 働 を 実 現 するための JavaVMメモリサイジング 2008 年 6 月 18 日 株 式 会 社 日 立 製 作 所 ソフトウェア 事 業 部 第 2AP 基 盤 ソフト 設 計 部 中 島 恵 Hitachi, Ltd. 2008. All rights reserved.
Contents 1. 安 定 したシステムを 構 築 するために 2. GC(ガベージコレクション)とは 3. メモリサイジング 3.1 FullGC 発 生 間 隔 の 見 積 もり 3.2 Javaヒープサイズの 見 積 もり 4. Cosminexus(コズミネクサス コズミネクサス)での 取 り 組 み 5. デモンストレーション 2 Hitachi, Ltd. 2008. All rights reserved.
1 安 定 したシステムを 構 築 するために 3 Hitachi, Ltd. 2008. All rights reserved.
1. 安 定 したシステムを 構 築 するために Webシステムの 安 定 性 堅 牢 性 を 高 めるためには Webシステムは アプリケーションサーバおよびJavaによる 開 発 生 産 性 の 向 上 によって 容 易 に 構 築 が 可 能 となった 業 務 量 ピーク 時 など 性 能 上 のトラブルが 後 を 絶 たない システムの 性 能 劣 化 につながる 要 因 1. CPUネック 2. メモリネック 3. バックエンドシステムによるネック Hitachi, Ltd. 2008. All rights reserved. 4
1. 安 定 したシステムを 構 築 するために 性 能 設 計 の 方 針 1. CPUネック 性 能 要 件 を 満 たすCPU 数 にする 適 切 な 同 時 実 行 数 を 設 定 する 2. メモリネック 性 能 要 件 を 満 たすメモリにする 適 切 な 同 時 実 行 数 を 設 定 する マシンサイジング 流 量 制 御 メモリサイジング 流 量 制 御 3. バックエンドシステム(DBサーバなど)のネック バックエンドシステムの 増 強 Hitachi, Ltd. 2008. All rights reserved. 5
1. 安 定 したシステムを 構 築 するために メモリサイズのトラブルで 一 番 多 い 例 エンドユーザ 数 の 増 加 に 伴 い トランザクションも 増 加 GC 多 発 によるレスポンス 遅 延 (スローダウン) これまでの 対 応 Javaの 世 界 ではメモリ 見 積 りは 困 難 負 荷 テストをやってみないと 分 からない これからの 対 応 性 能 単 価 が 判 れば メモリ(GC 発 生 頻 度 )による 業 務 への 影 響 度 が 見 積 もれる Hitachi, Ltd. 2008. All rights reserved. 6
1. 安 定 したシステムを 構 築 するために 性 能 要 件 を 満 たすメモリにする メモリサイジング JavaVMのメモリ 管 理 の 仕 組 み(ガベージコレクション)を 理 解 することにより 効 率 的 なメモリサイズの 見 積 もりを 行 なうことが 可 能 となる Hitachi, Ltd. 2008. All rights reserved. 7
2 GC(ガベージコレクション)とは 8 Hitachi, Ltd. 2008. All rights reserved.
2. ガベージコレクションとは ガベージコレクション(GC)とは JavaVMが 管 理 するメモリ 領 域 中 の 使 用 済 みのメモリ 領 域 を 破 棄 し 空 き 領 域 を 作 ること 使 用 領 域 使 用 領 域 使 われなくなった 領 域 GC 空 き 領 域 空 き 領 域 GC 前 のヒープ 領 域 GC 後 のヒープ 領 域 Hitachi, Ltd. 2008. All rights reserved. 9
2. ガベージコレクションとは -Javaヒープとは- Javaプロセスのメモリの 内 訳 Javaヒープ Permヒープ Cヒープ GCの 対 象 スレッド スタック Permヒープはトランザクション 処 理 中 の メモリ 使 用 領 域 の 変 動 が 少 ないため 本 セッションでは 考 慮 しない Eden (できたてのインスタ ンスを 配 置 する 領 域 ) New Survivor ( 使 用 中 のインスタン スを 配 置 する 領 域 ) Old 業 務 プログラム 使 用 領 域 J2EEサーバ ( 年 齢 の 古 いインスタンスを が 使 う 領 域 配 置 する 領 域 ) New 領 域 用 の 退 避 領 域 Javaヒープ Permヒープ Cヒープ スレッドスタック Javaアプリケーションが 使 用 するメモリ 領 域 クラスなどのメタ 情 報 を 格 納 する 領 域 JavaVMやCプログラムが 使 用 するヒープ 領 域 スレッドごとに 保 持 するスタック 領 域 Hitachi, Ltd. 2008. All rights reserved. 10
2. ガベージコレクションとは -CopyGCとFullGC- GCには2 種 類 ある CopyGC New 領 域 を 対 象 に 使 用 済 みのインスタンスを 全 て 削 除 する 使 用 中 のインスタンスは 隣 の 領 域 へ 移 動 する New Eden S1 Old S2 業 務 プログラム 使 用 領 域 インスタンスの 配 置 に 利 用 できない 領 域 Edenの 領 域 がいっぱいになる とCopyGCが 起 こる 使 用 中 のものは 隣 の 領 域 へ FullGC 全 ての 領 域 を 対 象 に 使 用 済 みのインスタンスを 全 て 削 除 する New Eden S1 Old S2 業 務 プログラム 使 用 領 域 インスタンスの 配 置 に 利 用 できない 領 域 Oldの 業 務 プログラム 使 用 領 域 が いっぱいになるとFullGCが 起 こる Hitachi, Ltd. 2008. All rights reserved. 11
2. ガベージコレクションとは -GCの 問 題 点 - 2つのGCの 比 較 範 囲 発 生 タイミング 実 行 にかかる 時 間 CopyGC New 領 域 Eden 領 域 がいっぱいになった 時 0.01~0.7 秒 FullGC 全 領 域 Oldの 業 務 プログラム 使 用 領 域 がいっぱいになった 時 GCはメモリの 空 き 容 量 を 確 保 するために 必 要 な 処 理 1 秒 ~ 数 十 秒 しかし GCが 発 生 すると GC 実 行 中 は 業 務 処 理 が 停 止 する FullGCは 特 に 時 間 が かかる Javaヒープのサイズに より 実 行 にかかる 時 間 は 増 加 する レスポンス 遅 延 を 防 ぐためには ピーク 時 間 帯 に 許 容 できる FullGCの 頻 度 を 決 め 必 要 なメモリサイズを 確 保 することが 重 要 設 定 例 FullGCの 許 容 発 生 間 隔 2 時 間 に1 回 Hitachi, Ltd. 2008. All rights reserved. 12
2. ガベージコレクションとは - 安 定 時 のメモリ 使 用 状 況 (グラフ)- Javaヒープ 領 域 の 使 用 量 FullGC 発 生 なし 安 定 時 のグラフ ( 非 月 末 ) Hitachi, Ltd. 2008. All rights reserved. 13
2. ガベージコレクションとは -GC 多 発 時 のメモリ 使 用 状 況 (グラフ)- 10~15 秒 おきに1 回 FullGC 発 生 1 回 あたりのGC 処 理 時 間 が3~4 秒 Javaヒープ 領 域 の 使 用 量 GC 多 発 時 のグラフ( 月 末 ) Hitachi, Ltd. 2008. All rights reserved. 14
3 メモリサイジング 15 Hitachi, Ltd. 2008. All rights reserved.
3. メモリサイジング - 要 件 および 設 計 方 針 - メモリサイズ 見 積 もりの 前 提 要 件 ピーク 時 レスポンス 遅 延 をしない 問 題 点 レスポンス 遅 延 の 大 きな 要 因 はFullGC FullGC 実 行 中 は 業 務 処 理 が 秒 オーダーで 停 止 する 性 能 設 計 の 方 針 FullGCをなるべく 起 こさないメモリサイズを 確 保 する Hitachi, Ltd. 2008. All rights reserved. 16
3. メモリサイジング -FullGC 発 生 間 隔 見 積 もりの 考 え 方 - New 領 域 およびOld 領 域 に 格 納 されるインスタンスの 違 いに 着 目 Javaヒープ 構 成 Eden New Survivor 業 務 プログラム 使 用 領 域 Old J2EEサーバ が 使 う 領 域 New 領 域 用 の 退 避 領 域 格 納 される インスタンス 短 命 なインスタンス (トランザクション 処 理 で 使 用 するメモリなど) 長 命 なインスタンス (セッション 情 報 ) J2EEサーバ が 使 う 領 域 New 領 域 用 の 退 避 領 域 クライアント トランザクション ログイン 商 品 表 示 商 品 購 入 Web/APサーバ Web Server J2EEサーバ セッション 情 報 A DBサーバ ログイン 商 品 表 示 セッション 情 報 B クライアント 業 務 プログラム Hitachi, Ltd. 2008. All rights reserved. 17
3. メモリサイジング -FullGC 発 生 間 隔 見 積 もりの 考 え 方 - New 領 域 およびOld 領 域 に 格 納 されるインスタンスの 違 いに 着 目 Javaヒープ 構 成 Eden New Survivor 業 務 プログラム 使 用 領 域 Old J2EEサーバ が 使 う 領 域 New 領 域 用 の 退 避 領 域 格 納 される インスタンス 短 命 なインスタンス (トランザクション 処 理 で 使 用 するメモリなど) 長 命 なインスタンス (セッション 情 報 ) J2EEサーバ が 使 う 領 域 New 領 域 用 の 退 避 領 域 クライアント ログオフ 後 もセッション 情 報 が 残 存 蓄 積 してFullGCが 発 生 クライアント Hitachi, Ltd. 2008. All rights reserved. 18
3.1 FullGC 発 生 間 隔 の 見 積 もり 19 Hitachi, Ltd. 2008. All rights reserved.
3.1 FullGC 発 生 間 隔 の 見 積 もり メモリの 算 出 に 必 要 な 情 報 1セッションの 処 理 情 報 セッション 情 報 サイズ 1 秒 あたりのログイン 数 最 大 同 時 ログイン 数 FullGCの 許 容 発 生 間 隔 ( 要 件 ) メモリサイズの 見 積 もり 手 順 1. セッション 情 報 の 蓄 積 によるFullGC 発 生 間 隔 の 算 出 2. 業 務 プログラム 使 用 領 域 サイズの 算 出 3. 最 大 同 時 ログイン 数 の 考 慮 Hitachi, Ltd. 2008. All rights reserved. 20
3.1 FullGC 発 生 間 隔 の 見 積 もり 1. セッション 情 報 の 蓄 積 によるFullGC 発 生 間 隔 の 算 出 < 例 >Oldの 業 務 プログラム 使 用 領 域 =120MB セッション 情 報 サイズ=/セッション 1 時 間 の 想 定 ログイン 数 は600 件 (10 分 間 では100 件 ) 想 定 ログ イン 数 = 100 件 Old (120MB) FullGC 発 生 120 分 (2 時 間 ) Hitachi, Ltd. 2008. All rights reserved. 21
3.1 FullGC 発 生 間 隔 の 見 積 もり 2. 業 務 プログラム 使 用 領 域 サイズの 算 出 FullGCの 発 生 間 隔 Oldの 業 務 プログラム 使 用 領 域 サイズOld 1 秒 あたりの 想 定 ログイン 数 Login セッション 情 報 サイズM FullGCの 発 生 間 隔 = Old/(Login M) < 計 算 例 > Oldの 業 務 プログラム 使 用 領 域 サイズ120(MB) 1 秒 あたりの 想 定 ログイン 数 600/3600( 件 / 秒 ) セッション 情 報 サイズ0.1(MB) 600 FullGCの 発 生 間 隔 = 120MB/( ) = 7200 秒 120 分 3600 上 記 の 条 件 で 計 算 した 場 合 Oldの 業 務 プログラム 使 用 領 域 サイズが120MBでは 120 分 に1 回 発 生 Hitachi, Ltd. 2008. All rights reserved. 22
3.1 FullGC 発 生 間 隔 の 見 積 もり 3. 最 大 同 時 ログイン 数 の 考 慮 < 例 > 最 大 同 時 ログイン 数 =300 件 Oldの 業 務 プログラム 使 用 領 域 =120MB 1 時 間 の 想 定 ログイン 数 は600 件 (10 分 間 では100 件 ) セッション 情 報 サイズ=/セッション Old (120MB) 想 定 ログイン 数 =100 件 1 回 目 の FullGC 発 生 120 分 (2 時 間 ) Hitachi, Ltd. 2008. All rights reserved. 23
3.1 FullGC 発 生 間 隔 の 見 積 もり 3. 最 大 同 時 ログイン 数 の 考 慮 < 例 > 最 大 同 時 ログイン 数 =300 件 Oldの 業 務 プログラム 使 用 領 域 =120MB 1 時 間 の 想 定 ログイン 数 は600 件 (10 分 間 では100 件 ) セッション 情 報 サイズ=/セッション Old (120MB) 想 定 ログイン 数 =100 件 FullGC 発 生 時 に 使 用 中 のセッション 情 報 は 消 されずに 残 る 1 回 目 の FullGC 発 生 最 大 同 時 ログイン 数 (300) 残 る 可 能 性 がある Hitachi, Ltd. 2008. All rights reserved. 24
3.1 FullGC 発 生 間 隔 の 見 積 もり 3. 最 大 同 時 ログイン 数 の 考 慮 < 例 > 最 大 同 時 ログイン 数 =300 件 Oldの 業 務 プログラム 使 用 領 域 =120MB 1 時 間 の 想 定 ログイン 数 は600 件 (10 分 間 では100 件 ) セッション 情 報 サイズ=/セッション Old (120MB) 想 定 ログイン 数 =100 件 2 回 目 の FullGC 発 生 90 分 許 容 間 隔 の2 時 間 が 経 たないうちに 2 回 目 のFullGCが 発 生 最 大 同 時 ログイン 数 分 の 情 報 サイズは 余 分 に 確 保 しておく 必 要 がある Hitachi, Ltd. 2008. All rights reserved. 25
3.1 FullGC 発 生 間 隔 の 見 積 もり 3. 最 大 同 時 ログイン 数 の 考 慮 最 大 同 時 ログイン 数 セッション 情 報 サイズ を 加 えたサイズを 確 保 する < 計 算 例 > 最 大 同 時 ログイン 数 分 の 情 報 サイズ=300 =30MB Old(120MB) Old(30MB) 必 要 なOldの 業 務 プログラム 使 用 領 域 サイズ =セッション 情 報 の 蓄 積 から 求 めた 必 要 サイズ+ 最 大 同 時 ログイン 数 分 の 情 報 サイズ ここでは 120MB+30MB=150MB 150MBの 業 務 プログラム 使 用 領 域 サイズが 必 要 Hitachi, Ltd. 2008. All rights reserved. 26
3.2 Javaヒープサイズの 見 積 もり 27 Hitachi, Ltd. 2008. All rights reserved.
3.2 Javaヒープサイズの 見 積 もり Javaヒープサイズの 設 定 必 要 なOld 領 域 サイズが 確 保 できるJavaヒープのサイズを 見 積 もる Javaヒープの 内 訳 は 比 率 が 決 まっているため 必 要 なOld 領 域 サイズから, 必 要 なJavaヒープサイズを 求 められる Javaヒープの 内 訳 1 2 Eden New Survivor (S1) Survivor (S2) 業 務 プログラム 使 用 領 域 Old J2EEサーバ が 使 う 領 域 New 領 域 用 の 退 避 領 域 8 1 1 100MB ( 固 定 ) New 領 域 と 同 じ 大 きさ Old 全 体 ー(J2EEサーバーが 使 う 領 域 +New 領 域 のサイズ) この 比 率 はデフォルト 値 である New 領 域 の 比 率 のデフォルト 値 はプラットフォームによって 違 う Hitachi, Ltd. 2008. All rights reserved. 28
3.2 Javaヒープサイズの 見 積 もり 計 算 例 要 件 FullGCの 許 容 発 生 間 隔 要 件 を 満 たす 領 域 サイズ Oldの 業 務 プログラム 使 用 領 域 サイズ 2 時 間 に1 回 150MB Old 使 用 領 域 サイズから 必 要 なJavaヒープサイズを 求 める Hitachi, Ltd. 2008. All rights reserved. 29
3.2 Javaヒープサイズの 見 積 もり Oldの 業 務 プログラム 使 用 領 域 を150MB 確 保 できるJavaヒープサイズは? Eden New Survivor 業 務 プログラム 使 用 領 域 Old J2EEが 使 う 領 域 Newの 退 避 領 域 250MB 150MB 固 定 100MB 250MB Old 領 域 = (150MB+100MB+ New 領 域 と 同 じ 大 きさの 退 避 領 域 ) New 領 域 Old 領 域 = 12 (150MB+100MB)はNew 領 域 と 同 じ 大 きさ Javaヒープサイズ = 250MB+500MB = 750MB Hitachi, Ltd. 2008. All rights reserved. 30
4 Cosminexus(コズミネクサス コズミネクサス)での 取 り 組 み 31 Hitachi, Ltd. 2008. All rights reserved.
4. Cosminexusでの 取 り 組 み(1) -パフォーマンス 見 積 もりシート- パフォーマンス 見 積 もりシート を 用 いた 見 積 もり 数 値 の 検 討 赤 枠 の 項 目 の 一 部 を 入 力 し サイジングした 数 値 を 検 討 確 認 する Hitachi, Ltd. 2008. All rights reserved. 32
4. Cosminexusでの 取 り 組 み(2) - 予 期 せぬFullGC 多 発 の 検 知 - リクエスト 集 中 により 使 い 捨 てオブジェクトが 大 量 に 生 成 されFullGCが 多 発 し システムがスローダウンしてしまう 問 題 を 何 とかしたい ポイント FullGCの 多 発 を 検 知 して 自 動 的 に 回 避 アクションを 取 ることが 可 能 例 えば,FullGCの 多 発 を 検 知 し 自 動 的 にリクエストの 入 口 を 絞 り システムのスローダウンを 防 ぐことができる アプリケーション サーバ フルGC 多 発 内 部 的 にFullGCの 回 数 を 取 得 動 的 にリクエストの 入 り 口 を 絞 ることでシステムのスロー ダウンを 回 避 アプリケーション サーバ 正 常 なフルGC アプリケーション サーバ 正 常 なフルGC Hitachi, Ltd. 2008. All rights reserved. 33
4. Cosminexusでの 取 り 組 み(3) -FullGC 発 生 によるスローダウンの 回 避 - FullGC 発 生 によるスローダウンを 事 前 に 検 知 して 回 避 したい ポイント FullGCの 発 生 を 事 前 に 検 知 し 自 律 的 に 再 起 動 することで トラブルを 未 然 に 防 止 セッション 情 報 を 引 継 ぐため, 業 務 を 継 続 することができる 負 荷 分 散 機 正 常 運 転 サーバA サーバB セッション の 保 存 セ ッ シ ョ ン 管 理 負 荷 分 散 機 サーバA サーバB Full GCの 予 兆 あり! セ ッ シ ョ ン 管 理 負 荷 分 散 機 自 律 的 に サーバを 再 起 動 して 問 題 を 回 避 プロセス 再 起 動 サーバA サーバB セ ッ シ ョ ン 管 理 振 分 け 定 義 変 更 セッション の 回 復 Hitachi, Ltd. 2008. All rights reserved. 34
4. Cosminexusでの 取 り 組 み(4) -メモリリーク 原 因 の 特 定 - メモリリークしているが 原 因 が 特 定 できない ポイント メモリの 解 放 モレ(オブジェクト 参 照 の 解 除 モレ)の 原 因 を 容 易 に 追 求 する ことが 可 能 本 番 環 境 で 発 生 した 時 点 でサーバーを 再 起 動 することなく 情 報 を 取 得 することができるため テスト 環 境 では 再 現 が 困 難 なメモリリーク の 不 具 合 を 早 期 に 解 決 1 領 域 単 位 のメモリ 消 費 量 の 把 握 領 域 aが 多 くの メモリを 消 費 している ことを 確 認 Java VMメモリ 空 間 モジュール1 領 域 a モジュール2 領 域 b 2 領 域 を 保 持 している モジュールを 把 握 モジュール1が 領 域 a を 保 持 している 仕 様 /バグを 調 査 ( ) 実 際 は 領 域 /モジュールともJavaのクラスインスタンス Total Size of of Instances ----------------------- Size Instances Class 1437424 15809 [Ljava.lang.Class; 525120 7408 java.util.hashmap$entry 502000 7094 java.util.hashmap 500248 7012 [Ljava.util.HashMap$Entry; 486336 4017 java.lang.ref.softreference 394760 4658 java.util.hashset 394328 4648 java.lang.shutdown$wrappedhook Reference of of class classc ------------------------- classa classx ------ classb classc classd classx ------ classe classa classx classcをポイントしているすべての クラスが 一 覧 として 出 力 される Hitachi, Ltd. 2008. All rights reserved. 35
5 デモンストレーション 36 Hitachi, Ltd. 2008. All rights reserved.
5. メモリリーク 調 査 デモ 入 力 した 文 章 の 単 語 数 をカウントするデモプログラム 単 語 を 数 えたい 文 章 を 入 力 リクエスト dopost() new WordCount(); ユニークな 単 語 ごとに WordCount 生 成, 登 録 String J2EEサーバ byte[] ユニークな 単 語 毎 にリークさせる メモリサイズを 入 力 単 語 ごとに カウント wc DemoHashMap word b DemoByteArray WordCount Total Unique EachWord buffer 総 単 語 数 ユニークな 単 語 数 個 々の 単 語 数 レスポンス DemoServlet wc DemoArrayList DemoServlet.class allwords WordCount.class 自 インスタンスを staticメンバに 保 持 Hitachi, Ltd. 2008. All rights reserved. 37
5. メモリリーク 調 査 デモ WordCountクラスの 分 析 package demo; package demo; import java.util.list; import java.util.list; import demo.base.demoarraylist; import demo.base.demoarraylist; import demo.base.demobytearray; import demo.base.demobytearray; WordCountクラス public class WordCount { public class WordCount { private static List allwords = new DemoArrayList(); private static List allwords = new DemoArrayList(); private String word; private String word; private int count; private int count; private DemoByteArray buffer; private DemoByteArray buffer; public WordCount(String word, int size) { public WordCount(String word, int size) { allwords.add(this); allwords.add(this); this.buffer = new DemoByteArray(size); this.buffer = new DemoByteArray(size); this.word = word; this.word word; this.count = 1; this.count = 1; } } ( 以 下 省 略 ) ( 以 下 省 略 ) デモプログラムの 参 照 構 造 dopost() wc DemoHashMap DemoServlet String word WordCount buffer wc DemoArrayList byte[] b DemoByteArray StaticメンバのDemoArrayListに 自 インスタンスを 保 持 保 持 したインスタンスを 解 放 せず 見 直 し 対 象 allwords WordCount.class Hitachi, Ltd. 2008. All rights reserved. 38
5. メモリリークの 事 例 Javaヒープ 領 域 の 使 用 量 -Xmxの 指 定 値 OutOfMemoryError (メモリ 不 足 ) 発 生 Hitachi, Ltd. 2008. All rights reserved. 39
まとめ 適 切 なメモリサイズを 見 積 もることで システムスローダウンの 要 因 であるFullGCを コントロールすることが 可 能 見 積 もりよりも 過 剰 なリクエストが 殺 到 した 時 の 緊 急 避 難 的 な 処 置 は アプリケーションサーバー 側 で 対 処 する 仕 組 みがある(とはいえ 万 能 ではない) メモリリークなどの 不 良 によって メモリが 圧 迫 される 場 合 もある これについての 調 査 方 法 は 確 立 されている Hitachi, Ltd. 2008. All rights reserved. 40
他 社 所 有 名 称 に 対 する 表 示 Cosminexus ホームページ http//www.hitachi.co.jp/cosminexus/ http//www.cosminexus.com/ 謝 辞 および 他 社 所 有 名 称 に 対 する 表 示 他 社 所 有 名 称 に 対 する 表 示 Java 及 びすべてのJava 関 連 の 商 標 及 びロゴは, 米 国 及 びその 他 の 国 における 米 国 Sun Microsystems, Inc.の 商 標 または 登 録 商 標 です その 他 記 載 の 会 社 名 製 品 名 は それぞれの 会 社 の 商 号 商 標 もしくは 登 録 商 標 です Hitachi, Ltd. 2008. All rights reserved. 41