2

サービス [セッション ベースのライフサイクル] として実行されている TCP/IP DataSnap サーバーは、メモリを継続的に消費し、接続がない場合でも最初のメモリ サイズに戻ることはありません。

犯人としての私のコードを排除するために、VCL [セッション ベースのライフサイクル] として実行される基本的な TCP/IP DataSnap サーバーをモデル化しました。このサーバー メソッド クラス [TDSServerModule] は、ネイティブ データ型を使用する基本的な数学関数のみを含みます [no作成または解放するオブジェクト]。

上記の DataSnap サーバーに非常に薄いクライアントで接続すると、同じ結果が得られます。メモリ使用量は、接続ごとに継続的に増加し、クライアントからサーバー側のメソッドを実行すると散発的に増加します。接続が閉じられると、DataSnap サーバーのメモリ使用量が減ることはありません [接続なしで 8 時間実行した場合でも]。

なぜこれが発生するのか、さらに重要なことにそれを削減する方法について何か提案はありますか?

RAD Studio XE2 Update 4 HotFix 1 を使用しています。

4

3 に答える 3

2

DataSnap に関する「必読」の記事を引用させてください。これは XE3 に関するものですが、ここのコードが XE2 でも機能することを願っています。

メモリ消費量

私が観察した問題の 1 つは、メモリ消費に関連していました。呼び出されたメソッドがまったく何もしないのに、Datasnap サーバーが大量のメモリを消費するのはなぜですか?

正確に説明する方法がわからないかもしれませんが、試してみます。基本的に、DataSnap は受信する HTTP 接続ごとにセッションを作成します。このセッションは 20 分後に破棄されます。つまり、テストの最初の 20 分間はメモリ消費量が増加するだけで、その後は安定する傾向があります。Datasnap がこれを行う理由がまったくわかりません。REST アプリケーションでは、デフォルト構成のこれらのセッションにはあまり意味がありません。もちろん、セッションは役に立ちますが、なぜそれがデフォルト設定なのか理解できません。実際、DataSnap にはそのための構成がありません。他の方法を選択することはできず、このセッション コントロールを使用する必要があるようです (ドキュメントはありません)。MORMot フレームワークにもセッション コントロールがありますが、それは構成可能であり、それほど多くのメモリを消費しません。

とにかく、この問題を回避する方法があります。Daniele Teti が彼のブログに記事を書いています。ここで紹介するソリューションは、彼がブログに掲載したものです。ありがとうダニエレ。

uses System.StrUtils, DataSnap.DSSession, Data.DBXPlatform;

function TServerMethods1.HelloWorld: String;
 begin

 Result := 'Hello World';
 GetInvocationMetaData.CloseSession := True;
end;

このメソッドを実行すると、セッションが終了し、メモリ消費量が少なくなります。もちろん、このセッションを作成および破棄するためのオーバーヘッドは依然として存在します。

したがって、XE2で可能であれば、すべてのサーバーメソッドを明示的なメモリクリーンアップで終了することが最善の方法のようです。その後、これらの記事をもう一度読んで、将来のスケーラビリティの課題に備えることをお勧めします。

于 2013-07-19T23:03:44.253 に答える