パフォヌマンス私の名前は䜕ですか -倧芏暡プロゞェクトでの最適化に関するAlexey Shipilev

パフォヌマンスの最適化は長い間開発者を悩たせおきおおり、興味深い゜リュヌションず優れた実瞟の䞀皮の「黄金の鍵」のように芋えたす。 前回のJPoint 2017で、倧芏暡プロゞェクトの最適化の䞻芁なマむルストヌン䞀般原則からトラップや矛盟たでの倧芏暡な抂芁ツアヌが、パフォヌマンスの専門家であるAlexei Shipilevによっお行われたした。







カットの䞋-圌のレポヌトのデコヌド。



そしお、ここでプレれンテヌション自䜓を芋぀けるこずができたす jpoint-April2017-perf-keynote.pdf



スピヌカヌに぀いお

Alexey Shipilev-10幎以䞊にわたるJavaパフォヌマンスの問題。 珟圚はRed Hatで働いおおり、そこでOpenJDKを開発し、そのパフォヌマンスに取り組んでいたす。 JMH、JOL、JCStressなど、OpenJDKのいく぀かのサブプロゞェクトを開発およびサポヌトしたす。 Red Hatに入瀟する前、圌はIntelでApache Harmonyに取り組み、その埌Oracleに買収されたSun Microsystemsに移りたした。 生産性ずマルチスレッドの問題に取り組んでいる専門家グルヌプずコミュニティに積極的に関䞎しおいたす。



私はRed Hatで働いおいたす。 以前、私がOracleで働いおいたずき、「セヌフハヌバヌ」スラむドを挿入したした。 補品に゜リュヌションを実装しようずしおいる堎合、そこに䜕が真実で䜕がそうでないかを教えおくれる専門家を雇うこずは玠晎らしいこずです。



倧開発の成功の基準は䜕ですか



補品を開発しおいるずしたす。 あなたにずっお成功する補品ずは䜕ですか 私たちはすべお商甚プログラマヌです。 コヌディングしたものの絊䞎を支払うこずで、自分を欺くこずができたす。 しかし、実際には、補品を提䟛するサヌビスたたは補品党䜓を販売するために、絊䞎が支払われたす。







しかし、補品の成功のための玔粋に開発䞊の基準は䜕ですかビゞネス目暙を陀く





そのため、HabréでのJavaのパフォヌマンスに関する投皿を読んで、そこに同様のコメントが衚瀺されおいるこずに驚いおいたす。







専門家は次のように述べおいたす。 圌女は元気に働いおいたす。 私たちは満足しおいたす。すべおが順調です。」 しかし、コメンテヌタヌが来お答えたす。「4人の専門家の誰もがJavaを高速ず評䟡しおいないこずは非垞に重芁です。 むしろ、十分か぀満足のいくものです。」



悪いず蚀いたす ビゞネスの芳点から、テクノロゞヌがビゞネス基準を満たしおいる堎合は、神に感謝したす 私はすべおをなめらかに、スムヌズに、完璧に舐めるべきだずいう理想䞻矩的な考えは持っおいたせん。 これは起こりたせん-通垞、補品にぱラヌが含たれおいたす。



正しいプログラムず速いプログラム



人々は長い間、プログラムの正しさに぀いお二重に考えるこずを孊びたした。 聎衆に尋ねる誰が圌のプログラムにバグがあるず正盎に蚀うこずができたすか ホヌルには倚くの手がありたす倧倚数。 それでも、圌らは自分たちのプログラムが倚かれ少なかれ正しいず信じおいたす。 正しいプログラムの抂念は、高速プログラムの抂念ず察称的です。







「正しいプログラム」ずは、ナヌザヌの゚ラヌが衚瀺されないプログラムです。 ぀たり、実際にぱラヌがありたすが、ナヌザヌに補品の賌入を拒吊させるこずはありたせん。 「高速プログラム」には察称的な状況がありたす。パフォヌマンスの問題がないずいうこずではなく、ナヌザヌが䜕かを実行しようずするたびにこれらの問題が発生するわけではありたせん。



「成功基準に投資したした。」 成功には機胜ずパフォヌマンスの䞡方の基準がありたす。プログラムが100ミリ秒を担圓するのが適切です。 答えは さあ、先に進みたしょう。



「正しいプログラムのバグの数は通垞わかっおいたす。」 これは、プロゞェクトの成人期の指暙の1぀に過ぎたせん。プログラムにバグがないずいうこずは、バグトラッカヌにバグを登録するこずを誰も気にしないずいうこずですナヌザヌがいないためです。 パフォヌマンスの問題に぀いおも同じ話です。 パフォヌマンスの問題は既知であり、これは「高速」プログラムであるず蚀いたす。 航空芋積もりを䜜成









正しいプログラムず高速プログラムの䞡方で、これらのパフォヌマンスず機胜のバグを回避する方法が知られおいたす。 FAQには次のようなものがありたす。「そうするず、傷぀きたす。 たあ、 それをしないでください 。」



プロゞェクトの開発段階-それらぞの曲線。 W



私がパフォヌマンス䜜業に参加したほずんどすべおのプロゞェクトは、いく぀かの暙準的な開発フェヌズを経おいたす。 私はか぀お、これらのフェヌズが次のようになるこずを定匏化したした。







これはパラメトリックグラフです。時間はポむント「A」からポむント「B」、「C」、「D」、「E」に流れたす。 瞊座暙軞に沿っおパフォヌマンスがあり、暪座暙軞に沿っお抜象的なコヌドの耇雑さがありたす。



通垞、すべおは、ゆっくりずしかしゆっくりず動䜜するプロトタむプをサむクリングする人々から始たりたす。 私たちは自転車が自重で厩れないように自転車で走るので、それは非垞に耇雑です。



最適化が開始された埌、ゆっくりず、さたざたな郚分の曞き換えが開始されたす。 このグリヌンゟヌンにいる開発者は、通垞、プロファむラヌを䜿甚しお、明らかにひどく曞かれたコヌドを曞き換えたす。 これにより、同時にコヌドの耇雑さが軜枛され䞍良郚分を排陀するため、パフォヌマンスが向䞊したす。



ポむント「B」で、プロゞェクトは「䞻芳的」な「矎」のピヌクに達したす。これは、パフォヌマンスが良奜で、補品のすべおが良奜であるように芋えるずきです。



さらに、開発者がより高いパフォヌマンスが必芁な堎合は、より正確なプロファむラヌを取埗し、適切なワヌクロヌドを䜜成し、ナットを慎重に締めるず、む゚ロヌゟヌンに移動したす。 このプロセスで、圌らは生産性のためでなければ圌らがしないであろうこずをそこで行いたす。



さらに必芁な堎合は、開発者が生産性の最埌のパヌセントを埗るために補品をひねり始めるず、プロゞェクトはレッドゟヌンになりたす。 このゟヌンで䜕をするかは明確ではありたせん。 少なくずもこの䌚議甚のレシピがありたす-JPoint / JokerConf / JBreakに行き、補品開発者を拷問しお、䞋局の曲率を繰り返すコヌドを曞く方法を教えおください。 原則ずしお、赀いゟヌンには、䞋局で発生する問題を繰り返すものがあるからです。



レポヌトの残りの郚分では、これらの領域で通垞䜕が起こっおいるかを詳しく説明したす。



グリヌンゟヌン



グリヌンゟヌンの動機付けカヌドは、ブルヌトフォヌスによるコヌドのバリずの戊いです。







ブルヌトフォヌスずは、正確なツヌルが必芁ないこずを意味したす。 グリヌンゟヌンにはいく぀かの粟神的なtrapがありたす。



私のお気に入りは、「正垞にプロファむルするか、䜕もしない」です。







「Shipilevのレポヌトを聞いおください。通垞のプロファむルを䜜成する必芁があるかどうかを教えおくれたす。」 私はそれを蚀ったこずがない。 あなたがグリヌンゟヌンにいるずき、蚺断の粟床はほずんど圱響したせん。 そしお、䞀般的に蚀えば、「マむクロサヌビスモノリス」のどの郚分を蚘述したかを理解するには、プロファむリングが必芁です。最初に曞き換える必芁がありたす。



プロファむリングず蚺断



ブレンダン・グレッグなどのさたざたなクヌルなパフォヌマンスの男のブログを芋るず、圌はそのような恐ろしい図を衚瀺し、そのようなツヌルを䜿甚しお前埌に芋るこずができるず蚀いたす







倚くの人は、これらのチャヌトを芋るず、「パフォヌマンスは非垞に難しいので、それはしたせん」ず蚀っおいたす。 実際、ブレンダンの考えはそれに぀いおではありたせんが それは、アプリケヌションで䜕が起こっおいるかを迅速に評䟡するためのかなり簡単な方法があるずいう事実です。 少なくずも倧芏暡なセルの理解があれば、はるかに良くなりたす。



したがっお、グリヌンゟヌンでの蚺断は、非垞に単玔なアむデアに基づいおいたす。アプリケヌションを芋るのを恐れないでください。 スタックのリ゜ヌスに䞍足しおいるものを倧芏暡に理解するこずでさえ、泚意を払う䟡倀のあるものずそうでないものに぀いおの考えをすでに䞎えおくれたす。 完党なシステムプロファむリングを行ったずしおも、ボトルネックのある堎所はすでに明確になっおいたす。







プロファむリング



グリヌンゟヌンでの目暙は、どこで時間を過ごすかを倧たかに理解するこずです。







スティックやドングリから収集できる玠朎なプロファむラでさえ、グリヌンゟヌンで意識的なアクションを実行するのに十分な情報を提䟛したす。



悪の管理者がプロファむラヌのむンストヌルを蚱可しおいないプロダクションがある堎合は、sshを介しおjstackを実行し、「trueのずき」を実行できたす。 jstackを実行したす。 睡眠1; 完了したした。」 これらのjstackを1,000個収集し、集玄したす。 これは「ニヌハむ」プロファむラヌになり、補品の䜕が悪いのかを十分に理解できたす。



ストップりォッチを手に入れお、補品のこの郚分で時間の80を、補品のこの郚分で20を費やしおいるこずに感謝しおいおも、䜕が起こるかに぀いおコヌヒヌかすを掚枬するよりも良いでしょう2005幎にVasyaが䜜成したランダムに䜜成されたクラスで䜕かを修正したす。



パフォヌマンス枬定



プロファむリングに関連する次の粟神的なtrapは、パフォヌマンスを通垞に枬定する必芁があるか、たったく枬定する必芁がないこずを瀺しおいたす。







私はい぀もそれに぀いお聞いおいたす。 しかし、改善のグリヌンゟヌンでは、通垞「プラスたたはマむナス1キロメヌトル」が目で芋られたす。 通垞、圌らはこれを「あなたは悪いベンチマヌクを持っおいる、䜕も衚瀺されおいない、それは䞍十分に曞かれおおり、パフォヌマンスを正しく枬定する必芁がある」ずいう文脈で蚀いたすが、同時に、ほずんどすべおのワヌクロヌドで芋られるレヌキがありたす。



道埳



モラルは非垞にシンプルです。グリヌンゟヌンでは、些现なストレステストでも倧きな欠陥が衚瀺されたす。







Twitterに公開リンクを匵ったり、ベヌタテストに来おアプリケヌションを台無しにしたりする人々を集める代わりに、JMeterでストレステストを曞くのに䜕週間も費やしおいるケヌスを芋おきたした。プロファむラヌず䞀緒に座っお、萜ちた堎所を確認したす。 通垞のApache Benchでさえ、十分に十分な欠陥を瀺しおいたす。



開発䞭の䞻芁な欠陥に関するこれらのパフォヌマンスデヌタをより早く取埗するほど、迅速に修正できたす。 これは、特にパフォヌマンス䜜業を蚈画するのに圹立ちたす。



サプラむズの䟋



私は最近、JDK 9 Early Accessを䜿甚しお、次のように考えたした。それを䜿甚しおプロゞェクトをビルドしようずする必芁がありたす。







構築䞭です。コンパむル時間は2分から8分に増えおいたす。突然。 この状況では、これが本圓に回垰であるこずを蚌明するために、このためのきちんずしたベンチマヌクを曞く必芁がありたすか







もちろん違いたす。 ビルドに特定のバグがありたすが、再珟可胜です。 プロファむラヌでは、javacの有名な堎所に぀ながる呌び出しスタックがあるこずがわかりたす。 このjavacでは、゜ヌスコヌドが芋぀かり、そこに2次ルヌプが芋぀かりたす。



次のような堎合に、これが問題であるこずを蚌明する必芁がありたすかaワヌクロヌドが悪い。 bそこに瀺されるプロファむルはい぀ありたすかc二次サむクルが悪いずいう理論的考察 いいえ、それで十分です。



最適化



別の粟神的なtrap「時期尚早な最適化はすべおの悪の根源です。」







もちろん、Knutはただ健圚です。 しかし、誰かがこのフレヌズを思い出すたびに圌がどの皋床しゃっくりするかはわかりたせん。なぜなら、このフレヌズは通垞、誀っお芚えられおいるからです。 Knut氏によるず、99.7のケヌスでは、時期尚早の最適化がすべおの悪の根源であり、人々は最適化が必芁な堎所を理解しおいないからです。 あなたがグリヌンゟヌンにいるずき、あなたは気にしたせん。 ずにかく矎しいコヌドを曞き盎したす。 最初に曞き換える内容を決定するには、プロファむリングが必芁です。



どんな通話がありたすか



原則ずしお、パフォヌマンスの改善は、䞻に「悪い」コヌドを「良い」に曞き換えるこずです。 しかし、「悪い」ず「良い」は、ある皋床䞻芳的な味です。 少数のプログラマヌに尋ねおください。あなたはこのように必芁なものをずおも矎しいず蚀うでしょう。 もう1人は「ここに䜕を曞いたの」ず蚀うでしょう。 もちろん、これはすべお味わうこずができたすが、「Effective Java」ずいう本を曞いたあなたやJoshua Blochに悩たされおいるものを含む、トリックに悩たされるこずもありたす。







たずえば、効果的なデヌタ構造。 グロヌバルs / LinkedList / ArrayList / gがためらうこずなくパフォヌマンスを改善したプロゞェクトを知っおいたす。 LinkedListの方が高速な堎合もありたすが、これらの堎合は非垞に特殊であり、通垞は肉県で芋るこずができたす。



HashMapを䜿甚できる堎所でArrayListを線圢怜玢しおいるこずに突然気付く堎合がありたす。 1組のkeySetずgetを繰り返しお、entrySetに倉曎するか、bubbleSortを埪環させお、突然100䞇個の芁玠のコレクションがそこに来お、そこに倚くの時間を費やしおいる、などです。



グリヌンゟヌンの小蚈







プロファむリングは、日々の開発に必芁な郚分です。



私の芳察によるず、パフォヌマンスの問題の95は最初のプロファむリング蚪問で解決されおいたす。 プロゞェクトの耇雑さに関係なく、経隓のある人々がどのようにプロゞェクトを開発しおも、プロゞェクトの最初のプロフィヌルを人々に芋せるず、圌らは感情の範囲、特に「私たちは銬鹿だ」ず感じたす。 これらの問題の90以䞊が自明に解決可胜であり、理論的には、コミット前にキャッチされるべきだったからです。



テクニカル゚キスパヌト、アヌキテクト、テクニカルディレクタヌ、たたは他の䞻芁な技術的地䜍を占めおおり、生産性が必芁な堎合は、プロゞェクトにプロファむラヌを起動するための明確な指瀺があるこずを確認しおください。 ラむナヌが1぀、ボタンが1぀、たたはAPMを備えたWebアプリケヌションがある堎合は、非垞に䟿利です。 開発者は垞にこれを迅速に行う方法を持っおいる必芁がありたす。



私の経隓では、開発者の手を取り、圌がいくら幎をずっおも、圌らず䞀緒に座っお補品をプロファむリングすれば、パフォヌマンス䜜業に察する圌の恐怖を確実に止めるこずができたす。 倚くの人々は、パフォヌマンスが難しいほど、コンポヌネント間にさたざたな盞互接続があるなど、頭の䞭にそのようなブロックを持っおいたす。 そしお、圌らはたったくプロファむリングしたせん。それは難しいからです-぀たり、これたでのずころ、それは必芁ではありたせん。 しかし、䞀床座っお䞀緒にやるず、圌らはこのブロックを削陀し、自分でプロファむルを開始したす。 そしお、誰かが来る前に解決できる゚ラヌの90は、プロフィヌルを芋せお恥をかかせ、事前に修正したす。



さらに、「開発者の手を取りたす」-これは、䌚議に1000人収容するこずを意味しおいるわけではありたせん。スピヌカヌが出おきお、スマヌトな倖芳でプロファむラヌに䜕かを運び始めたす。 これは機胜したせん。 動䜜が異なりたす。プロゞェクトの特定の開発者ず䞀緒に座っお、カップルでそれを行いたす。



む゚ロヌゟヌン



む゚ロヌゟヌンは、パフォヌマンスず匕き換えにコヌドが耇雑になるこずを意味したす。これは、パフォヌマンスを䞊げたくない堎合に実行しないこずを行う堎合です。







粟神的なtrapもありたす。



プロファむリングず蚺断



最初のメンタルトラップ「プロファむラヌを䜿甚しお、最適化を開始する堎所ず方法を確認したす。」







黄色のゟヌンでは、゚ラヌの䟡栌が䞊昇しおいるこずがわかりたす。生産性は埗られたすが、保守性、開発者の睡眠など、代わりに䜕かを倱うこずになりたす。 したがっお、高床な蚺断を必芁ずする適切な倉曎を行う必芁があり、プロファむリングは蚺断の䞀郚にすぎたせん。 ベンチマヌクなどもありたす。



通垞、人々は黄色のゟヌンを掘り䞋げお、䜕を最適化すべきかを考え始めるず、プロファむラヌを開いおこれを芋る







そしお、ここで䜕を最適化したすか java.nioで曞き換えるか、最もホットなメ゜ッドはjava.lang.Object.waitであるず蚀いたす。぀たり、オヌバヌクロックする必芁がありたす。 たたは、Unsafe.parkがあるため、オヌバヌクロックする必芁がありたす...たたはSocketInputStream.socketRead0、たたはsocketAccept-ネットワヌクが衚瀺されるため、すべおを緊急にNettyに曞き換える必芁があるこずを意味したす。 確かに、このゎミはすべおJMXからのものですが、3か月の開発の埌、これに぀いおは埌で確認したす。 たたは、Object.hashCodeがありたす-悪いHotSpotがそれを最適化しなかったずしたしょう。しかし、「すべおが速くお良いものになるず玄束し、補品は責任を負いたせん」。



黄色のゟヌンの操䜜方法は簡単です。最適化、これを行う理由を説明する必芁がありたす。 たぶんあなた自身のためか、あなたのプロゞェクトマネヌゞャヌのためでしょう。



持っおいるこずが望たしい





アムダヌルの法則



生産性を評䟡するためにタスクを䟝頌するず、経隓の浅い人がひどくごちそうになりたす。なぜなら、頭の䞭に非線圢の䟝存関係を眮くのは非垞に難しいからです。 これらの非線圢䟝存関係の1぀はアムダヌルの法則であり、通垞は次のようになりたす。



アプリケヌションがあるずしたす。 AずBの2぀の独立した郚分がありたす。たずえば、A郚分は70の時間で2倍加速し、B郚分は30の時間で6倍加速したす。 分散できるのはそのうちの1぀だけです。これには十分なリ゜ヌスしかありたせん。 どのシステムをオヌバヌクロックしたすか 単にグラフィカルに削枛しおも、次のこずがわかりたす。







パヌトAは、合蚈時間の70で機胜したす。 パヌトAを2倍だけ加速するずいう事実にもかかわらず、パヌトAを最適化するこずをお勧めしたす。 党䜓的なパフォヌマンスぞの圱響が倧きくなりたす。



もし私がフリヌランスのプログラマヌなら、おそらくパヌトBを6回オヌバヌクロックするでしょう。 私の週報では、この数字はもっず良く芋えるだろう「Vasyaは2倍になり、私は2倍になったので、絊料を3倍増やす必芁がある」。



アムダヌルの法則は次のように掚枬されたす。







スピヌドアップSがある堎合、定矩により、合蚈時間A + Bを新しい時間で割った倀になりたす。 パヌトBは同じたたであるため、「プラスB」があり、パヌトAはS A回枛少したした。 この付録でパヌトAずパヌトBの盞察時間を瀺すパヌトAずパヌトBの 2぀の衚蚘法を導入するず、次の匏になりたす。









この比率には楜しい特性がありたす。 たずえば、S Aを無限に向ける堎合、制限S









これは明らかなこずではなく、理解するために自分の肌で䜕床も感じる必芁がありたす。 圌らはここでそのようなグラフを通しおあなたを瀺したす









...そしお蚀う加速する郚分が80を占有するアプリケヌションがある堎合、そのポむントたで加速したすが、スピヌドアップが5倍を超える堎合、それは埗られたせん。



これは、デヌタベヌスベンダヌがあなたに来お、次のように蚀っおいるこずを意味したす。デヌタベヌスがワヌクロヌドの50を占有しおいるこずがわかりたす。 1行のコヌドを倉曎せずに珟圚の゜リュヌションを圓瀟のものに倉曎するず、パフォヌマンスが10倍になるこずを保蚌したす。 圌に䜕ず蚀わなければならないのですか 芳客からブルたわごず



さらに進んでくださいアムダルの法則の䞀般化がありたす。 これらの甚語を少しひっくり返しお、2぀の新しい衚蚘法を導入するず、pは高速化され、AはAの特定の郚分を分散させた時間であり、alphaは他のすべおの郚分の量です。この法則は次の圢匏で蚘述できたす。







問題は、これらのメンバヌに䜕らかの物理的意味があるずいうこずです。 通垞、最初のメンバヌは䞊行性ず呌ばれたす 。 今のずころ、2番目の甚語-競合-を無芖するず、衚珟は次のこずを意味したすパヌトAを䜕回加速したか、䞀般的なスピヌドアップをどれだけ埗たか。 競合は、アムダルの法則でこれず同じ挞近線を提䟛する他のすべおの生産性ぞの圱響を説明しおいたす。 ずころで、この関数のグラフを描くず、アムダルの法則ず同じ曲線が埗られたす











ただし、原則ずしお、ほずんどの堎合、この圢匏のアムダヌルの法埋は適甚されたせん。 コヒヌレンスず呌ばれる、コンポヌネント間の盞互䜜甚を蚘述する別のメンバヌがそこに远加されるず、より耇雑な法則が適甚されたす。







アルファずベヌタが負でない堎合、飜和挞近線がないこずがわかりたす。 䜕らかの効率のピヌクがあり、その埌、生産性が䜎䞋し始めたす。 パフォヌマンスに関わる倚くの人々は、この法則をナニバヌサルスケヌラビリティ法USLずしお定匏化するたで、自分の肌で感じおいたした。







ここでは、「普遍的」および「法則」の抂念が自然科孊的な意味で䜿甚されおいたす。぀たり、理論的に正圓化されおいたすが、分析的には導き出されおいたせん。 これは、経隓的蚌拠にたで及ぶ法埋ずしお掚定されたす。



アルファずベヌタがれロに等しいシステムはありたせん。システムにリ゜ヌスを远加したり、䜕かを最適化したりする堎合が倚く、悪化するためです。 たずえば、あるボトルネックを取り陀いたが、別の重いボトルネックにぶ぀かりたした。



パフォヌマンス枬定



パフォヌマンスを枬定するメンタルトラップには、「すべおが耇雑であり、すべおがパフォヌマンスに䞎える圱響がわからないため、䜕かを芋぀けおベンチマヌクが瀺すこずを確認するだけです」ずありたす。







実際、パフォヌマンステストは非垞に高䟡であり、特にすべおをテストするこずはできたせん。 パフォヌマンステストは、機胜テストナニットテストなどがパックで実行される堎合でも、100ミリ秒以䞋で合栌するずいう点で機胜テストず異なりたす。 パフォヌマンステストでは、物事はそれほどスムヌズではありたせん。 1分以䞊からテストに合栌し、数時間かかる堎合がありたす。 これは、1぀の倉曎を数癟時間のマシンでテストできるこずを意味したす。 1日に倧量のコミットを行う堎合、テストシステムを介しお䜕らかの方法でアクセスを提䟛するには、非垞に倚くの機噚が必芁です。



パフォヌマンステストには隔離が必芁です。



原則ずしお、パフォヌマンステストは非バむナリメトリックを提䟛したす。 通垞、機胜テストは「PASS」たたは「FAIL」、぀たりバむナリメトリックを瀺し、パフォヌマンステストは...「67」を瀺したす。 さらに悪いこずには、圌らは67ではなく、67プラスマむナス5ず蚀いたす。 これは、ずりわけ、テスト゚ラヌはデヌタを解析した埌にのみ怜出されるこずを意味したす。すべおがどこでも非垞に矎しいこずを理解しおいるずきですが、ここでは、暗い隅に、実隓が焊げおいるこずを瀺すデヌタがありたす。 , .



, - , - — - , . , , , , , .



— . , , , .





: .







, «», , , end-to-end , , -. .



— , , .



, , — .



: — , — . () , . , — . , — real world . , , «real world». , . , , . «real-world», , , , .



— . , , . , , , , , . , , , . , , , , white paper- , , .. .





bull shit , , .









— , , .., «» , , . , . .









, , bottleneck, . , , . .



. .









— , . 0, speedup . ( , , 2 ), , , , .









, , .



:







speedup , — speedup . , - , , , , .



, — . .







. - 50 , , 50 , . , , , , , , , — . , , , .



:

:





すなわち — .



:





, , , ( ), . , .



, . , « - » , . , , , , , , — , , . , .



最適化



, , . :







« , — 100 , a 110. ,  » - JPoint. , , , , - . , branch prediction - (, , -, ).



, , , . , . , ( , , ):



  1. , , — N^3, N log N. , , , , , ;

  2. , , , , , , . , PR , ;

  3. . , , , -;

  4. , . , , .





, , , - , , . , , , ..



JVM



: , , , JVM, ? : , ( , JVM).



, , . Google : «JVM tuning options». :









, - , « JVM».



, . , , , . , , , .





, , parallelStream(), Eexecutor.submit, new Thread, . ? , , , - .



: , , . — , dispatching . staging, , . , , - , - -Hadoop, MapReduce; , . , , 10 000 , .. — , .





別の䟋。 : « , - Integer Java — , int ».



, «int- — » , , , . , , : , , ( , - , , , ), JDK - Valhalla.





Modus operandi: — , , , . .



50% , . : , , « » .



, 80% ( 83% , , ).



. , , , , , , . . , , , , , . , .





: , . — , , . , .









, , - , , : « »!



— .







䟋







プロファむリングず蚺断





通垞、誰もが偶然このゟヌンに行き着きたす。 可胜なすべおのオプションが遞択されるず、圌らは自分自身に蚀いたす「それでは、次に䜕をすべきかを考えたす。」 そしお、あなたが長い間プロファむルを芋るず、あなたは解決策を芋るこずができるようです。 圌らは決定が難しいこずを理解しおいたす。぀たり、芋るのに長い時間がかかるこずを意味したす。







実際、レッドゟヌンをハッキングする胜力は、可動郚分の盞互䜜甚を理解するこずから生たれたす。 そしお、この堎所にはパフォヌマンスアヌティストが登堎したす。これらは特に他のすべおに専念しおいるわけではありたせんが、䞀床にすべおのレむダヌを掘り䞋げるこずができたす。 圌らは歩行癟科事兞であり、頭の䞭にはそのような状況で働くハックのセットがありたす。 圌らは適甚の限界を知っおいたす。 最も重芁なのは、これらの人々は、芋慣れないがらくたを芋おもwhen然ずしないが、それを勉匷し始める人々です。



䜕も明確でないプロファむルが衚瀺された堎合、「では、このプロファむルを削陀しお、新しいデヌタをもたらす実隓をしたしょう」ず蚀いたす。 デヌタを収集する䜓系的な垰玍的方法がここで機胜したす。 圌らのために勉匷するずいうこずは、コヌドをダりンロヌドしおStackOverflowに投皿し、「このようなパフォヌマンスの問題はありたすか」ず尋ねるのではなく、John Skeetなどの人々が来るのを埅ちたす。圌らはそこでどのように、䜕をする必芁があるかを教えおくれたす。 勉匷ずは、ドキュメントを読んだり、蚘事内の参考文献を探したり、実隓をしたり、同僚から知識を匕き出したり、䜕らかの方法で敎理したりするこずです。 倚くの人々がこのために䌚議に来たす。



䌚議のコツ



別のメンタルトラップがありたす「長い間䌚議に行った堎合、い぀かいく぀かの䌚議で圌らは私たちのプロゞェクトを5倍改善するトリックを䌝え、その埌チケットに費やした予算党䜓を取り戻したす。」







実際、特定のケヌスでは、1000回の保存のうち1぀の䜎レベルのトリックです。 海蟺で倩気を埅぀よりも自分で芋぀ける方が簡単です。 プログラミングパヌティヌで最も面癜いのは、パフォヌマンスに関する議論のほずんどが䜎レベルのハッキングに関するものだずいうこずです。







原則ずしお、これらすべおのこずは、プロゞェクトのプログラマヌが単玔なアルゎリズム倉換を䜿甚しお、パフォヌマンスを䜕倍も改善できる状況で発生したす。 しかし、圌らは䌚議でスマヌトHotSpotが䜕らかの圢でコンパむルされるず蚀われたので、HotSpotでうたくコンパむルされるようにプロゞェクトを修正する必芁があるので、圌らは䞻なものを芋逃しおいたす-圌らは実際に自分で芋぀けるこずができる倉曎を持っおいたす高速です、パフォヌマンスが向䞊したす。



束葉杖



レッドゟヌンにいお、この皮の䜎レベルの違いを芋぀けた堎合、実際にはほずんどの堎合、オプティマむザヌの実装の違いです䞊蚘のケヌスの倚くは実際に同じように機胜するはずです。 ただし、ハッキングは䞀時的なパッチであり、プロゞェクトの基盀ではありたせん。







原則ずしお、それらは䞋のレむダヌの問題を瀺したす。䞋のレむダヌは実際にはより健党なパフォヌマンスモデルを提䟛する必芁があるためです。 さたざたな䜎レベルのゲヌムに぀いお報告されるレポヌトを聞いた堎合、即時のアクションのガむドずしお受け取らないでください。 このレポヌトは、非垞にタむトになった堎合にい぀か必芁になる可胜性のあるハッキングのコヌパスを構築するのに圹立ちたす。



䟋



JDK 9で最近芋぀かった非垞に簡単な䟋がありたす。







JavaにはArrayList型があり、内郚クラスItrを介しお実装される反埩子がありたす。 このItrクラスはプラむベヌトなので、Itrコンストラクタヌを呌び出すこずができるように、合成のいわゆるbridgeメ゜ッドパブリックがありたす。 問題は、Itrを呌び出すず、このメ゜ッドのシグネチャにただロヌドされおいないクラスが衚瀺されるため、ホットスポットむンレむダヌが砎損するこずです。



この゚ラヌはどこにありたすか最適化䞭 これはArrayListコヌドの゚ラヌですか むしろ、いいえ。 これはjavacコヌドのバグですか はい、そうです。 ホットスポットコヌドでの最適化が䞍十分ですか むしろ、はい。 しかし、コンパむラヌが気づき、コンパむラヌでこれを修正する方法を理解するたで、ArrayListに盎接入れる方が簡単です。







したがっお、匕数のないこのようなコンストラクタヌがそこに䜜成され、バグぞのリンクがそこに曞き蟌たれ、このコンストラクタヌが䜜成される理由などが瀺されたす。



èš‚æ­£



レッドゟヌンを長時間掘り䞋げるず、通垞、人々があなたのずころに来お「すぐに飛び蟌もうずするず、すべおが自分を傷぀けたす」ず蚀いたす。 メンタルトラップは非垞に単玔です。圌らは、ハックをすぐに回せば玠晎らしいず思いたす。







緎習では、レッドゟヌンでは「傷」が発生しないこずが瀺されおいたす。

䟋ずしお私は圌を垞に芋おいたす









JDKでパフォヌマンスの問題が芋぀かりたした。 JDKで修正する代わりに、次のように蚀いたした。 Unsafeを介しおハッキングしたす。」 そしお、Unsafeがなくなっおおり、setAccessibleでさえ機胜しおいないこずがわかりたした。 したがっお、だたされおはいけたせん。 レッドゟヌンで䜜業する堎合、技術的負債を負担したす。









ハックが䜕のために行われたのか、どのような条件䞋でそれが適甚されるのか、それがもはや必芁でないこずを確認する方法、あなたが埅っおいるアップストリヌムのバグなどを垞に文曞化したす。



私は孊校での孊校生掻の授業で止血垯を䜜るように教えられたした。 私は今でも、血の鞭の色に応じお、この止血垯を傷の䞊たたは䞋に適甚するずいうこの指瀺を思い出したす。 しかし、私は呜什の別の段萜のために思い出したすあなたの同志の身䜓に止血垯を眮いた埌、あなたはそこにタむムスタンプ付きのメモを眮くべきです。



コヌドにこのようなハックを䜜成するたびに、特定のストヌリヌが頭の䞭にありたす。コヌドのひどい箇所に止血垯を眮き、そこに䜕らかの理由でそれが行われたこずを曞く必芁がありたす。バグ、およびこのハヌネスは、そのような条件が満たされた堎合にのみ削陀できたす。 これにより、私たたは他の同僚がこのコヌドを発芋したずきに、すぐに切り取る䟡倀があるかどうかを理解する機䌚が埗られたす。たたは、止血垯を削陀するず、プロゞェクトの残りの郚分たたは仲間が殺されたす。



レッドゟヌンの小蚈



ハッキングを犁止したせん。 これに぀いお譊告するのは愚かなこずです。ずにかくそれらを行うでしょう。 ただし、プロゞェクトでハッキングの数ず密床を維持するこずは、その存続に必芁な条件です。



アップストリヌムず連携する機胜たずえば、䞊蚘のリポゞトリに倉曎をコミットしおオヌプン゜ヌスに取り組んでいる堎合は、長期的な運呜を倧いに促進したす。 パッチを適甚した内郚補品がアップストリヌムから分岐するほど、それをサポヌトするのに費甚がかかりたす。



これらのすべおの局を理解する胜力は、「猫で」正垞に蚓緎されたす。おそらく、あらゆる皮類の重芁な倉曎を実行できるステヌゞング環境が必芁です。



別れの蚀葉



しかし、ここで私たちは筋金入りの䌚議です。 このすべおの富で䜕をしようか

筋金入りの䌚議に参加しおいお、補品のナヌザヌである堎合、生産性に携わる人ずしおの私の芳点からは、次のこずを行う必芁がありたす。





補品開発者の堎合







䞻なパフォヌマンス䜜業はグリヌンゟヌンで行われるこずに泚意しおください。 プロゞェクトの生産性を高めるたびに、たず簡単なこずを芋おください。 排気性胜が向䞊したす。 それは退屈なので、誰も䌚議でそれらに぀いお話すこずはありたせん。 圌らは通垞、黄色たたは赀色のゟヌンに぀いおあなたに話したす。 誰かがLinkedListをArrayListに英雄的に亀換した方法に぀いお、通垞は誰も話さないでしょう。






Joker 2017では、Aleksey Shipilevが「Shenandoah可胜性のあるガベヌゞコレクタヌパヌト2」ずいう新しいレポヌトを提䟛し、Shenandoahのような䜎速GCが盎面しなければならない問題ず、JVMレベルで䜕ができるかに぀いお話したす。 䌚議はサンクトペテルブルクで11月3日ず4日に開催されたす。 プログラムず他のレポヌトの発衚はむベントの公匏りェブサむトにありたす 。



All Articles