2

(メモリ内の)セッションにStandardManagerを使用して、Tomcat5.5でベンダー提供のWebアプリを実行しています。セッションは非常に大きくなる可能性があるため(2,000万以上)、ヒープスペースの不足は深刻な懸念事項です。ユーザーは、可能であればセッションを数時間維持したいと考えていますが、ヒープスペースが不足するよりもセッションを排除したいと考えています。ベンダーがセッション化されたオブジェクトにSerializableを適切に実装したようには見えないため、永続的なセッションマネージャーの実装に切り替えることはできません。

Tomcatでは、マネージャーのセッションの総数を制限するmaxActiveSessionsプロパティを設定できます。ただし、その制限に達すると、既存のセッションの有効期限が切れるまで、新しいセッションを作成できません。最も最近使用されていないセッションを最初に壊したいと思います。

理想的には、ヒープ使用量が「Xmx」設定に近づいたときに、無条件に期限切れになるほど古くない場合でも、最近使用されていないセッションを期限切れにします。非常に古いTomcat開発者のメーリングリストスレッドは、これによりサービス拒否攻撃*が可能になる可能性があることを示唆していますが、このアプリケーションは企業ネットワーク内でのみ利用可能であるため、私たちは心配していません。

StandardManagerを拡張してprocessExpires()をオーバーライドし、ヒープ使用量が最大値の85%を超える場合は、追加のセッションをクローバーすることを考えました。ただし、これは実際には少し問題があるようです。ヒープの多くが参照されておらず、ガベージコレクターが大量のオブジェクトを収集して(実行するのが面倒な場合)、ヒープを最大の50%に減らすことができる場合はどうなりますか?私は不必要にセッションを期限切れにするでしょう。積極的なガベージコレクション設定を使用すれば、このリスクを軽減できると思います。また、セッションを期限切れにすることでどれだけのメモリを節約したかをどのように知ることができますか?確実に知るには、GCサイクルを数回待つ必要があります。おそらく、保守的なアプローチを取り、メモリが許容可能なしきい値を下回るまで、バックグラウンドプロセスサイクルごとに最大Nセッションを削除することができます。

誰かがこの問題を解決しましたか?短期的な修正として、ヒープサイズを増やしていますが、そのバンドエイドにも欠点があります。

  • 彼らは、ログイン前にセッションが作成される公開サイトを参照していました。誰かが多くの新しいセッションを作成させ、実際に使用されているセッションを混雑させる可能性があります。

更新:システムのアーキテクチャを実際に制御することはできません。特に、セッションの使用を減らすことはできません。ただし、コンテナは好きなだけ操作できます。ただし、Tomcatは、ベンダーがサポートしている唯一のオープンソースサーブレットコンテナです。

4

4 に答える 4

4

あなたのオプションは次のようです:

  1. アイドル セッションのタイムアウトを減らします。
  2. セッションを永続的にします (おそらくユーザーがログインした後のみ)。
  3. 各セッション オブジェクトが使用するメモリを削減します。
  4. Tomcat インスタンスのメモリを増やします。
  5. サービスの複数のインスタンスを実行し、その前にロード バランサーを配置します。

技術的な観点からは、3 が最善の解決策です ... それが機能する場合。他のすべてにはマイナス面があります。

記憶を使って巧妙なことをするのは、応急処置にすぎません。ユーザーの観点からは、サイトの動作が理解しにくくなります。さらに、ユーザーベース/トラフィックが増加傾向にある場合、持続可能な解決策を見つけるという問題を先延ばししているだけです.

于 2009-07-29T01:23:05.617 に答える
1

JVM の最大ヒープ サイズを増やしてみましたか?

指定されていない場合、デフォルトはわずか 64 MB です。これは、ほとんどの集中的/本格的な Web アプリケーションの小さい側にあると言えます。

Tomcat でこれを行う最善の方法は、次をsetenv.bat/に追加すること.shです。

export CATALINA_OPTS=-Xmx128m

(128mb よりも大きくしたい場合は、128 を任意の値に置き換えます。また、Windows / シェルの正しい構文に変更してください)

Tomcatのstartupおよびcatalinaシェル スクリプトには、このファイルが存在する場合に呼び出すロジックが組み込まれています。これは、Tomcat のインストールに設定する必要があるカスタム環境プロパティを指定するための「ベスト プラクティス」です。このファイルは、Tomcat のインストール/バージョン間で移植できるため、編集startup.shまたは直接するよりも、このファイルにプロパティを配置することをお勧めします。catalina.sh

このリンクにも興味があるかもしれません: 6 Common Errors in Setting Java Heap Size ( Tomcat で Java ヒープ サイズを設定する方法に関するセクションも最後にあります)。

于 2009-07-29T01:19:19.113 に答える
0

複数のTomcatインスタンスの前にapacheを配置してから、mod_jkを使用してそれらの間の負荷分散を行うことをお勧めします。

実際のクラスタリングなしでこれを実行できるため、セッション共有は問題になりません。

Mod_jkは堅実であり、インスタンスを使用されていないことなどとしてマークするための単純なGUIも提供します。

これは、レジリエンスなどの他の多くの利点ももたらします。私はこのセットアップを非常に大規模な公開サイトで個人的に使用しましたが、魅力的でした。

理想的な状況は、真のセッション共有を設定することですが、場合によってはこれがやり過ぎです。

ここを参照してください:

http://tomcat.apache.org/connectors-doc/generic_howto/quick.html

于 2009-07-29T10:54:14.030 に答える
0

問題を解決する必要があるのはあなたのベンダーであるという Stephen C の意見に同意します。ここで (驚くべきことに) 誰も言及していないことの 1 つは、ベンダーは未使用のセッション オブジェクトのクリーニングも検討する必要があるということです。

常に心に留めていない限り、セッションのサイズが肥大化するのは非常に簡単です-オブジェクトのサイズが気付かれずに肥大化するのを許してください-そして、これらのオブジェクトのリストがあるときに大きなセッション属性を持ちます-その後、それらを決してクリーンアップしません-アプリが大規模で、オブジェクト A、B、C、D、E、F のリストがアプリの特定のセクションに表示されているが、一掃されていない場合、それはベンダーが対処していない基本的なハウスキーピングの問題です。

たとえば、アプリの他の部分に移動する webapp に「中央画面」はありますか? その場合、ベンダーは、この画面に入るときに、中央のページ/画面/ポータルからアクセスできる画面で収集され、セッションに詰め込まれたすべてのオブジェクトをクリーンアップする必要があります。

編集し、ページネーションを使用し、基準を満たすリスト全体をロードしない (ページネーションが基準の一部である場合を除く)

このコメントがあなたや他の人に役立つことを願っています。

于 2013-03-27T10:20:26.793 に答える