Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XPagesのパフォーマンス・チューニング

2,412 views

Published on

チームスタジオ様主催 月刊 Notes/DominoWebセミナー 7月号
で発表した内容です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

XPagesのパフォーマンス・チューニング

  1. 1. XPages のパフォーマンス・チューニング 月刊 Notes/DominoWebセミナー 7月号 2015年7月10日 リコーITソリューションズ株式会社 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 1 海老原 賢次 リコーITソリューションズ株式会社 鹿児島事業所 ブログ:XPagesで行こう! http://take-the-xpages.blogspot.jp/
  2. 2. 資料をslideshareで公開しています  Slideshareで公開していますので、後ほど振り返りでご利用ください。  http://www.slideshare.net/kenjiebihara71 または または 2015/7/10 Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] 2 XPagesで行こう! 検索 slideshare ebihara kenji 検索
  3. 3. 2015/7/10 3 本日のコンテンツ Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] Domino/XPagesの設定の見直し2 チューニングの観点1 メモリの有効活用3 スコープの活用4
  4. 4. 2015/7/10 4Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] Domino/XPagesの設定の見直し2 チューニングの観点1 メモリの有効活用3 スコープの活用4
  5. 5. チューニングの観点  メモリ効率の向上  処理効率の向上  ※これらは、設定によっては互いに相反する可能性があります。  ※それぞれ程度をわきまえる必要があります。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 5
  6. 6. メモリ効率の向上  Domino/XPagesの設定見直し  XPage設計、プログラム内でのメモリの節約 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 6
  7. 7. 処理効率の向上  スコープの活用  SSJS / CSJS の使い分け(今回は割愛) 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 7
  8. 8. ツールを使ってボトルネックを調べる XPages Tool kit –http://goo.gl/xMckjh –CPUプロファイラ –バックエンドクラスのプロファイラ –メモリプロファイラ 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 8
  9. 9. 2015/7/10 9Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] Domino/XPagesの設定の見直し2 チューニングの観点1 メモリの有効活用3 スコープの活用4
  10. 10. notes.ini の設定 2015/7/10 10
  11. 11. Javaのメモリ設定  Java heap(ヒープ) size –Java heap とは、Java が利用するメモリ領域の一つ。 –SSJSで作成されるオブジェクト(NotesDocument 、 変数、 XPageの情報など)が保存される。 –サーバーのメモリをいくら積んでも、この値の設定を変えないと、 意味がない。 2015/7/10 11
  12. 12. notes.ini の設定  HTTPJVMMaxHeapSize – DominoのHTTPプロセスで使用される、Javaヒープサイズ。 – デフォルト値が32/64bitでこんなに違う(8.5.3以降で確認) • 32bit版・・・64MB • 64bit版・・・1024MB ※32bitにくらべて64bitの方がメモリを多く消費する。(場合によっては2倍以上) →デフォルト値の違い と プロセスの消費メモリ増加。 ※移行したら、メモリのサイズの見直しが必要。 2015/7/10 12
  13. 13. notes.ini の設定  HTTPJVMMaxHeapSizeSet = 1 に設定しないと、デフォルト値 に戻る事がある。 – デフォルトで設定されている・・・はずですが要確認。(Domino 9.0.1で確認) 2015/7/10 13
  14. 14. 動作時の設定の確認  NSDコマンドで出力できるログで設定値、使用量が確認できる 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 14 <@@ ------ Notes Memory Summary -> Analysis -> Private Memory Breakdown :: (nhttp: 8b0) (Time 09:53:05) ------ @@> Domino Memory 38.11 MB (2.97%) JVM Heap Memory 1024.00 MB (79.73%) Native Allocations 222.25 MB (17.30%)
  15. 15. 初回アクセス時のロード  XPagesはDBを配置・保存した時にコンパイル(実行状態)され ず、初回アクセス時にコンパイルされる。  なので、初めのアクセス、または アプリケーション・タイムアウト後にアク セスした場合、ページが表示されるまで数秒~数十秒かかります。  これを notes.ini の設定で回避することができます。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 15
  16. 16. 初回アクセス時のロード  XPagesPreload = 1 –XPagesの実行環境をHTTPサービス起動時に読み込む。  XPagesPreloadDB = {DBパス} –指定したDBのXPagesがHTTPサービス起動時にコンパイル される  メモリを消費するので、使用頻度が低いDBは 対象外にすべき。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 16
  17. 17. XPagesの設定 2015/7/10 17
  18. 18. セッションの概念 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 18 Aさんセッション1 Bさんセッション Aさん Bさん 画面1 画面1 画面2 画面1 画面1 画面2 更新 遷移 画面3 別ウィンドウ 表示 Aさんセッション2画面1 画面1 画面2 更新 遷移 画面3 遷移 別ブラウザでアクセス
  19. 19. 各種タイムアウト 2015/7/10 19 指定した時間以上アクセスがない場合、XPagesのコンパイル情報や、 Application Scopeの値がメモリから削除される。 セッション毎に指定した時間以上アクセスがない場合、 そのセッションのセッションスコープや認証情報がメモリから削除される 大きいと利便性が向上するが、アクセスユーザー が多い場合、より多くのメモリを消費する
  20. 20. ページの永続性とは  ページにアクセスした時に、各コントロールの各プロパティの値、 状態を メモリ または ディスク に保存する。 ボタンのクリックイベント等で、全体更新、部分更新でSSJS の処理(ポストバック)を行うときに、必要となる。  コントロールが多いほどメモリを多く消費する。  また、ViewScopeに保存された値も同様。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 20
  21. 21. ページの永続性 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 21 パフォーマンス 低 ーーーーーーーーーーーー 高 メモリ負荷 備考 ページをメモリに保存する 低 ーーーーーーーーーーー★ 高 ページをディスク上に保存する 低 ★ーーーーーーーーーーー 高 ディスク領域を消費する メモリに現在のページのみを保存する 低 ーーーーー★ーーーーーー 高
  22. 22. ページ永続性モード 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 22 パフォーマンス 低 ーーーーーーーーーーーー 高 メモリ負荷 備考 全ページコンテンツ 低 ーーーーーーーーーーー★ 高 ツリー全体、そして構成後の変更のみ 低 ーーーーーーーー★ーーー 高 ツリーの構成後の変更のみ 低 ーー★ーーーーーーーー 高 なし。読み取り専用ページで有効 パフォーマンス 低 ーーーーーーーーーーー★ 高 メモリ負荷 低 ★ーーーーーーーーーーー 高 ポストバックの処理が使えない
  23. 23. ページの永続性データが消える条件  ページを開いていき、メモリ内の最大ページ数を超 えた場合、古いページの情報から削除される。 –同じページでも、リンクなどでのページ遷移もカウント される。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 23
  24. 24. 2015/7/10 24Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] Domino/XPagesの設定の見直し2 チューニングの観点1 メモリの有効活用3 スコープの活用4
  25. 25. XPagesの設計 2015/7/10 25
  26. 26. 不要なサーバーコントロールを使用しない  サーバーコントロールはHTML要素(タグ)より遅く、メモリを多く消費する  <div></div>  <xp:panel></xp:panel> – どちらもブラウザでは<div></div>として出力される。 – <xp:**>で始まるコントロールは、プロパティの値をサーバーメモリーに格納し、ページを表示する ときに、Javaのオブジェクトを生成する。 – その分、メモリにも速度にも影響がある。 – SSJSで、panelを操作しないのであれば、divを使うべき。  テキストボックスコントロールを100個配置したページと HTMLのinput タグを100個配置したページを を表示した時の速度を計測 2015/7/10 26
  27. 27. 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 27 Xpagesのコントロールを100個 inputタグを100個 メモリの消費量も処理速度も微々たるものだが、ユーザー数、表示するページ数が 多くなればなるほど消費が大きくなる。
  28. 28. 静的なページはViewStateを使わない  ViewStateは、ポストバックの処理に必要なもの。  表示するだけの静的なページは、 ViewState を nostate にすることでメモリ の消費を抑える事ができる。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 28
  29. 29. 2015/7/10 29Version: [0.1.0] Classification: Internal Owner: [EBIHARA Kenji] Domino/XPagesの設定の見直し2 チューニングの観点1 メモリの有効活用3 ライフサイクルとスコープの活用4
  30. 30. コントロールのプロパティの処理 2015/7/10 30
  31. 31. コントロールのプロパティで処理させない  コントロールのプロパティの式は、ページを表示する処理で何度も呼ばれること がある。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 31 例)コントロールの”可視”プロパティを 値の計算 でSSJSを記述 そのSSJSで、ビューを参照する処理を記述 1回のアクセスでDB、ビュー、文書へのアクセスが複数あることあわかる
  32. 32. あらかじめ値を取得して ViewState で渡す 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 32
  33. 33. スコープの理解と利用 2015/7/10 33
  34. 34. スコープの理解と正しい活用  スコープの種類は4種類 –Application Scope –Session Scope –View Scope –Request Scope  それぞれ、いつ、いくつ生成されて、いつ破棄されるのか、 理解しておく必要がある。 2015/7/10 Version: [###] Classification: Internal Owner: [Insert name] 34
  35. 35. Aさんセッション ApplicationScope Bさんセッション Aさん Bさん 画面1 画面1 画面2 画面1 画面1 画面2 更新 遷移 画面3 遷移 ApplicationScope
  36. 36. Aさんセッション SessionScope Bさんセッション Aさん Bさん 画面1 画面1 画面2 画面1 画面1 画面2 SessionScope 更新 画面1 遷移 遷移 リンクなどで別ウィンドウで表示した、画面でも SessionScopeは共有される SessionScope
  37. 37. Aさんセッション ViewScope Aさん 画面1 画面1 画面2 更新 ViewScope Bさんセッション ViewScope Bさん 画面1 画面1 画面2 更新 ViewScope 画面1 ViewScope 遷移 遷移 画面は同一でも、新たにページを開いた場合は、別のスコープ 画面1 ViewScope ViewScope
  38. 38. Aさんセッション RequestScope Aさん 画面1 画面1 画面2 更新 Bさんセッション Bさん 画面1 画面1 画面2 更新 画面1 遷移 遷移 ページをレンダリングしたらメモリから削除される 画面1 遷移 RequestScope RequestScope RequestScope RequestScope RequestScope RequestScope RequestScope RequestScope
  39. 39. スコープ 発生条件 削除条件 Application Scope • DBをビルドまたは、HTTPタスクを起 動して初めてアクセスが有った時 • アプリケーションタイムアウト後に初め てアクセスが有った時 • XSPのプロパティでアプリケーショ ンのタイムアウトに指定した時間 以上、どのセッションからもアクセ スがない時 • HTTPタスクを再起動またはDB をビルドした時 Session Scope • ユーザーがブラウザを起動してから初 めてXPagesにアクセスした時 • ユーザーがセッション切れ後に XPagesにアクセスした時 • セッションが終了した時 • XSPのプロパティでセッションタイ ムアウトに指定した時間以上ア クセスがない時(セッションが終 了する)
  40. 40. スコープ 発生条件 削除条件 View Scope • ユーザーがXPagesにアクセスし た時 • XSPのプロパティのサーバー ページの永続性の設定で 最大ページに達してキュー から追い出された時 • セッションが終了した時 Request Scope • 画面の初期処理時 • 画面更新の初期処理時 • レスポンスをクライアントに返 した時
  41. 41. スコープ 利用例 Application Scope • どのユーザーにも共通で使用する情報を保持。 • DB独自の設定文書の内容など Session Scope • セッション毎に共通で持っておく情報を保持。 • SSJSの”session”オブジェクトで取得できないユーザー 毎の情報、漢字氏名、所属など。 • 画面間の値の受け渡しには使わないほうがよい。(別 ウィンドウでもその値が参照されるため) 画面間の値の受け渡しには、URLパラメータを利用す る。
  42. 42. スコープ 利用例 View Scope • 画面が開始してから終了するまで保持しておく情報。 • ユーザーには表示しないが、画面の情報として保持しておきたい値など。 “非表示の入力”コントロールで入れておく方法もあるが、このコントロール は“renderd”プロパティをfalseにしないと、表示はされないがHTML内に 記載されるので、ユーザーから見える。またユーザーが勝手に書き換えもで きてしまう。 メモリ効率の面からもViewScopeで管理するのが好ましい。 その場合、文書への書き戻し処理を忘れないように。 Request Scope • リクエストがあってからコントロールを表示するまで保持する情報。 • beforeRenderResponse等でViewから文書を取得し、各コントロー ルでその文書を参照する場合など。 画面内の処理の変数的な扱いができる。 Scopeの利用シーンでは、これでよい場合はほとんどだったりする。
  43. 43. var common = {}; common.getSysSetting = function(){ //applicationScopeからシステム設定を取得 var setting = applicationScope.get('sysSetting'); //ない場合は、Viewから文書を取得してシステム設定を作成する if(!setting){ var sysView = database.getView('sysView'); var doc = sysView.getFirstDocument(); setting = { //JavaScriptのオブジェクトに展開 title: doc.getItemValueString('title'), version: doc.getItemValueString('version') }; //applicationScopeに格納する applicationScope.put('sysSetting', setting); } return setting; } • セッションで共通で閲覧するシステム設定文書を、ApplicationScopeを利用して Viewを参照することなく取得する例。 • ApplicationScopeはアクセスがないと消去されるので、ApplicationScopeにあるか チェックし、なければ取得してApplicationScopeに格納する。
  44. 44. ご視聴ありがとうございました。 2015/7/10 48

×