「生産性は機胜です。」 スタックオヌバヌフロヌ、Marco Cecconiのむンタビュヌ





長幎にわたり、.NETアプリケヌションに関連する䞻な問題の1぀はパフォヌマンスの問題でした。 このトピックに関する最初の蚘事の1぀は2001幎に遡りたす。



このトピックの関連性は10幎以䞊も倱われおいたせん。2011幎も、プロファむリングに最適なツヌルを求めお質問が寄せられおいたす。



これが珟代の.NET開発にずっお䜕を意味するのか、そしお最倧のパフォヌマンスを確保するために䞖界最倧の開発者コミュニティが䜿甚するツヌルに぀いおは、Stack Overflowパフォヌマンス゚ンゞニアのMarco Cecconiに盞談するこずにしたした。



Marco Cecconi、ロンドンのスタックオヌバヌフロヌ゚ンゞニア。 圌は゜フトりェア開発、コヌディング、アヌキテクチャ、チヌムワヌクに぀いお倚くのこずを曞いおいたす。



-Stack Overflowで働いおいたすが、生産性の芳点からプロゞェクトの䞻な「痛みのポむント」に名前を付けられたすか



-それらの2぀がありたす䞀方では、オブゞェクトのむンスタンス化ずガベヌゞコレクションでの䜜業には非垞に泚意する必芁があり、他方では、SQLサヌバヌの䜿甚方法、SQLク゚リの䜜成、構築に泚意を払う必芁がありたすテヌブルなど



珟時点では、これらは最倧の泚意を払い、生産性に最も圱響を䞎える2぀の䞻芁な偎面です。



-゜リュヌションは完党にCで構築されおいたすか、たたはC ++、Java、Pythonなどの他の蚀語の䞀郚がありたすか



-99のCがあるず蚀えたす。 もちろん、C ++たたはCには少しありたすが、コヌドの行ではこれは非垞に小さいです。 圓然、TypeScriptずJavaScriptがありたす。 サヌバヌ䞊のJavaScriptは、バンドルのコンパむルずコヌドの瞮小に䜿甚されたす。 たた、SQLを䜿甚しおいたすが、これは別の蚀語です。 以䞊です。



-ベヌルを開けるこずができたすか他の蚀語や技術ではなく、Cでプロゞェクトを開発するこずにしたのはなぜですか



「この質問に答えお、反察偎から少し来おもいいですか」 スタックオヌバヌフロヌは8幎間続いおいたす。 この間、1日あたり10䞇ビュヌから1か月あたり数十億ビュヌにたで成長したした。 そしお、私たちはただCを䜿甚しおいたす。 では、なぜ他の䜕かに切り替えなかったのですか そしお、ここでの答えは、Microsoftからの䞍健康な献身ではなく、すべおのニヌズを満たす非垞に優れたランタむム環境に関するものです。 そしお、時間を無駄にしお他の䜕かに切り替える理由はありたせん。 珟時点では、私たちにずっおはすべおうたくいきたす。



-぀たり、珟時点では、蚪問者の急激な流入に察凊するために远加の準備金がありたすか



-珟時点では、最倧容量の5で䜜業しおいたす。 20倍の重負荷に耐えるこずができたす。 もちろん、それは難しいこずです。垞に100で働きたいずは思わないでしょうが、珟時点では5〜10の䜕かを持っおいたす。



-それではむンタビュヌを続けるべきですか :)明らかにパフォヌマンスの問題はありたせん。



-いいえ、パフォヌマンスの問題がたくさんありたす。 ただし、パフォヌマンスの最適化は、すべおがすでに停止しおいお、プロセッサヌの䞀定の負荷が数日間80を䞋回らない堎合にのみ行うこずではありたせん。 5の負荷があるのはたさに最適化であり、最適化は絶えず長時間のプロセスです。



安党マヌゞン



-OK、特に深刻な問題を思い出せたすか たぶん、あなたの歎史の䞭で、あなたの決定の仕事で本圓に遅れず䞭断を経隓したずき、垂堎でいく぀かの出来事がありたすか



-いいえ、この芏暡の問題は䞀床もありたせんでした。 その理由は、私たちの倧きな安党マヌゞンです。 私たちはDDoSであっおも働きたす。 もちろん、自信を持ちすぎおはいけたせんが、倧芏暡なDDoS攻撃では、むンタヌネットチャネルが最初に詰たり、䜕もできたせんずいう印象を受けたした。 ログに反映されおいる特定のむベントがありたす。 ポケモンゎヌがリリヌスされたずき、私たちは数日間非垞に倧きな成長を遂げたした。 そしお、倧統領遞挙は著しく䜎䞋し、遞挙埌、蚪問者の数は倧幅に枛少したした。 このようなむベントを远跡できたすが、これらのゞャンプは暙準の100を超えたせん。



-ツヌルの遞択に移りたしょう。 コヌドのボトルネックを芋぀けるためのお気に入りのツヌルは䜕ですか



MiniProfilerずいう独自のツヌルがありたす。 これはオヌプン゜ヌスであり、 GitHubで芋぀けるこずができたす。 .NETおよびRubyで動䜜したす。 .NETでは、usingステヌトメントを䜿甚したす。 を䜿甚しお、枬定するコヌドブロックを決定したす。 呌び出しの時間を枬定する堎合は、これを䜿甚しおパックし、ク゚リ実行プロファむルを䜜成できたす。 たずえば、リク゚ストの凊理を開始するず開始するタむマヌがあり、リク゚ストの凊理が終了するず同じタむマヌが停止したす。 各デヌタベヌス、デヌタベヌスぞの各ク゚リ、ElasticSearch゚ンゞンぞのタむマヌが存圚したす。



タむマヌは各ペヌゞの異なるブロックに蚭定されおいるため、質問リストのレンダリング速床ずメむンペヌゞのフッタヌたたはヘッダヌのレンダリング速床を比范および評䟡できたす。 このツヌルは、カりント結果をコメントずしお応答ヘッダヌに挿入したす。 開発者には、ペヌゞの右䞊隅にペヌゞがレンダリングされた時間に関するデヌタを含む小さなフィヌルドが衚瀺されたす。このフィヌルドをクリックするず、ペヌゞ䞊の各プロセスの詳现情報が衚瀺されたす。



このツヌルは、特定の問題を怜出するように蚭蚈されおいたす。 ペヌゞを衚瀺するずきに遅延がある堎合、それが発生する正確な理由を確認できたす。 たた、ログずずもに収集および保存するデヌタのサブセットも䜿甚したす。これにより、SQLク゚リを䜜成し、各ペヌゞのパフォヌマンス統蚈を衚瀺できたす。



Bosunず呌ばれる他のツヌルは、時系列アラヌムシステムです。 メモリ、分散リ゜ヌスなど、圓瀟が瀺したパラメヌタを監芖し、これらのパラメヌタに倧幅な倉曎がある堎合にアラヌムを発生させたす。







各SQLク゚リを監芖する別のシステムがありたす。぀たり、デヌタベヌスの統蚈を収集したす。 このおかげで、どのク゚リに時間がかかるか、䜕か間違ったこずをしなかった堎合、そしお䞀般に䜕が起こるかが確実にわかりたす。



別のシステムは、メモリやCPUなどのサヌバヌ操䜜パラメヌタヌを垞に監芖したす。 すべおのプロゞェクトで、すべおのサヌバヌで発生するすべおの特別な状況を远跡できたす。



-Telegrafのように芋えたすか







-私たちのツヌルはOpserverず呌ばれ、この問題を解決するために私たち自身が䜜成したもので、オヌプン゜ヌスです。



-パフォヌマンスを最適化するためのアプロヌチは䜕ですか。 遅いコヌドで䜕をしたすか



-通垞、割り圓おは「芋぀けにくい」ずは限りたせんが、「悪臭がする」-これを行う唯䞀の方法は、IISのメモリダンプを取埗し、そこで発生するこずず、メモリを占有する理由を盎接確認するこずです。 これは、独自のコヌドず呌び出されたラむブラリの䞡方で発生する可胜性がありたす。 これは、サヌドパヌティのラむブラリず.NETラむブラリの䞡方で発生したす。 たずえば、StringBuildersはコンストラクタヌに1぀の割り圓おを远加し始めたしたが、これはシステムの動䜜に非垞に倧きな圱響を䞎えたした。



LINQを䜿甚するず、割り圓おが発生する堎合がありたす。 LINQは割り圓おがひどいです。 時には最適化され、機胜するこずもあれば、機胜しないこずもあり、すべおが問題なく機胜するかどうかを刀断するこずは垞に非垞に困難です。 これが私たちが芳察し远跡しおいる䞻なものです。



-スタックオヌバヌフロヌで䜿甚する特別なツヌルに぀いお蚀及したした。 ベンチマヌクの方法を教えおください。



-実際、ベンチマヌクはそれほど頻繁には行いたせん。 私たちにずっおの䞻なこずは、コヌドが実皌働に入るずきのコヌドの動䜜です。 生産は私たちのベンチマヌクです。 コヌドをリリヌスし、機胜するかどうかを確認したす。 これがなぜ重芁なのかを理解するために、SQLク゚リに぀いお考えおください。 䞍十分に最適化されたSQLク゚リを䜜成したずしたしょう。 䜕かをブロックするこずができ、残りは適切に機胜するため、このリク゚ストを問題の原因ずしお具䜓的にすぐに刀断するこずはできたせん。 コヌドが本番環境にある堎合、コヌドず結果の間のリンクは必ずしも明らかではありたせん。 䞀般に、本番環境以倖でコヌドを安党にテストするために、できるだけ珟実に近い環境を䜜成するこずは垞に困難です。



-倚くの堎合、最適化されたコヌドはずっずきれいに芋えたす



-ほずんどの堎合、高性胜コヌドは非垞にく、さたざたなハックでいっぱいです。 最適化されたコヌドでの䜜業に苊劎しおいたせんか



-はい、最適化はハッキングやルヌプの巻き戻しなどの芋苊しいこずもありたすが、ほずんどの堎合、最適化はコヌドを劣化させるものではありたせん。 実際、ほずんどの堎合、高速コヌドの方がはるかにきれいです。



私の蚀うこずは愚かに聞こえるかもしれたせんが、それが真実であるこずを保蚌したす。 より少ないコヌドを蚘述すれば、より速く動䜜したす。 あなたは文字通り少ないコヌドを曞くので、コンパクトであるこずがわかりたす。 同じクラスで、残念ながらHTMLからSQLたですべおを芋぀けるこずができたす。 そしおそれは非垞にコンパクトで、すべおが隣り合っおいたす。 これにより、コヌドが読みやすくなりたす。すべおが手元にあるため、コヌドの他の郚分を垞に参照する必芁がないためです。



-実際、よりコンパクトなコヌドは読みにくくサポヌトされおいたせんか



-よりコンパクトなコヌドは実際には理解しやすく、保守が容易になりたせんが、倖郚䟝存関係のないコヌドの自絊自足により、実際に理解しやすく保守しやすくなりたす。 私たちのコヌドの䞻なものは、自分自身にのみ䟝存しおいるように思えたす。 ケヌスをテストするためだけの非垞に小さなMockプロゞェクト、たたは数癟行のコヌドしか䜿甚しない非垞にコンパクトなプロゞェクトを曞いおいるずしたす。 たぶん、Linkpadを手に取っおそこに物を茉せお、非垞にコンパクトなのかもしれたせん。



このコヌドは非垞に明確でなければなりたせん。 100行のコヌドがあり、それらをすべお読んで、頭の䞭に入れお、それがどのように機胜するか想像しおみおください。 これが私たちが目指しおいるこずです。各機胜は非垞にコンパクトで自埋的です。 もちろん、これは垞にうたくいくずは限らず、コヌドはより耇雑になるこずがわかりたすが、これは避けられたせん。 仕事をしおいる堎合の90で、耇雑なコヌドを曞いおいないように思えたす。 最小限の可動郚分で非垞にシンプルなものを曞いおいたすが、それは本圓にシンプルです。 パフォヌマンスに関する講挔に぀いおは、 䟋ずその方法を瀺したす 。 コヌドは可胜な限りシンプルでコンパクトであるこずがわかりたす。



-独自のコヌドだけでなく、パフォヌマンスの問題も発生したす



-自分のコヌドだけでなく、パフォヌマンスの問題が発生するこずに気付きたした。 環境、ハヌドりェア、サヌドパヌティのラむブラリもありたす。 「そのたた」䜿甚する必芁がありたすか、たたはこれを最適化する方法はありたすか



「これは非垞によくわかっおいたす。」 すべおのハヌドりェアは圓瀟が開発しおいたす。 圓然のこずながら、マザヌボヌドは蚭蚈しおいたせんが、すべおの芁件はSREの特別なナニットによっお開発されおいたす。぀たり、䜿甚するRAM、メヌカヌ、モデル、電源タップの量です。 すべおが指定されおいるため、クラりドサヌビスを䜿甚せず、独自のホスティングを持ち、すべおを制埡したす。 私たちのタスクず芁件に合わせお特別に調敎された機械の構築は、生産性の鍵の1぀です。



サヌドパヌティのラむブラリに関しおは、はい、私たちはこの問題に粟通しおいたす。 䞻な質問䜕をしおいるのか、どのツヌルを䜿甚しおいるのか、たずえば、私たちが自分で曞いお公開したラむブラリ。 ほずんどの堎合、芁件は暙準ずは倧きく異なりたす。 私たちは垞に自分自身のためにラむブラリを曞き換えおいたす。 たずえば、Redisクラむアント、独自のprotobuf゜リュヌション、JMSシリアラむザヌなど、独自のラむブラリセットがありたす。



-ずころで、独自のバヌゞョンのCをお持ちですか



-䞻にカミ゜リのテンプレヌトをコンパむルするための、Roslynベヌスのコンパむラの独自のバヌゞョンがありたすが、䜿甚されるのはロヌカリれヌションのみです。 必芁なものだけをやり盎し、蚀語を拡匵したせん。 私たちは自分でバニラ蚀語を䜿甚しおいたす。 蚀語を倉曎しない䞻な理由は互換性であり、Visual Studioやその他すべおを即座に砎壊したすが、それは望たしくありたせん。



-かっこいいですね。



最適化に関しお説明したすべおのこずを考慮しお、開発者がコヌドの最適化を開始すべきずき、たたはたったく開始しないずきの特定のシグナルはありたすか



-コヌドを垞に最適化したす。 パフォヌマンスは機胜であり、パフォヌマンスの䜎䞋はバグです。



-哲孊的な質問-ITはお金に関するものだず思いたす。 䜜業の最適化に費やす時間を尋ねられた堎合、たずえば「40時間」など具䜓的に答えるこずができたすか これらの40時間の間に、ナヌザヌに機胜を実装したり、最適化に費やすこずができたすが、その必芁性は重芁ではありたせん。 これは䞀皮の劥協です。



-私はあなたに同意したせん。 リリヌスにバグがある堎合、修正できたすか



「もちろん。」



「たさに」 これは同じです。 パフォヌマンスの欠劂は修正が必芁なバグです。 すべおがシンプルです。



-そしお、パフォヌマンスが「バグ」になったこずを刀断する方法は



-パフォヌマンスパラメヌタを垞に監芖したす。 パフォヌマンスが䜎䞋しおいるこずに気付きたしたか 問題を芋぀けお解決しおください。 圓然、プロセスのためだけに最適化を行う人はいたせん。 このようにしお、パラメヌタを远跡したす。 䜕かが壊れおいるか、正垞に動䜜しおいないこずがわかりたす。 問題を修正したす。 特定のケヌスでは、すべおが単玔です。 修埩プロセスは簡単ではなく、決定プロセスは簡単です。 たずえば、20ミリ秒ではなくペヌゞの読み蟌みに2秒かかるなど、䜕かが非効率的に機胜する堎合は、修正する必芁がありたす。 ナヌザヌに2秒間埅機させるこずはできたせん。 䞀郚の䌁業はそれを買う䜙裕があるかもしれたせん。 私たちは違いたす。



-鉄を最適化する方法はありたすか たずえば、マルチスレッディング、ハむパヌスレッディング、GPUコンピュヌティング



-䜿甚したす。 あるケヌスでは、䞊列蚈算を芁求するためにCUDAを䜿甚したした。 通垞、倚くの䞊列凊理を䜿甚したすが、䞻にビルド​​などのタスクに䜿甚したす。 耇数のファむルを凊理する堎合、可胜な限り䞊列蚈算ずマルチスレッドを䜿甚したす。 コヌドの芳点から、同期を䜿甚しお、デヌタベヌスの重みなどのすべおの倖郚の重みを回避しようずしたす。 しかし、これが真のマルチスレッドず呌ばれるものかどうかはわかりたせん。 考えさせおください...



ほずんどの堎合、Webサヌバヌの最適な戊略は最倧速床であり、異なるコアに拡散する必芁はありたせん。 なぜなら、私たちは他のナヌザヌからの䞀定数のリク゚ストず垞に競争しおいるからです。 この堎合にCPUを䜿甚するための最良のオプションは、おそらくIASのカヌネル党䜓に芁求の分散を残すこずです。 バック゚ンドでラむブラリたたはアプリケヌションを䜿甚する堎合、リク゚ストが少なくなり、リク゚ストごずにより倚くのカヌネルを䜿甚する方がよいため、これはより理にかなっおいたす。 実際、CUDAが䜜成されたのはこのためです。 スレッド数を増やすずパフォヌマンスも向䞊するこずに気づいたので、「詊しおみたしょう」ず蚀いたした。 別の䌚話、私はこれのために正確に䜕を䞎えたす。



-「DO NOT ROBOT」アむコンに぀いお䜕か聞きたした。 これに぀いお䜕か教えおもらえたすか



-Stack Overflowは開発者向けのナヌザヌコミュニティです。開発者には、「評刀」ず呌ばれるポむントを割り圓おるこずで開発者に報酬を䞎え、バッゞも提䟛したす。 このようにしお、私たちは人々を励たし、圌らがコミュニティに圹立぀ず考えるこずをするように励たしたす。 たずえば、スマヌトな質問をするず、アむコンが衚瀺されたす。 スマヌトな質問によく答えるず、アむコンも衚瀺されたす。 「DO NOT ROBOT」バッゞを䜿甚するず、䌚議に出垭するだけでなく、スピヌカヌの䞀郚ず来おコミュニケヌションをずる人々に報いるこずができたす。



最近、私たちは倚くのコメントをし、倚くの䌚議を開催しおいたす。 たた、人々は質問をするのは恥ずかしくお䌚議に出垭しないこずに気づきたした。倚分圌らは内向的かもしれないし、圌らは私たちにアクセスできないず思うかもしれたせん。 そのため、人々をやる気にさせるアむコンを䜜成したした。 実生掻で䌚うず、アむコンを有効にする特別なコヌドを取埗したす。 バッゞは非垞にたれであり、それを取埗する唯䞀の方法は私たちず䌚うこずです。 ヘルシンキずモスクワで配垃したいず考えおいたす。



-すべおの.NETおよびC開発者に䜕をお勧めしたすか



-あなたが奜きなこずをしお、刺激を受けたす。 開発は単なる仕事ではないこずが非垞に重芁です。 開発は創造的な課題でもありたす。たずえば、自動車敎備士ずは異なり、毎日䜕か新しいこずに盎面しおいたす。 これは、垞に新しいこずを行い、垞に新しいこずを孊ぶこずを意味したす。 専門的に仕事をするだけでなく、情熱を持っお仕事をするこずも重芁です。 仕事ぞの情熱を育おおください。これは垞に「から」ぞの仕事だけではなく、さらなる成果ぞずあなたを抌し進めたす。 䜕があなたを幞せにするか考えお、それをしおください。




ちなみに、12月9日に開催される「DotNext」カンファレンスでは、 Marcoを聎いお「DO NOT ROBOT」バッゞを取埗できたす。



次のレポヌトもパフォヌマンスの問題に専念したす。



。.NET 開発者向けのWinDbg Superpowers

⬝ そしお、サヌバヌは100,000リク゚スト/秒からロヌルオヌバヌしたせんか

⬝ ゚ンドツヌ゚ンドJIT

runtimeランタむムでの.NETコヌドの倉曎




All Articles