5

私たちは長い間メモリの問題を抱えていました。問題を再現する方法を最終的に追跡しましたが、何が原因で、どのように修正するのかわかりません。

Web アクセス可能な /controller ディレクトリに、送信と処理を処理する多数の cfc があります。メソッド引数なしで cfc が直接呼び出されると、サーバーはメモリを消費し始めます。

たとえば、http://www.domain.com/controller/LoginController.cfcのような URLは、タイムアウトになるまでブラウザで実行されます。/CFIDE はロックダウンされており、公開されていません

そのため、cfexplorer は使用できません (または使用できないはずです)。

FusionReactor を使用してインスタンスを監視します。当社のサーバーは 20GB のヒープ スペースに設定されています。アプリケーションをロードした後に新たに再起動すると、メモリは約 800MB 巡航します。

通常のトラフィックでは、メモリは通常のガベージ コレクションで 5 GB から 10 GB の間で変動します。しばらくすると、サーバーは最終的に 98% の容量に達します。そこに走る傾向がある

トラフィックの急増によってメモリ不足エラーが発生するまで、数時間または数日かかることもあります。ガベージ コレクションはメモリを回復せず、アクティブなメモリもありません

FusionReactor によって報告された実行時間の長いスレッド。サーバーを再起動するだけで回復します。

FusionReactor (インストールしたばかりで、最終的にこの問題についての洞察を得た方法です) を使用して、PermGen メモリ空間を調べていたところ、それが原因であることがわかりました

ヒープの 85%。これはまったく正しくないようでした。メモリ ダンプを実行し、Eclipse を介して MAP にロードして分析しました。メモリ内に 10 個のオブジェクトがあることがわかりました

1.7GB (1.7x10 は総ヒープの約 85%) を測定します。これらのオブジェクトは次のようになります。

Class Name |  Shallow Heap | Retained Heap | Percentage
byte[1769628928] @ 0x4d963b198  ...128.................POST......../controller/LoginController.cfc......../controller/LoginController.cfc........173.14.93.66........173.14.93.66........www.domain.com........443........HTTP/1.1.......;D:\websites\domain\system\controller\Lo...| 1,769,628,944 | 1,769,628,944 |   8.60%

そこで、サーバーの 1 つで CF を再起動しました。FusionReactor をチェックしたところ、メモリ使用量は見られませんでした。次に、ブラウザに移動し、最初に次のように cfc を呼び出しました。

http://www.domain.com/controller/LoginController.cfc?method=foo

これにより、onMissingMethod ハンドラーが適切にキックし、適切なエラー ページにリダイレクトし、サーバーへの影響はありませんでした。

しかし、これを呼び出す:

http://www.domain.com/controller/LoginController.cfc

ページがハングします。FusionReactor は、実行中のリクエストがあるにもかかわらず、アクティブなリクエストがないことを報告しています。これが、発生中に問題を特定できなかった理由です。さらに悪いことに、メモリを更新すると、アクティビティが報告されていない状態で、メモリが 10 分の 1 パーセントずつゆっくりと増加することがわかります。サーバーのタイムアウトは 5 分に設定されています。最終的には1.7GBで殺され、孤児になると思います。これによりサーバーがダウンすることはありませんでした。現在実行中のメモリがスパイクされただけで、ガベージ コレクションでは何も回復されません。これは、時間が経つにつれて、これらの URL へのランダムな呼び出しがゆっくりと噛み砕いてメモリを保持する理由を説明しているようです.

次に、複数のブラウザー タブから URL を呼び出しました。これにより、メモリがほぼ瞬時に 98% に急増しました。FusionReactor は、実行中のブラウザー タブが 15 を超えていたにもかかわらず、2 つの長時間実行された要求が 10 秒で上昇していることを示しました。スレッドを強制終了しても何も起こらないようです。サーバーを再起動するだけで問題が解決しました。

これで、問題 (PermGen ヒープで巨大な孤立したオブジェクトを作成するファントム スレッド) と、問題を再現する方法を具体的に特定できました。

どのように、またはなぜリクエストが cfc に直接行われるのか、私にはわかりません。おそらくボットまたは時折の奇妙なブラウザの動作.

すべての巨大なオブジェクトは、jrun.servlet.jrpp.ProxyEndpoint のインスタンスです。

この問題の具体的な原因とその修正方法を教えてください。

これは、Java 1.7.0_25 を実行する Win2003 サーバーの CF9.01 標準です。

ありがとう!

ヒープ ダンプの MAP 分析のスクリーンショット

4

3 に答える 3

1

おそらく、Application.cfc でonCFCRequestを使用して、この問題を監視できます。

オブジェクトは引き続き作成されますが、リクエストをログに記録できます。その後、CFABORTリクエストはそのトラックで完全に停止するはずです。

<cffunction name="oncfcRequest" returnType="void"> 
    <cfargument type="string" name="cfcname"> 
    <cfargument type="string" name="method"> 
    <cfargument type="struct" name="args"> 
    <cfif arguments.method IS "">
        <cflog .... />
        <cfabort />
    </cfif>
</cffunction>
于 2014-01-08T17:50:43.917 に答える