多数の CORBA サーバー プロセスを実行する Linux システム (kubuntu 7.10) があります。サーバー ソフトウェアは、メモリ割り当てに glibc ライブラリを使用します。Linux PC には 4G の物理メモリがあります。速度上の理由から、スワップは無効になっています。
データを処理する要求を受信すると、サーバー プロセスの 1 つが大きなデータ バッファーを割り当てます (標準の C++ 演算子 'new' を使用)。バッファ サイズはパラメータの数によって異なりますが、通常は約 1.2G バイトです。約 1.9G バイトまで可能です。リクエストが完了すると、「delete」を使用してバッファが解放されます。
これは、同じサイズのバッファを割り当てる複数の連続するリクエストに対して、またはリクエストが以前よりも小さいサイズを割り当てる場合にうまく機能します。メモリは問題なく解放されているように見えます。そうしないと、数回のリクエストの後、最終的にバッファ割り当ての試行が失敗します。いずれにせよ、KSysGuard などのツールを使用して、リクエストごとにバッファ メモリが割り当てられ、解放されていることがわかります。
この問題は、リクエストが以前よりも大きなバッファを必要とする場合に発生します。この場合、演算子 'new' は例外をスローします。最初の割り当てから解放されたメモリは、使用可能な空き物理メモリが十分にあるにもかかわらず、再割り当てできないかのようです。
最初の操作の後にサーバー プロセスを強制終了して再起動すると、より大きなバッファー サイズに対する 2 番目の要求が成功します。つまり、プロセスを強制終了すると、解放されたメモリがシステムに完全に解放されるように見えます。
ここで何が起こっているのかについて、誰かが説明できますか? ある種の断片化またはマッピング テーブル サイズの問題でしょうか? new/delete を malloc/free に置き換え、malopt を使用してメモリがシステムに解放される方法を調整することを考えています。
ところで-それが私たちの問題に関連しているかどうかはわかりませんが、サーバーは、処理要求ごとに作成および破棄される Pthreads を使用します。