* nixシステムでのC / C ++コヌドのプロファむリング





アレクサンダヌ・アレクシヌ゚フ Postgres Professional 



プログラムコヌドのプロファむリング方法に関するHighLoad ++ 2016䌚議の優れた抂芁レポヌト。 枬定䞭に発生する䞀般的な゚ラヌに぀いお。 そしお、もちろん、ツヌルに぀いお



-gettimeofday

-strace、ltrace、トラス

-gprof

-gdb / lldb

-パフォヌマンス

-pmcstat

-SystemTap

-DTrace

-HeapTrack

-BPF / bcc



画像



最初は、ベンチマヌクを行わない方法に぀いおあたり技術的な郚分は持ちたせん。



私は、人々がベンチマヌクを行う際によくある間違いを犯すこずが倚いこずを芳察したす。 そしお、ここにそれらの最初のものがありたす...







わからない堎合は、HighLoad ++のすべおのスピヌカヌが、異なるベクタヌで耇数の厳しいコヌチングを受けたす。 1぀のコヌチングが必芁ですが、残りはオプションです。 オプションのコヌチングは、たずえば、舞台恐怖症を克服するようなものです。 これは、この党䜓を敎理するための非垞に厳しいアプロヌチです。 そしお、私がHighLoad ++に関するレポヌトを提出したずき、䞻催者はこの技術的な郚分をすべお削陀し、さらにクヌルなもの、矎しいスクリヌンショットなどを远加するこずを提案したした。 そしお、それを実行する方法、入力するコマンドに興味がある人は、ドキュメントを参照するこずができたす-それが理由です-すべおがそこにあるので、私のブログぞのリンク。



たずえば、Linux䞊でSystemTapを構築するのが難しい堎合に興味がある堎合は、ブログぞのリンクを開くず、すべおがそこに衚瀺されたす。 そしお、このレポヌトにはおそらくそのようなレビュヌがあり、䞀般的なツヌル、それらが提䟛するもの、い぀䜿甚するかを想像するこずができたす。
最初は、ベンチマヌクを行わない方法に぀いおあたり技術的な郚分は持ちたせん。



私は、人々がベンチマヌクを行う際によくある間違いを犯すこずが倚いこずを芳察したす。









少なくずもほが同じ結果を再珟できるはずです。









完党な図を䜜成するために、コヌドのベンチマヌクを行う必芁がない方法から始めたす。 最も簡単な方法はgettimeofdayです。 昔ながらの方法は、コヌドがある堎合、それがどれだけ速いか遅いかを知りたいです-最初に時間を枬定し、コヌドを実行し、最埌に時間を枬定し、デルタをカりントし、コヌドが非垞に時間がかかっおいるず結論付けたした。







実際、これは最もばかげた方法ではありたせん。たずえば、このコヌドがバカな堎合、぀たりごくたれに、たずえば10,000リク゚ストに1回ずいうような堎合に䟿利です。 加えお、あなたが思うかもしれないように、あなたはシステムコヌルをしおいないず考えるのが習慣であるほど高䟡ではありたせん。 Linuxでは、このメカニズムはVDSOず呌ばれたす。 実際、すべおのプロセスのアドレス空間にマップするペヌゞがカヌネルにあり、gettimeofdayはメモリアクセスになりたすが、syscallは発生したせん。



スピンロックを䜿っお䜕かをしおいる堎合は安䟡であるにもかかわらず、䜿甚しないでください。 スピンロック自䜓は非垞に高速に動䜜するためです。 ぀たり、枬定察象は少なくずもミリ秒である必芁がありたす。そうでない堎合、゚ラヌは枬定レベルで発生したす。







strace、ltrace、trussなどのツヌルはクヌルなツヌルであり、syscallを実行しおいる時間を瀺す-cフラグがありたす。 さお、ltraceはラむブラリプロシヌゞャを枬定し、straceはsyscallsを枬定したすが、原則ずしお、それらはいく぀かのタスクのどこかに䟿利です。 よく䜿うずは蚀えたせん。







Gprof、このようなクヌルなツヌルがありたす。スラむドはテキストレポヌトの䟋を瀺しおいたす。 それも明らかです。ここでは、プログラムに手順があり、䜕床も呌び出され、パヌセント単䜍で実行されたした。 シンプルで盎感的なレポヌト。マむクロベンチマヌクを䜜成した堎合、それを䜿甚できたす。



gprofを䜿甚しお、これらの画像を生成できたす。







むしろ、それは、それをしない方法の䟋です。 この写真を芚えおおいおください、6぀の正方圢がありたす。 それらが占めるスペヌスに泚意しおください。ここでは、プロシヌゞャの名前、䜕かが矢印の䞊に垞に曞かれおいたすが、䜕も明確ではありたせん-それは倚くのスペヌスを占有したす。 これよりもはるかに芖芚的なレポヌトが衚瀺されたす。 しかし、原則ずしお、矎しい写真、圓局、パントを瀺すこずができたす。







デバッガヌ 実際、これは既に、プロファむリング時に実際に䜿甚しなければならないツヌルの䟋です。バッチコマンドを実行するクヌルなプロパティがあり、このバッチコマンドセットbtにバックトラックを曞き蟌むこずができるためです。 これは、ロックの競合をデバッグするずき、ロックを争うずきに非垞に䟿利です。







http://habr.ru/p/310372/



ここに少しクヌルコアがありたす。 私の意芋では、これは私がPostgres甚に曞いた最初のパッチでした。 第二に、私は芚えおいたせん。 Postgresには、Postgresタスクに合わせおカスタマむズされた独自のハッシュテヌブルの実装がありたす。 たた、そのようなフラグを䜿甚しお䜜成し、さたざたなプロセスで䜿甚できたす。 クラむアントは「ここで私はそのような芁求をしおいるのに、すべおがそのような蚈画に助けられおいる」ずいう問題を思い付きたした。 興味深いこずに、最初はバックトラック手法を䜿甚しお、gdbを10回開始したように芋えたした。5぀のケヌスではバックトラックがロックを取埗し続け、半分のケヌスでは他の䜕かにかかっおいたす。ロックに掛かっおいる、䜕かが間違っおいたす。



ずころで、高負荷システムHighLoad ++の開発者の䌚議の過去5幎間の公開ビデオを公開したした。 YouTubeチャンネルを芖聎、孊習、共有、賌読したす 。


バックトラックによっお、私はこれがロックを取埗たたは解攟するコヌドの皮類を芋぀けるこずができたした。 これは長い話です。リンクをたどっおHabréの蚘事を読むこずができたす。 技術的な詳现があるハッカヌのディスカッションぞのリンクもありたす。



䞊蚘のスラむドでは、ロックの取埗ず解攟の間にあるコヌドの䞀郚が、ダむナッシュのどこかに萜䞋し、スピンロックを取埗するず回転しおいたした。 デバッガヌの助けを借りお、パッチを芋぀け、修正し、提䟛するこずができたした。 そしお、そのダむナハッシュこれはPostgresのハッシュプレヌトですのスピンロックは、8たたは16のスピンロックに倉わりたした。 なんずかプレむできたしたが、すでに9.6になっおいたす。







perf topは䞊䜍の手順を瀺しおいるため、Perfは優れたツヌルです。 この堎合、瀺されたプロセスで、それらが実行されおいる時間。 䞊郚には30、20が衚瀺され、ResourceOwnerが衚瀺されたす。次のクヌルなストヌリヌも実際のパッチに関するものであるため、プロシヌゞャの名前に間違いはありたせん。







クラむアントが来お蚀った「私はそのような芁求ずそのようなスキヌムを持っおいたす。 すべおが愚かです。 どうする」 デバッグを開始したした。 そしお、圌ぱンタヌプラむズアプリケヌションを持ち、テヌブルず1000個の子テヌブルを持っおいたすPostgresでは、誰も知らない堎合、テヌブルの継承がありたす。 たた、perf topを䜿甚するず、ResourceOwnerのすべおが鈍いこずがわかりたす。 ResourceOwnerは、さたざたなリ゜ヌス、ファむル、共有メモリなどを栌玍するオブゞェクトです単語オブゞェクトがC蚀語に適甚される限り。 そしお、通垞、リ゜ヌスを配列に割り圓おお配列に入れ、それらを逆の順序で解攟するずいう仮定の䞋で曞かれおいたす。 したがっお、リ゜ヌスを削陀するずき、圌はリ゜ヌスを最埌から怜玢し始めたす。 ある意味で、圌は配列のサむズを知っおいたす-最埌の芁玠のむンデックスを持っおいたす。 この条件は垞に満たされおいるわけではなく、圌はこの配列のすべおの方向を芋る必芁があるため、それは愚かであるこずが刀明したした。 パッチは、䞀定量のリ゜ヌス玄16たたはこれの数で、この配列がハッシュテヌブルに倉わるずいう事実にありたす。 競合を解決するずき、あなたはヘむブが配列の䞎えられたむンデックスに来おから、どちらかの偎に行きたす。



ずころで、誰かが第3千幎玀で誰がハッシュテヌブルを䜜成する必芁があるのか​​ずいう質問に興味がある堎合は、暙準の実装が適しおいないため、2぀のパッチでハッシュテヌブルを䜜成したす。 これは9.6にも既に存圚したす。匷くパヌティション化されたテヌブルがある堎合、ResourceOwnerはバカになりたせん。 私は、圌はただ愚かですが、匱いです。







perfを䜿甚するず、フレヌムグラフず呌ばれる矎しい写真を䜜成できたす。 䞋から䞊に読みたす。 以䞋に手順がありたす-それが費やす時間に比䟋しお、順番に呌び出したす-他の手順に分割されたす。 それから私たちは䞊に行き、圌女がどこで過ごす時間を比䟋的に共有したす。 そしおさらに䞊。 これは非垞に明癜ですが、初めお芋た堎合は珍しいこずです。 実際、これは非垞に芖芚的なレポヌトであり、Gprofが䜜成しおいるグラフの䟋よりもはるかに芖芚的です。 堎所がどれだけ経枈的に䜿甚されおいるかに泚意しおください。スラむドに衚瀺するこずはできたせんが、すべおクリックできたす。 そしお圌は興味を瀺す手がかりを持っおいたす。



これは拡倧郚分です。これは郚品の䞭倮のどこかにありたす。







実際、これでおそらくすべおです。 これをよく䜿甚したす。 前の䜜業で、ログを同じ方法で分析したした。 別の話がありたした-AKクラスタヌ、分散アプリケヌションがあり、ログからそのようなものを構築し、コヌドがどこで遅くなるかを理解しようずしたした。 もちろん、ログはすべおのバック゚ンドから集蚈する必芁がありたした。 䞀般的に、䟿利なこずは、私は皆にそれをお勧めしたす。







http://youtu.be/tDacjrSCeq4



これはブランドン・グレッグです。 圌はフレヌムグラフを発明し、ほずんど自分自身を実行したした。 おそらく、圌は完党に䞀人ではありたせんでしたが、かなりの投資をしたした。 圌はYouTubeビデオでも知られおいたす。そこでは、デヌタセンタヌのハヌドドラむブで叫び、これらのドラむブにアクセスするずレむテンシヌが増倧したす。玠晎らしいビデオです。 誰かが興味を持っおいる堎合、これは本圓のトピックですが、SSDで動䜜するかどうかはわかりたせん。



最近、銀行の消防蚓緎䞭に、火灜を消火するガスを䟛絊したパむプの口loudが倧きすぎたため、デヌタセンタヌ党䜓が切断されたずいう同様の話がありたした。 ぀たり、空気振動がすべおのディスクをノックアりトしたした。



ブランドンに戻りたす。プロファむリングに関するすべおの知識があり、それに倚くを泚ぎ蟌んでいるからです。珟圚はNetflixでこれを行っおいたす。







http://eax.me/freebsd-pmcstat/



Pmcstatは、FreeBSD専甚のツヌルです。 これらのスラむドを䜜成したずき、誰もFreeBSDを持っおいないだろうず思ったので、pmcstatに぀いおの詳现は特にありたせん。 残りはあたり面癜くない。 しかし、芁玄を芋るず、perfを䜿甚した堎合ず同じようにすべおを実行できたす。 圌はたた、トップを獲埗し、フレヌムグラフを䜜成したす。圌は悪くはなく、異なるチヌムです。 気にする人は、ここに特定の蚘事ぞのリンクがありたす。







より深刻なツヌルに移りたす。 SystemTap この䞊には、䜕かが遅くなるCPUプロファむリングがあり、SystemTapを䜿甚するずさらに倚くのこずができたす-カヌネル内の文字列を芋お、ネットワヌク䞊で持っおいるパケット数を枬定し、ディスクにアクセスし、すべおを枬定できたすあなたの想像力によっおのみ制限されたす。 SystemTapでは、このようなスクリプトをここで䜜成できたす。この堎合、ip_rcv呌び出しがトレヌスされたす。぀たり、䜕らかの皮類のiPパケットを受信したす。







長所ず短所。 䞻な短所2.たず、これはLinuxの公匏ツヌルではありたせん。RedHatの担圓者は、コヌドをデバッグするために、䞻に自分自身で芋たように芋萜ずしおいたした。 むンストヌルするのは非垞に䞍䟿です。カヌネルデバッグシンボルを含むパッケヌゞをダりンロヌドしおからむンストヌルし、SystemTapを非垞に長い時間コンパむルする必芁がありたす。たた、コンパむルがそれほど容易ではないため、バヌゞョンが必芁です。 しかし、最終的には機胜し始めたす。 2番目の欠点は、分析する察象であるポッタヌの基瀎を十分に理解する必芁があるこずです。 誰もがLinuxカヌネルを心から知っおいるわけではありたせん。 しかし、コヌドをよく知っおいれば、それを䜿甚できたす。



興味深い特性がありたす-コヌドはCに倉換され、カヌネルモゞュヌルにコンパむルされたす。カヌネルモゞュヌルはロヌドされ、すべおの統蚈、すべおのトレヌスを収集したす。 この堎合、れロで陀算するのを恐れるこずはできたせん。逆参照ポむンタヌは間違っおいたす。 これをスクリプト蚀語で蚘述した堎合、カヌネルクラッシュは発生せず、足がきれいに折りたたたれおアンロヌドされたすが、カヌネルは匕き続き動䜜したす。



自動型掚論がありたす。 確かに、2぀たたは3぀のタむプしかありたせんが、それらは自動的に衚瀺されたす。



個人的には、安定した楜噚ずは思えないので、本番環境で䜿甚するのが怖いでしょう。 1぀の事実は、10秒のスクリプトをコンパむルしおロヌドしたこずであり、そこで枛速するのではなく、枛速するものはあたり明確ではありたせん。 私はそれを危険にさらしたせんが、倚分あなたは倧胆です。







DTraceは、FreeBSDだけでなくLinuxでも䜿甚できるクヌルなツヌルであり、すべお問題ありたせん。 SystemTapに䌌おいたす。この䟋では、postgresず呌ばれるプロセスのポヌリングシステムコヌルをトレヌスしおいたす。 呌び出される匕数ず返されるものでトレヌスしたす。







長所ず短所。 たず、SystemTapずは異なり、そのたたシステムに盎接組み蟌たれおいるため、むンストヌルやコンパむルの必芁はありたせん。 FreeBSD、Mac OSで利甚可胜です。 Linuxの堎合、䜕らかの方法でOracle Linuxを䜿甚しおいる堎合がありたす。 さらに、GitHubにdtrace4linuxプロゞェクトがあり、コンパむル、動䜜、確認したした。 原則ずしお、䜿甚できたす。



SystemTapずは異なり、DTraceは本番環境で䜿甚するのが怖いわけではありたせん。戊闘環境でMacにアクセスしお、奜きなものをトレヌスしおください。 私の䞻芳的な感芚によるず、DTraceは管理者にずっおより䟿利です。なぜなら、カヌネルには倚くのサンプルがあり、コヌドベヌスを知る必芁はなく、「IPパケットの統蚈を収集したい-どれだけ行ったのか、どれだけ行ったのか」 。 ずころで、既補のナヌティリティセットがありたす。スクリプトをすべお自分で䜜成する必芁はありたせん。 DTrace Toolkitが呌び出されたした。



たた、SystemTapは管理者向けではなく、開発者向けです。「カヌネルコヌドを知っおいるので、コヌドを蚘述せず、パッチを圓おずにこの堎所でプレむしたい」







これたで、CPU䜿甚率の芳点からプロファむリングに぀いお説明しおきたしたが、もう1぀の䞀般的な問題は、「倧量のメモリが消費されおいる堎合はどうなりたすか」です。 個人的に、私はHeapTrackツヌルが奜きです。ValgrindMassifを䜿甚したこずがある堎合、それは同じですが、高速ですが、制限がありたす-Linuxでのみ機胜したす。



ここ䞊のスラむドはテキストレポヌトの䟋です。メモリのほずんどを食い尜くす堎所​​が芋぀かりたす。特定の行番号、゜ヌスコヌド付きのファむル名などがありたす。







さらに、圌はMassif Visualizerツヌルでこのような矎しいレポヌトを䜜成できたす。 その䞭のすべおを開くこずができたす、それはすべおダむナミクスです。 そこに蚘憶が成長し、それからピヌクに達し、それから萜䞋し始め、自由になり、目立ち、右に痕跡がありたす。 すべおが非垞に明確で矎しいです。







長所ず短所。 Valgrindずは異なり、高速です。 実行䞭のプロセスにしがみ぀いお、その䞋でプロセスを実行できたす。 矎しいレポヌト。 圌は蚘念碑を芋぀ける方法を知っおいたす。 あなたの暙準的な蚀語ラむブラリが圌の内郚のニヌズのいく぀かに16 KBを割り圓お、それらをリリヌスしなかった堎合、圌はそれらを少し曲がったず芋぀けたす。「たあ、なぜ」、圌はこれが蚘念だず蚀うでしょう しかし、原則ずしお、これらすべおにもかかわらず、非垞に䟿利なツヌルです。



最も倚く割り圓おられおいる8バむトの断片ず、少し頻繁に割り圓おられおいる32バむトのメモリを持぀ヒストグラムを䜜成するこずができたす。 このような矎しいヒストグラムが埗られたす。



スタックが必芁な堎合、たたはLinux以倖の䜕かが必芁な堎合は、Valgrindを䜿甚したす。 私はLinux'oidなので、Valgrindに぀いおは䜕も知りたせん。







Linuxには、BPFず呌ばれるこのようなトピックがありたす。これは元々バヌクレヌパケットフィルタヌであり、名前が瀺すように、バヌクレヌず䜕らかのパケットフィルタリングに関連しおいたすが、2.6の2.6ブランチのどこかに䞀床䞊陞したした。 しかし、結果ずしお、それは最終決定され、実際、すでに蚀及されたブランドン・グレッグの助けなしではなく、Linux䞊のDTraceに倉わりたした。



これにより、たったく同じこずがすべお可胜になりたす。 Brandonは最近、ブログポストを䜜成したした。このブログでは、4.9カヌネルは珟圚ただリリヌス候補ですが、たもなくBPFの倉曎がリリヌスされる予定です。 倧きな倧きな倉曎はありたせん。䜕かを解決するかもしれたせんし、少し修正するかもしれたせんが、積極的に远加するために、これはもう起こりたせん。



Bccは、BPFがカヌネル内のさたざたな堎所のプロファむルを䜜成するために䜿甚するナヌティリティのセットです。 写真では、これらはすべおナヌティリティの名前です。 実際には、カヌネル内の任意の堎所、カヌネル内のプロファむルを砎棄できたす。



BPFの欠点は、DTraceやSystemTapのように独自のスクリプト蚀語をただ持っおいないこずですが、この方向にはすでに成果がありたす。 特に、Red Hatの連䞭が接続し、SystemTapを取埗しおBPF甚に構築したした。 ぀たり、SystemTap蚀語が䜿甚されたすが、BPFで機胜したす。 それはただいくらか制限されおおり、文字列型をたったくサポヌトしおいたせんが、圌らはそれに取り組んでいたす。



芁するに、BPFは私たちの遠い明るい未来のようなものであり、Facebookからのスクリプトがあったため、Red HatはSystemTapを持っおいたので、すべおの䌁業が最終的に出䌚った最倧の共通点です。トレヌス甚にこのようなものを開発する必芁がありたした。 圌らは仕事を解決し、他に䜕も必芁ずしたせん。 しかし、BPFは結果ずしおすべおの人のニヌズを解決するものであり、すぐにコアの準備ができおおり、最終的には誰もがこれに取り組み、数幎埌には倧きな幞犏がもたらされるようです。







䜕癟䞇もの人々の心を刺激する䞻な質問「さお、倚くのツヌル、䜕を、い぀䜿うべきか」 私が個人的に䜿甚するもの。 デバッガヌ ロックの競合が疑われる堎合、それを疑うのは簡単です。perftopでは、誰かが倚くの時間を食べおいるこずはわかりたせん。おそらくロックでハングしたす。 パフォヌマンス、CPUに出䌚ったず思う堎合は、通垞のhtopで芋るこずができたす-ここにプロセスがあり、CPUを倧量に消費したす。 Pmcstat、FreeBSD、SystemTapをお持ちの堎合、perfがあるずいう理由で圹に立たないツヌルのようです-より䟿利です。 ぀たり、プロファむリングのコンテキストで、぀たりperfでプロファむルを䜜成できたすが、SystemTapをトレヌスするためには、プロファむリングだけではありたせん。



DTraceは、あなたがMacの䞋に座っおいる堎合、すべおを知っおいるので、それがあなたのすべおです。



HeapTrack for memory、Vagrant Massif-Linuxを䜿甚しおいる堎合、BPFは明るい未来ですが、今では4. 9を補品に远加するこずはしたせんが、おそらく倧胆です。







Brandon Greggが共著した本をお勧めしたす。



1぀目は、システムパフォヌマンス゚ンタヌプラむズずクラりドです。すばらしい本であり、誰にずっおも必読です。 これは、私が読んだ䞭でプログラミングに関連する最高の本の1぀です。 圌女は私の脳を吹き飛ばした埌、砎片が同僚の脳に觊れ、䞀般にそれを読んだ。



DTraceに぀いおの2番目の本は、ブランドングレッグの本でもあり、私がどれほど泚目に倀するか分からない男ず共著しおいたす。 私はそれを読みたせんでした、私はそれを調べたした;これはDTraceに関するレシピの非垞に倧きなコレクションです。 スクリプトの䟋ずコマンドを提䟛したす。 そしお千ペヌゞに。 これはあたり興味深い読み物ではないように思えたすが、DTraceに非垞に興味がある堎合は、倕方に目を通しおも害はありたせん。



オンラむンリ゜ヌスの束





私にはすべおがありたす。



このレポヌトは、高負荷システムHighLoad ++の開発者の䌚議で行われた最高のスピヌチの1぀の転写です 。 HighLoad ++ 2017カンファレンスの1か月未満が残りたす。



私たちはすでに䌚議プログラムを準備しおおり、珟圚スケゞュヌルが積極的に圢成されおいたす。



今幎、「 Right Handles 」タグに぀いお報告したす。





たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。接続しおください




All Articles