2009-10-04 12 views
17

私はC++で書かれたサーバアプリケーションをCentOSにデプロイしています。私はコードの一部を書いていませんが、パフォーマンスを最適化する必要があります。現在のパフォーマンスは少数のユーザーには受け入れられますが、ユーザー数が増えるとサーバーのパフォーマンスが大幅に低下します。C++コードでパフォーマンスのボトルネックを見つける方法

ボトルネックを見つけるためのツール、テクニック、またはベストプラクティスはありますか?

答えて

14

人は通常、パフォーマンスのボトルネックを特定するためにプロファイラを使用します。以前は、C++のプロファイラを求めているので、herehereです(使用するオペレーティングシステムとコンパイラによって異なります)。 Linuxの場合、一般的にgprofはシステムに付属しているので使用します。

+0

プロファイリングは素晴らしいですが、プロダクションシステムでの使用には明らかに適していません。まず、プロダクション以外のシステムで問題を再現する必要があります。 – MarkR

+3

実際には、開発システムで問題を確認する必要はありません。代わりに、プロファイラーは、実行時間のかなりの部分が「長い」と認識していなくても費やされたと伝えるかもしれません。もちろん、アプリケーションをプロファイリングすることが役に立たない他の問題(例えば、データベース性能に関する問題)がある。 –

3

あなたは1

  • 生産グレードのハードウェアを持っていない場合は、パフォーマンステスト環境を構築することから始めます。あなたはこれのための予算を持っていない場合は、あまりにもあきらめるかもしれません。
  • 生産システムより速く、または高速に、プロダクションのようなトラフィックを高速でスローするドライバプログラムまたはハードウェアデバイス。プロトコルとユースケースによっては、これは簡単で難しいかもしれません。 1つの手法は、いくつかの要求をプロダクションからサンプリングして再生することですが、キャッシュヒット率が高いほど非現実的な結果が得られる可能性があります。
  • それが生産に存在するとして、あなたが合理的に、

が続いて問題を再現得ることができるよう生産と同様にインフラを取り巻きます。それを済ませたら、プロファイラーなどを使用して、他の人が示唆しているようにします。私が好きな

+0

+1パフォーマンスの問題を再現する方法に関する素晴らしいコメント。 –

1

、上記マイクDunlaveyの回答(そう景気改善彼のあなた景気改善鉱山であれば)私は二つの方法で急いで誰かのために詳しく説明したいと思います

  • gccユーザーがそのサンプルを入手する簡単な方法
  • 自己検査SIGALRMbacktraceを組み合わせたものイマー)。

ほんの数日前、私は私のアプリのログはスタック(ない完璧なライン - と混在したように、私のsyslogのルーティングルールで行くPARAMSを使用して、この

# while true; do gstack $MYPID; sleep 2; done | logger $PARAMS 

のような何かをしました)イベントとアップ

結果は、鼻の上にあった、彼らは私がすべての問題になると考えていた領域に私を指摘したが原因misuse of reference in a tr1::bind

に私のボトルネックでした

アラームの方法では、信号に何をするか注意してください。メモリを割り当てるものは使用しないでください(cout/cerr/boostはありません。 "%08X" with printf)