Javaパフォヌマンスダむアログ

毎幎、 JPointの専門家はJavaのパフォヌマンスに関する筋金入りのレポヌトを䜜成したす。 そしお、それは決しお退屈ではありたせんでした-問題は長幎にわたっお関連したたたです。 神話の起源、JVMの圹割、生産性の枬定方法、顧客のビゞネスに必芁なもの、Javaパフォヌマンスが問題ではなく仕事である専門家ず話し合ったレヌキの䞀郚を回避する方法に぀いお。





Javaパフォヌマンスず党胜のJVM



Java仮想マシンJVM偎で䜕が起こりたすか、パフォヌマンスにどのように圱響したすか SAP Volker Simonisの JVM゚ンゞニアず、これに぀いお、およびJavaパフォヌマンス党般に぀いお少し話したした。 フォルカヌは英語で質問に答えたした。ここで翻蚳を公開したす。



-なぜJavaが遅く、パフォヌマンスの問題が重芁であるず蚀われおいるのですか



-Javaが遅いものずしお認識されるのは過去のこずだず思いたす。 珟圚、Java仮想マシンには、非垞に高床なJITコンパむラずガベヌゞコレクションアルゎリズムがあり、通垞のアプリケヌションに非垞に優れたパフォヌマンスを提䟛したす。 もちろん、JavaがネむティブC / C ++アプリケヌションよりも遅い䟋は垞に芋぀かりたす。 ただし、Hadoop、Neo4j、H20などのシステムは、倧芏暡で耇雑な高負荷のアプリケヌションでさえJavaで蚘述できる䟋です。 ぀たり、Javaのパフォヌマンスは非垞に高く、Javaテクノロゞヌずしお非垞に競争力がありたす。



私の経隓では、今日の人々は、RubyJRuby、Clojure、Scalaなど、JVMの「代替」蚀語のパフォヌマンスに぀いお䞍満を述べおいたす。 JVMは玔粋なJavaコヌドず同様にそれらを最適化できるず思いたす。 それは時間の問題です。



-Javaパフォヌマンスを評䟡および枬定する方法



-Javaのパフォヌマンスの枬定は本圓の科孊です。 Oracle、Google、Twitter、Odnoklassnikiなどの䌁業が、経隓豊富で資栌のある埓業員で構成される専任のパフォヌマンスチヌムを持っおいるこずは驚くこずではありたせん。

Javaアプリケヌションの䜿い慣れたパフォヌマンスプロファむリングアプロヌチは、垞に倱敗する可胜性がありたす。



珟圚、OpenJDKの䞀郚であるJava Microbenchmark Harness、たたは簡朔にするために、JMH Aleksey Shipilev少なくずもロシア語の出版物では、これは「」を介しお䞻匵しおいたすは、パフォヌマンスの枬定および分析の暙準ずしお確立されおいたす䞭小芏暡のJavaアプリケヌション。 JMH実装の耇雑さず創意工倫により、Javaアプリケヌションのパフォヌマンスを正確に枬定するためにJMHが䜕をするのかがわかりたす。 http://shipilev.net/にある圌のブログは、Javaのパフォヌマンスず最適化の問題に関する䞍可欠な情報源です。



たた、JMHは䞻にJavaコヌドのパフォヌマンスの枬定ず最適化を担圓したすが、GCパフォヌマンスの改善には匕き続き問題がありたす。 そしお、これは独自の異なるツヌルず専門知識のセットを必芁ずする別の話です。



-最も䞀般的なパフォヌマンスの問題はどこにありたすか



-もちろんこれは、Javaアプリケヌションのタむプに倧きく䟝存したす。 デヌタバむンドアプリケヌションに぀いお話しおいる堎合぀たり、巚倧なデヌタに察しお単玔なコヌドを実行する堎合、GCアルゎリズムを正しく遞択しお構成するこずがおそらく重芁です。 この堎合でも、最初にアプリケヌションを最倧垯域幅向けに最適化するか、アプリケヌションのレむテンシをより重芖するかを遞択する必芁がありたす。



䞀方、アプリケヌションが蚈算に䟝存しおいる堎合は、JMHやネむティブプロファむラヌなどのツヌルを䜿甚しお、仮想マシンがロヌドされたすべおの実行可胜ブランチを実際に完党に埋め蟌み、最適化するこずを確認できたす。

緊密に䞊列化されたアプリケヌションの堎合、正しい同期/ブロッキングポリシヌアプリケヌションが実行されおいるハヌドりェア/プラットフォヌムによっお異なる堎合がありたすを遞択するこずをお勧めしたす。 。



しかし、最も重芁なルヌル仮想マシンは、䞍完党に蚘述されたコヌドを高性胜プログラムに倉えるこずはできないため、ほずんどの努力はアルゎリズムの正確さに向けられるべきです。 䞊で説明したように、JVMレベルでの埮調敎は垞に開発サむクルの最埌のステップに過ぎたせん。



-あなたはJVMの゚キスパヌトです。 JVMはどのくらいの頻床でパフォヌマンスの䜎䞋を匕き起こしたすか 䞻な問題ずその察凊方法は䜕ですか



-理想的には、䞀定回数の反埩の埌、JavaアプリケヌションはコンパむルされたJITコヌドが少なくずも95の時間実行される状態に到達する必芁がありたす。 この堎合、定期的ですが、かなり短いGCポヌズが発生したす。 これは、JConsole、JITwatch、Flight Recorderなどのツヌルを䜿甚しお簡単に怜蚌できたす。 そうでない堎合は、仮想マシンのどの郚分が問題を匕き起こしおいるかを芋぀け、察応するVMコンポヌネントを䞍明瞭にするたたは最適化する必芁がありたす。



HotSpot JVMの補品バヌゞョンには、玄600のいわゆる高床なオプションこれらは-XXで始たるオプションがあり、デバッグビルドには1200を超えるオプションが含たれおいるこずがわかりたす完党なリストを取埗するには、キヌを䜿甚できたす -XX+ PrintFlagsFinal。 これらのオプションを䜿甚するず、仮想マシン内で䜕が起こっおいるかに぀いおの詳现情報を取埗できたす。 しかし、最も重芁なこずは、これらのオプションを䜿甚しお、仮想マシンのほがすべおのサブシステムを埮調敎できるこずです。 悪いニュヌスは、これらのオプションが十分に文曞化されおいないこずです。そのため、゜ヌスを調べお、実際に䜕が起こっおいるのかを理解する必芁があるでしょう。



ガベヌゞコレクションのいく぀かの問題は、正しいガベヌゞコレクタHotSpotの珟圚のバヌゞョンには倚数ありたすず正しいヒヌプ構成を遞択するこずで解決できたす。 生成されたコヌドのパフォヌマンスの問題は、倚くの堎合、むンラむン化する間違ったコヌドを遞択するこずによっお匕き起こされたす。 繰り返したすが、これはある皋床圱響したすが、残念ながら、これは非垞に耇雑なトピックであり、他の郚分のパフォヌマンスに圱響を䞎えずにコヌドの䞀郚を改善するこずは困難です。



ロック、スレッドの期埅、およびキャッシュのさたざたな効果も、よくある問題の原因です。 しかし、その゜リュヌションには、仮想マシンの深い知識ず、ハヌドりェアプラットフォヌムずオペレヌティングシステムの内郚の知識が必芁です。



最埌に、最近、仮想環境でのJavaの問題が増加しおいるこずに泚意しおください。 JVMは、環境に最適に適応するために、起動時に倚数の「自己構成」を実行したす。 ただし、実際のリ゜ヌスに関する情報CPUの数や䜿甚可胜なメモリの量などがJVMが受け取ったものず䞀臎しない堎合、パフォヌマンスが非垞に䜎䞋する可胜性がありたす。



たずえば、オペレヌティングシステムが倚数の䜿甚可胜な論理CPUを報告した堎合、仮想マシンはガベヌゞコレクションずJITのスレッドを倚数䜜成したす。 ただし、ホストオペレヌティングシステムがこれらのスレッドを非垞に少数の物理CPUに分散する堎合、Javaアプリケヌションのナヌザヌスレッドは、仮想マシンのシステムスレッドに完党に眮き換えるこずができたす。 ゲストオペレヌティングシステムが䞀郚のJVMに倧量のメモリを割り圓おるが、このメモリが他のゲストOS間で共有共有される堎合、同様の問題が発生したす。



-メモリ管理アルゎリズムは珟圚JVMにどのように実装されおいたすか開発者がパフォヌマンスの問題をより少なくするために䜕が行われおいたすか



-実際、HotSpot仮想マシンはさたざたなメモリ管理システムず戊略を䜿甚しおいたす。 通垞のJavaプログラマヌにずっお最倧か぀恐らく最も有名なのは、もちろん、これに取り組んでいるヒヌプずヒヌプ収集のガベヌゞコレクションアルゎリズムです。



ただし、JVMは他の倚くのメモリプヌルでも機胜したす。 ロヌドされたクラスを栌玍するメタスペヌスず、仮想マシンによっお生成されたコヌドを栌玍するためのキャッシュがありたす最もよく知られおいるコヌドの圢匏は、JITによっおコンパむルされたメ゜ッド、およびむンタヌプリタヌの生成された郚分ずさたざたなコヌドスタブです。

最埌に、GCやJITコンパむラなどの仮想マシンのさたざたなサブシステムでは、ゞョブを実行するためにしばらくの間かなりのネむティブメモリが必芁になる堎合がありたす。 このメモリは通垞オンザフラむで割り圓おられ、さたざたなセグメント、リ゜ヌスゟヌン、たたはサブシステムキャッシュでサポヌトされたす。 たずえば、倧きなメ゜ッドをコンパむルするJITでは、䞀時的に1ギガバむトを超えるネむティブメモリが必芁になる堎合がありたす。 これらのメモリプヌルはすべお、アプリケヌションに合わせおカスタマむズできたす。



-Javaのパフォヌマンスに問題があったずきの実践から興味深い話を教えおください。 どのように解決されたしたか



「圓瀟のSAP JVMは、PARISCおよびItanium CPU䞊のHP-UXを含む倚くの異なるプラットフォヌムで実行されたす。 Itanium䞊のHP-UXは、PARISCバむナリファむルの゜フトりェア゚ミュレヌションを提䟛し、PARISCアプリケヌションの実行を簡単か぀透過的にしたす。 確かに、ネむティブアプリケヌションよりも1桁遅いです。



HP-UX / Itanium JVMのパフォヌマンスが非垞に䜎いずいうお客様からの苊情が倚く寄せられた埌、䜕が起こっおいるのかを把握し始めたした。 クラむアントはPARISCバむナリを䜿甚しおHP-UX / Itaniumで実行するこずが刀明したした。 各クラむアントに゚ミュレヌションの耇雑さを説明できなかったため、次のバヌゞョンのJVMにチェックを远加しただけで、プログラム゚ミュレヌションモヌドでのPARISCのコヌド実行が犁止されたした。



゚ンタヌプラむズ向けのJavaパフォヌマンス



同意したす。アプリケヌションが実皌働に入り、ブレヌキずフリヌズに関するクラむアントからの䞍快なコメントが返された䞍快な瞬間です。 Javaパフォヌマンスの問題は、䞻に゚ンタヌプラむズ゜リュヌションにずっお重芁です。 そのため、筋金入りの実甚的なアドバむスを埗るために、NetCrackerテレコム゜リュヌション䌁業のパフォヌマンスアヌキテクトVladimir Sitnikovに専門家を䟝頌したした 。



「教育環境ずプロフェッショナル環境の䞡方で朜圚的なJavaパフォヌマンスの問題に぀いお聞いたこずがありたす。 すべおのゞョヌクにはほんの䞀郚のゞョヌクがありたす。 䞀郚には、Javaの遅さは神話です。特にプラットフォヌムのパフォヌマンスは時間ずずもに倉化し、10幎前に批刀されおきたこずが今ではたったく異なる方法で機胜するためです。 「スロヌダりン-スロヌダりンではない」レベルでJavaのパフォヌマンスに぀いお話すのは無謀です。



実際には、産業甚アプリケヌションの䞻な問題は、問題を解決するために必芁なアクションよりも倚くのアクションが実行される堎合の過剰なコヌドの存圚に関連しおいたす。 どこかで、開発者はあたりにも賢明でしたが、どこかでビゞネス芁件が非垞に混乱しおいるので、最初はすぐに曞くこずができたせん。 鉄の性胜で十分な堎合もあれば、予想よりも解決が遅い堎合もありたす。 ここでの䞻な掚奚事項は1぀です。䞍芁なコヌドたたは少なくずもその䞀郚を実行しないでください。



パフォヌマンスが䜎䞋するもう1぀の理由は、アルゎリズムにありたす。 たずえば、アルゎリズムの基準でレコヌドを芋぀けるのではなく、培底的な怜玢を䜿甚する堎合。 しかし実際には、パフォヌマンスを向䞊させるために独創的なHashMapよりもスマヌトなデヌタ構造が䜿甚されるこずはほずんどありたせん。



ラむブラリやフレヌムワヌクなどのパフォヌマンスおよびサヌドパヌティの開発ツヌルに圱響を䞎える可胜性がありたす。 実際には、問題はすべおのレベルにある可胜性がありたす-そしお、それらは起こりたす。 開発者は通垞、テストでそれらを識別し、分析はさたざたなプロファむリング手法ブラりザヌレベル、アプリケヌションサヌバヌ、デヌタベヌスを䜿甚しお実行されたす。 サヌドパヌティのコヌドで問題が発生するこずがよくあり、それらをキャッチする唯䞀の方法は、枬定を行い、この非垞にサヌドパヌティのコヌドの開発を泚意深く監芖するこずです。 私の緎習では、毎月が発芋です。 1行のコヌドを眮き換えるず、デヌタベヌスぞのデヌタの挿入が10倍速くなりたす。



䞀般に、Javaパフォヌマンスの枬定ず操䜜の䞻なこずは、負荷テストを忘れないこずです。 したがっお、゚ンタヌプラむズ開発のためのビゞネス芁件がどれほど倧きくお厳しいのか、それをテストし、パフォヌマンスに関連する䞍快な瞬間に気付くのに圹立぀巚倧なテスト。 たずえば、䌁業環境の負荷が均等でないこずを考慮する必芁がありたす朝に党員が入っお、システムに入り、ワヌクロヌドのピヌクに達し、その埌䜎䞋し、午埌に負荷が最小になり、昌食埌にナヌザヌが新しい力で負荷を高い倀に増やしたす。 もちろん、最初の分析では、そのようなニュアンスは芋萜ずされる可胜性がありたす。 実際、パフォヌマンスの問題を回避するために、倧量のロヌドが予想される堎所ずコヌドの蚘述方法に倧きく圱響したす。



最も䞀般的な間違いや熊手に぀いお私に尋ねおいたす。 それぞれに独自のものがありたす。 たずえば、特定のプロセッサたたはメモリモデルを遞択しおもほずんど倉曎されたせん。 もちろん、2006幎ず2016幎のサンプルを比范する堎合、モデルは重芁です。 倚くの質問はスケヌラビリティの面にありたす。 倚くの䌁業が䌁業開発の聖杯を求めおいたす。誰もが必芁なサヌバヌの数ずアプリケヌションを展開するためのパワヌを予枬するために単䞀の枬定を行いたいず考えおいたす。 ここでの唯䞀の方法は、皌働䞭のサヌバヌでテストし、フォヌルトトレランスのためにリ゜ヌスの予玄を考慮するこずです。



䞀般的に、おそらく、普遍的な最適化ツヌルがありたす-テストの必然性。 ストレステストず結果の分析のスペシャリストがいたすが、䞻な効果は、開発者がコヌドの速床に責任を持぀ずきに達成されたす。 パフォヌマンスは、あなたが実際に取っお远加できるものではありたせん。 問題が発生する堎所を予枬するこずは困難です。゜ヌスコヌドのすべおの行を疑う十分な時間はありたせん。 䞀般的な問題は、テストが誀っお、間違った量のデヌタ、たたは間違った負荷ず構成で実行されたこずです。 たずえば、テスト䞭にラむブラリが曎新されず、顧客が遞択しお曎新した-問題がないこずを考慮しおください。



私の蚘憶には、パフォヌマンスの問題を回避しようずしたプロゞェクトがありたしたが、これらは小芏暡なデモプロゞェクトであるか、アプリケヌションの動䜜が遅いずいう顧客からの苊情ですぐに戻っおきたした。



倚くの堎合、パフォヌマンスの䜎䞋やアプリケヌション党䜓の䜎䞋は、1぀のグロヌバル゚ラヌだけでなく、2぀たたは3぀の問題の組み合わせが原因であり、それぞれが䞀芋するず脅嚁ではありたせん。 そしお最悪のこずは、開発者が自分のコヌドで生じた問題を知らない可胜性があるこずです。 技術サポヌト゚ンゞニアが問題を解決できる堎合、圌らはそれを「報いる」ためにコヌドの䜜者を探すこずはめったにありたせん。



苊情ずいえば。 クラむアントがinしおいる堎合、問題を探す堎所を芋぀けるための簡単なアルゎリズムがありたす。 顧客の代衚者ず、その方法を尋ねる必芁がありたす。 すべおがゆっくりず機胜し、問題が䞻芳的な感芚であるように思われる堎合は、それが機胜する時間を指定したす。 もちろん、このような芁件は、事前に開発䞭、たたは開始する前に収集するこずをお勧めしたす。 芁件をコンポヌネントに分解したす。たずえば、ナヌザヌが5秒以内にペヌゞを開くようにしたい堎合、予算をブラりザヌに割り圓おたす1秒、サヌバヌ偎に3.5秒、ネットワヌクに0.5秒など。 倚くの堎合、内蚳はシステム自䜓のコンポヌネントにたで及んでおり、ちなみにランタむムはログに蚘録され、開発者はプロファむラヌを開くこずで、コヌドが受け入れ可胜なフレヌムワヌクに適合するかどうかを確認できたす。



だから問題がありたす。 どこを芋お、どこから足が䌞びおいるのか





次に、実際の条件に近い、クラむアントに近いパフォヌマンスの問題を芋おみたしょう。 倚くの堎合、アプリケヌションは実皌働環境で非垞に予期しない動䜜をしたすが、テストではすべおが完璧でした。 これには説明がありたす。 状況がクラむアントのみによっお再珟される堎合、これは゜ヌスデヌタの問題を瀺しおいる可胜性がありたす。 たずえば、アプリケヌションは1'000'000クラむアントで操䜜を完了する必芁があるこずがわかっおいたす。 私たちは1'000'000のランダムな名前ず姓を生成し、テストは成功し、フルネヌムでクラむアントを怜玢したす。 私たちは本番に残したす-ナヌザヌはinしたす。 問題のある怜玢をより詳现に調べたす-数千のIvanov Ivanov Ivanovichがいるこずがわかりたした。 ストレステストでそれほど倚くの繰り返しが考慮されない堎合、芋぀かった行がテストですぐに衚瀺され、操䜜䞭に怜玢が1回おきに動䜜するのも䞍思議ではありたせん。



テスト甚の正しいデヌタセットを生成するこずは科孊です。 意味のある、たずえば100 GBのデヌタを䜜成するだけでなく、デヌタ間の盞互䜜甚も考慮する必芁がありたす。これは、皌働䞭のものずできるだけ類䌌しおいる必芁がありたす。





゚ンタヌプラむズ向けのJavaパフォヌマンスに぀いお他に蚀えるこずはありたすか 顧客の機胜以倖の芁件を収集したす。䜜業シナリオの内蚳、特定のアプリケヌションモゞュヌルずのナヌザヌむンタラクションの頻床、ナヌザヌ数、予想時間。 埌の段階でパフォヌマンスの問題を修正するのは非垞に費甚がかかる可胜性があり、コヌルセンタヌのオペレヌタヌが埅機しおいる間に䜙分な時間がかかるず、深刻な損倱に぀ながりたす。






専門家のコメントに぀いおご質問がある堎合、たたはJavaパフォヌマンスの問題に぀いおのご意芋をお望みの堎合は 、4月22〜23日に開催されるJPoint 2016カンファレンスにコメントしおください 。 私たちは皆そこにいたす



All Articles