2

google-perftoolsC++ で記述され、g++4.5.2 でコンパイルされたプログラムのプロファイリングに使用しています。CPU 時間の 56% を占めpprofていることがわかります。getaliasbyname_r()いったい何をするのgetaliasbyname_r()?なぜそんなにCPU時間がかかるのですか?この問題を軽減する方法はありますか? ありがとう。コンパイル フラグは次のとおり-O3 -DNDEBUG -Wall -Wno-deprecated -Wno-sign-compareです。システム:ubuntu 11.04。

質問を明確にしておらず申し訳ありません。コードで getaliasbyname_r() を直接使用しませんでした。プロファイリング ツール「pprof」によって生成されたコール グラフでは、ツリー「start--> _libc_start_main-->main-->...」が約 44% の cputime をカウントしていることがわかります。この大きなツリーの他に、コール グラフには別の ioslated 単一ノード ツリー --- getaliasbyname_r があります。グラフに示されているように、それは呼び出されず、他の関数からも呼び出されませんでした。この関数をグーグルで検索したところ、http://linux.die.net/man/3/getaliasbyname_rにたどり着きました。しかし、それはあまり役に立ちませんでした。getaliasbyname_r() がどのように呼び出されたのか、なぜそんなに多くの cputime がかかったのか、まだわかりません。この質問は今意味がありますか?

エイドリアンへの返信: 返信ありがとうございます。合計実行時間は約 28 秒でした。プロファイラーは 100/秒のレートでサンプリングします。合計で約 2800 のサンプルがありました。約 1500 が getaliasbyname_r() で落ち、私が書いた関数を思いつきました (約 450 のサンプルをキャッチしました)。

4

2 に答える 2

3

この問題は、libc6のシンボルがない場合によく発生します。getaliasbyname_rはlibc6からエクスポートされますが、多くの内部関数はエクスポートされません。これらの内部関数の多くは、コードによって間接的に呼び出され、バイナリのgetaliasbyname_rの後に表示されます。

したがって、プロファイラーがシンボルルックアップを実行すると、時間が間違った関数に誤って割り当てられます。おっと。

解決策は、シンボルをインストールしてから再試行することです。 http://randomascii.wordpress.com/2013/01/08/symbols-on-linux-part-one-g-library-symbols/

于 2013-03-05T22:21:24.163 に答える
0

私が見つけたものから、リモートサービスと思われるgetaliasbyname_rものを使用しています(少し似ています)。Name Service SwitchDNS

2 つ目は、ここで測定された時間は、実際の CPU 使用率ではなくウォールタイムのように見えることです。

したがって、私の推測では、getaliasbyname_rネットワークサービスからの応答を単に待つだけで、これは多くの時間を消費し、CPU は実際にはほとんどの時間アイドル状態です (最後の部分は、ほとんどのオペレーティングシステムでは当てはまりません。CPU が処理するだけだからです)。getaliasbyname_rからの応答が返されるまで、アプリケーションは「立ち往生」しますNSS)。

于 2011-11-24T09:29:53.253 に答える