問題タブ [ems]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 動的配列を使用すると、Linux 用 RAD サーバーでメモリ リークが発生する
私は Delphi 10.3.1 を使用しており、Apache 2.49 の Linux Ubuntu 18.04 で実行される RAD サーバー リソース/エンドポイント用のサンプル アプリケーションを生成しました。私のアプリケーション ProcessArray は、12 個の数値フィールドのレコードを構成要素とする 2 つの動的配列を作成するだけです。これらのダイナミクス配列のサイズは、実行時にエンドポイントを呼び出すときに定義されます。実行中、このアプリケーションは期待どおりに RAM メモリを割り当てますが、終了時に RAM の割り当てを解除しません。
配列のサイズが 2000 万または 3000 万に及ぶ連続した呼び出しの場合、状況はさらに悪化します。実行が終了した後でも、呼び出しごとに約 1GB が割り当てられ、SWAP 領域が使用され、マシンが非常に遅く不安定になるためです。
呼び出しの数によっては、これ以上実行できず、「メモリ不足」のエラー メッセージが返されます。
この問題は、Windows 上で実行されている RAD サーバーに配置する場合には発生しません。
私のコードを参照してください:
リソース/エンドポイント コードは次のとおりです。
使用法: http://myLinuxUbuntuServer/ems-server/ProcessArray/30 (3000 万のアレイ サイズ)
これが Ubuntu Linux/Apache で実行されている RAD Server 10.3.1 に本当に関連しているのか、それとも私のコードに何か欠けているものや間違っているものがあるのか、私にはまだ疑問があります。
これは Delphi 10.3.2 の新しいリリースでも発生しますか? (アップグレードに進む前に、誰かがこのバージョンをインストールしていて、私のためにテストしてくれるとありがたいです)
これは Ubuntu 以外の Linux ディストリビューションでも発生しますか?
皆さんの助けに感謝します!ありがとう。
Linux サーバーの htop コマンドのスクリーンショット
http://myLinuxUbuntuServer/ems-server/ProcessArray/20を 6 回実行した後の Linux サーバー htop のスクリーンショット

実行が終了した後も RAM が 5.30GB 割り当てられていることに注意してください。このエンドポイントへのさらなる呼び出しは、5.30GB RAM から開始され、非常に迅速に合計 RAM サイズ (8GB) に達して「メモリ不足」エラーを生成するか、SWAP 領域を使用してマシンが不安定になり遅くなります!
.dproj ファイルの追加: Proj_ProcessArray.dproj
上記のユニット UntStru で公開されているものと同じユニットを使用する、Linux 64 用のコンソール アプリケーション ProcessArrayConsole の追加
このコンソール アプリケーションを同じ Linux サーバー上で実行し、./ProcessArrayConsole 30 を数回呼び出したところ、実行後に RAM が完全に解放されました。
そのため、EMS Apache モジュールまたは EMSDevServer (スタンドアロン) を使用する場合にのみ、この割り当て解除の問題が発生するようです。
唯一の例外は、3,000 万サイズの呼び出しを 3 つ同時に実行したときに発生しました。この場合、合計 8GB の RAM が消費され、SWAP 領域が使用され始めましたが、achie が非常に遅くなり、3 つのプロセスが終了するまでに長い時間がかかっています。(12 分後も実行中) .
iis - 本番環境で API 呼び出しの URL に emsserver/emsserver.dll を使用する
RAD Studio の EMS サーバー機能を利用するアプリケーションを作成しました。開発は完了し、本番環境でテストされています。EMS サーバーのドキュメントには、API 呼び出しを行うには、emsserver.dll を URL に含める必要があることが示されています。
https://{ホスト名}/emsserver/emserver.dll/API/Login?token={TokenValue}
私が遭遇したほとんどの API には、URL に埋め込まれた dll がありません。
https://{ホスト名}/API/Login?token={TokenValue}
API 呼び出しはそのままで問題なく動作するため、これは大した問題ではありません。URL の emsserver/emsserver.dll 部分をデフォルトにするために、RAD Server または IIS で使用できるプロパティまたは設定があるかどうかを考えていました。
