C++ で記述されたサーバー アプリケーションがあります。起動後、x86 Linux (Ubuntu 8.04、GCC 4.2.4) で約 480 KB のメモリを使用します。480 KB は過剰な量のメモリだと思います。サーバーはまだ何も実行しておらず、クライアントもサーバーに接続していません。(480 KB が大量のメモリであると考える理由を説明している以下のコメントも参照してください。) 初期化中にサーバーが行う唯一のことは、1 つまたは 2 つのスレッドの生成、いくつかのソケットのセットアップ、およびその他の単純なことです。非常にメモリ集約的です。
VM サイズではなく、実際のメモリ使用量について話していることに注意してください。アイドル状態のラップトップでサーバーの 100 個のインスタンスを起動し、サーバー インスタンスを起動する前後のシステム メモリの使用量を「空き」で測定することで測定しました。私はすでにファイルシステムのキャッシュなどを考慮に入れています。
いくつかのテストの後、サーバー自体が何もしない場合でも、C++ ランタイムの何かが原因でサーバーがこれだけ多くのメモリを使用しているように見えます。たとえば、挿入すると
getchar(); return 0;
直後の
int main(int argc, char *argv[]) {
その場合、メモリ使用量はインスタンスあたり 410 KB のままです。
私のアプリケーションは Curl と Boost だけに依存しています。私は C プログラミングの経験がかなりあり、C ライブラリを使用するまでは、C ライブラリがメモリ消費を増加させる傾向がないことを知っています。
私が見つけた他のもの:
- 単純な hello world C アプリは、約 50 KB のメモリを消費します。
- Curl にリンクされているが Curl を使用していない単純な hello world C アプリも、約 50 KB のメモリを消費します。
- シンプルな hello world C++ アプリ (Boost なし) は、約 100 KB のメモリを消費します。
- 一部の Boost ヘッダーを含むが実際には Boost を使用しない単純な hello world C++ アプリは、約 100 KB のメモリを消費します。「nm」を使用して実行可能ファイルを検査すると、Boost シンボルが表示されません。
したがって、私の結論は次のとおりです。
- Gcc は未使用の Boost シンボルを破棄します。
- アプリが Boost を使用している場合、C++ ランタイムの何か (おそらく動的リンカー) が原因で大量のメモリが使用されます。しかし、何?これらが何であるかを知るにはどうすればよいですか? また、それらについて何ができるでしょうか?
数年前に C++ 動的リンカーの問題について KDE で議論されたことを覚えています。当時の Linux C++ 動的リンカーは、KDE C++ アプリの起動時間を遅くし、大量のメモリを消費していました。私の知る限り、これらの問題は C++ ランタイムで修正されています。しかし、私が目にしている過度のメモリ消費の原因は、似たようなものでしょうか?
gcc/動的リンクの専門家からの回答は大歓迎です。
興味のある方のために、問題のサーバーは Phusion Passenger のロギング エージェントです: https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp