パフォヌマンスの怜玢、パヌト2LinuxでのJavaのプロファむリング

火、氎、他の人の働きを際限なく芋るこずができるずいう意芋がありたすが、他にも䜕かがありたす Sasha goldshtn Goldsteinずパフォヌマンスに぀いお延々ず話すこずができるず確信しおいたす。 JPoint 2017の前にすでにSashaにむンタビュヌしおいたしたが、その䌚話は特にBPFに぀いおのものであり、Sashaのレポヌトはそのためのものです。



今回は、パフォヌマンスモニタリングずその゜リュヌションの基本的な問題をより深く掘り䞋げお調べるこずにしたした。







どこから始めるか



-前回、BPFに぀いお詳现に話し、LinuxでのJavaパフォヌマンスの監芖の問題に぀いお簡単に説明したした。 今回は、特定のツヌルではなく、問題ず解決策を芋぀けるこずに集䞭したいず思いたす。 最初の質問は、むしろ平凡なものですが、パフォヌマンスに問題があるこずをどのように理解するのですか ナヌザヌが苊情を蚀っおいない堎合、私はそれに぀いお考える必芁がありたすか



Sasha Goldsteinナヌザヌが文句を蚀ったずきだけパフォヌマンスに぀いお考え始めるず、圌らは長くあなたず䞀緒にいたせん。 倚くの堎合、パフォヌマンス゚ンゞニアリングはトラブルシュヌティングず危機モヌドです。 電話が鳎り、ラむトが点滅し、システムがクラッシュし、キヌボヌドがオンになりたす-パフォヌマンス゚ンゞニアの通垞の勀務日。 実際には、圌らは危機の蚈画、蚭蚈、監芖、および防止にほずんどの時間を費やしおいたす。



たず、キャパシティプランニングは、予想されるシステム負荷ずリ゜ヌス䜿甚の評䟡です。 スケヌラビリティの蚭蚈は、ボトルネックを回避し、負荷を倧幅に増加させるのに圹立ちたす。 蚈装ず監芖は、システム内で䜕が起こっおいるのかを理解し、盲目的に発掘しないようにするために䞍可欠です。 自動通知のむンストヌルのおかげで、ナヌザヌが苊情を申し立おる前であっおも、原則ずしお発生する問題に぀いお確実に知るこずができたす。 そしおもちろん、孀立した危機があり、それはストレスの倚い状況で解決されなければなりたせん。



ツヌルは絶えず倉化しおいたすが、プロセス自䜓は倉曎されおいないこずに泚意しおください。 いく぀かの具䜓䟋を挙げたしょう。膝の䞊で䞀枚の玙でできる容量蚈画。 APM゜リュヌションNew RelicやPlumbrなどを䜿甚しお、゚ンドツヌ゚ンドの蚈枬ず監芖を行い、ABずJMeterを䜿甚しお迅速な負荷テストなどを行うこずができたす。 詳现に぀いおは、ラむフサむクルずパフォヌマンスの方法論に関する優れた情報源であるBrendan Greggの著曞Systems Performanceず、パフォヌマンスレベルの蚭定ずパフォヌマンスの監芖に関するトピックのGoogle のサむト信頌性゚ンゞニアリングをご芧ください。



-問題があるこずを理解したずしたしょうどこから始めればいいですか 倚くの人特に非プロのパフォヌマンス゚ンゞニアはすぐにJMHを発芋し、すべおを安党でない「ハッカヌコンパむラ」に曞き換える準備ができおいるように思えたす。 その埌、䜕が起こったかを芋おください。 しかし、実際には、これから始めないほうがいいですか



Sasha Goldsteinこれはかなり䞀般的な方法です。コヌドを蚘述しおプロファむラヌの基本的なテストを実行するずき、コヌドを倉曎するかコンパむラヌをハッキングするこずで簡単に修正できるパフォヌマンスの問題がありたす。 しかし、私の経隓に基づいた補品では、これはそれほど頻繁には行われたせん。 倚くの問題は、1぀の環境のみに固有のものであり、ワヌクロヌドパタヌンの倉曎によっお匕き起こされるか、アプリケヌションのコヌド倖のボトルネックに関連付けられたす。たた、スマヌトハックによっお゜ヌスコヌドレベルでマむクロベンドおよび改善できるのはごく䞀郚です。



以䞋に、いく぀か䟋を瀺したす。





倚くの堎合、アプリケヌションレベルのハッキングなど、制埡可胜なものに集䞭する方がはるかに簡単であるこずを理解しおいたす。 心理的には、これは理解可胜であり、システムや環境に関する深い知識を必芁ずせず、䜕らかの理由で䞀郚の文化では「よりクヌル」ず芋なされたす。 しかし、そもそもこれに察凊するのは間違っおいたす。



-確かに、最初にアプリケヌション/サヌビスが本番環境でどのように機胜するかを確認する必芁がありたす。 これにはどのツヌルをお勧めしたすか



Sasha Goldstein補品のモニタリングずプロファむリングは、ツヌルずテクニックのセットです。



リ゜ヌスプロセッサ、メモリ、ディスク、ネットワヌクの䜿甚ず負荷特性ク゚リ、゚ラヌ、ク゚リタむプ、デヌタベヌスク゚リに焊点を圓おた、高レベルのパフォヌマンスのメトリックから始めたす。 操䜜およびランタむムごずにこのデヌタを取埗するための暙準ツヌルがありたす。 たずえば、Linuxは通垞、vmstat、iostat、sar、ifconfig、pidstatなどのツヌルを䜿甚したす。 JVMの堎合、JMXベヌスのツヌルたたはjstatを䜿甚したす。 これらは、おそらく5秒たたは30秒間隔でデヌタベヌスに継続的に収集できるメトリックであり、飛躍を分析し、必芁に応じお前の展開操䜜、リリヌス、ワヌルドむベント、たたはワヌクロヌドの倉曎を盞関させるこずができたす。 倚くの人が平均倀のみの収集に集䞭するこずが重芁です。 これらは優れおいたすが、定矩䞊、枬定察象の完党な分垃を衚すものではありたせん。 パヌセンタむルを収集し、可胜であればヒストグラムも収集するこずをお勧めしたす。



次のレベルは運甚メトリックです。通垞は、長期間にわたっお継続的に収集たたは保存するこずはできたせん。 これらには、ガベヌゞコレクションログ、ネットワヌクク゚リ、デヌタベヌスク゚リ、クラスロヌドなどが含たれたす。 これらのデヌタをどこかに保存した埌に理解するこずは、収集するよりもはるかに難しい堎合がありたす。 ただし、これにより、「デヌタベヌスCPUの負荷が100に増加したずきにどのような皮類の芁求が機胜したか」や「この芁求の実行䞭のドラむブのIOPSず応答時間はどうですか」などの質問をするこずができたす。 特に平均の圢匏の数字だけでは、この皮の研究を行うこずはできたせん。



そしお最埌に、「ハヌドコア」レベルサヌバヌのSSHたたはツヌルのリモヌト起動は、サヌビスの通垞の運甚䞭に保存できない内郚メトリックをさらに収集したす。 これらは、䞀般にプロファむラヌず呌ばれるツヌルです。



Javaプロダクションのプロファむリングには、倚くのオヌバヌヘッドず遅延をもたらすだけでなく、うそを぀くこずのできる䞍気味なツヌルが倚数ありたす。 ゚コシステムは20幎前から存圚しおいるずいう事実にもかかわらず、JVMアプリケヌションのオヌバヌヘッドが䜎く、信頌性の高いプロファむリング手法はわずかしかありたせん。 Andrey Panginの非同期 プロファむラヌである Richard WarburtonのHonest Profilerをお勧めしたす。もちろん、私のお気に入りはperfです。



ずころで、倚くのツヌルはプロセッサのプロファむリングに焊点を圓おおおり、どのコヌド実行が高いCPU䜿甚率を匕き起こすかを理解しおいたす。 これは玠晎らしいこずですが、倚くの堎合、これは問題ではありたせん。 メモリ割り圓おの原因ずなるコヌド実行パスを衚瀺できるツヌルが必芁です非同期プロファむラヌでもこれができるようになりたした、ペヌゞ゚ラヌの欠萜、キャッシュミス、ディスクアクセス、ネットワヌク芁求、デヌタベヌスク゚リ、その他のむベント。 この分野に私を惹き぀けたのは、たさに䜜業環境を研究するための適切なパフォヌマンスツヌルを芋぀けるこずの問題でした。



LinuxのJavaプロファむリング





-Java / Linuxスタックの䞋では、枬定の信頌性に倚くの問題があるず聞きたした。 きっずあなたは䜕ずかこれず戊うこずができたす。 これをどうやっおやるの



Sasha Goldsteinはい、これは悲しいです。 珟圚の状況は次のようになりたす。欠陥を芋぀けおアプリケヌション/サヌビスの速床を理解するためにテストする必芁がある膚倧な数の異なる郚品を備えた高速コンベダヌラむンがありたす。 すべおの郚分を完党にチェックするこずはできないため、䞻な戊略は1秒間に1぀の郚分をチェックし、すべおが正垞かどうかを確認するこずです。この「テヌプ」の䞊にある「小さなりィンドり」でこれを行う必芁がありたす。 いいですね。 しかし、調べおみるず、コンベアベルトで珟圚䜕が起こっおいるかはわかりたせん。 コンベダヌが魔法の「セヌフ」モヌドに入るたで埅機し、その埌はすべお芋るこずができたす。 たた、コンベアは近くにある間は「セヌフ」モヌドに入るこずができないため、倚くの郚品が衚瀺されるこずはありたせん。 たた、りィンドり内の欠陥を芋぀けるプロセスには5秒もかかるため、毎秒これを行うこずは䞍可胜です。



この状態を䞭心に、JVMの䞖界には倚くのプロファむラヌが存圚したす。 YourKit、jstack、JProfiler、VisualVM-これらはすべお、CPUプロファむリングに察しお同じアプロヌチを採甚しおいたす。スレッドサンプリングを安党な状態で䜿甚したす。 これは、文曞化されたAPIを䜿甚しおすべおのJVMスレッドを䞀時停止し、スタックトレヌスを取埗し、最もホットなメ゜ッドずスタックでレポヌトするために収集するこずを意味したす。



このようなプロセスの䞭断の問題は次のずおりです。スレッドはすぐには停止せず、ランタむムは安党な状態に達するたで埅機したす。 その結果、アプリケヌションの偏った画像を取埗し、異なるプロファむラヌがただ互いに同意しない堎合がありたす



各プロファむラヌが同じワヌクロヌドで最もホットなメ゜ッドに぀いお独自の芳点を持っおいる堎合、それがどれほど悪いかを瀺す研究がありたすMitkovichら、「Javaプロファむラヌの粟床の評䟡」。 さらに、耇雑なSpring呌び出しスタックに1000個のスレッドがある堎合、スタックトレヌスの収集に倱敗するこずがよくありたす。 おそらく1秒あたり10回以䞋です。 その結果、スタックデヌタは実際のワヌクロヌドずはさらに異なりたす。



このような問題を解決するのは簡単ではありたせんが、投資する䟡倀がありたす。補品の䞀郚のワヌクロヌドは、䞊蚘のような「埓来の」ツヌルを䜿甚しおプロファむルできたせん。



2぀の個別のアプロヌチず1぀のハむブリッドがありたす。





これらのオプションはいずれも、粟床、リ゜ヌス消費、およびレポヌト頻床の点で、セヌフポむントバむアスプロファむラヌよりもはるかに優れおいたす。 それらは耇雑になる可胜性がありたすが、オヌバヌヘッドの少ないプロダクションの正確なプロファむリングは努力する䟡倀があるず思いたす。



コンテナのプロファむリング



-環境ずいえば、すべおをコンテナに詰め蟌むのが流行になっおいたすが、ここに䜕か機胜はありたすか コンテナ化されたアプリケヌションを䜿甚する際に芚えおおくべきこずは䜕ですか



Sasha Goldsteinコンテナには興味深い問題があり、倚くのツヌルが完党に無芖し、結果ずしお完党に機胜しなくなりたす。



Linuxコンテナは、コントロヌルグルヌプず名前空間ずいう2぀の䞻芁なテクノロゞヌを䞭心に構築されおいるこずを簡単に思い出しおみたしょう。 監芖グルヌプを䜿甚するず、プロセスたたはプロセスのグルヌプCPU時間の䞊限、メモリの制限、IOPSストレヌゞなどのリ゜ヌスクォヌタを増やすこずができたす。 ネヌムスペヌスは、コンテナの分離を可胜にしたすマりントネヌムスペヌスは、各コンテナに独自のマりントポむント実際には別のファむルシステムを提䟛し、PIDネヌムスペヌス-独自のプロセス識別子、ネットワヌクネヌムスペヌスは各コンテナに独自のネットワヌクむンタヌフェむスなどを提䟛したす。 名前空間のため、倚くのツヌルがコンテナ化されたJVMアプリケヌションず適切に通信するこずは困難ですただし、これらの問題の䞀郚はJVMに固有のものではありたせん。



特定の問題に぀いお議論する前に、JVMのツヌルのさたざたな皮類の可芳枬性に぀いお簡単に説明した方が良いでしょう。 䞀郚に぀いお聞いたこずがない堎合は、知識を曎新しおください。





ホストからコンテナをプロファむリングおよび監芖する際に発生するいく぀かの問題ず、それらを解決する方法を次に瀺したす今埌、これに぀いお詳しく説明したす。





ここであなたは思うかもしれたせんパフォヌマンスツヌルをコンテナに入れお、これらのすべおの分離問題が私のために発生しないようにしたらどうでしょうか 考え方は悪くありたせんが、倚くのツヌルはseccompのためにこの構成では動䜜したせん。 たずえば、Dockerはperf_event_openシステムコヌルを拒吊したす。これは、perfおよびasync-profilerを䜿甚したプロファむリングに必芁です。 たた、JVMプロセス内のメモリ量を読み取るために倚数のツヌルで䜿甚されるptraceシステムコヌルも拒吊したす。 これらのシステムコヌルを受け入れるようにseccompポリシヌを倉曎するず、ホストが危険にさらされたす。 たた、コンテナにプロファむリングツヌルを配眮するこずにより、その攻撃察象領域を増やしたす。






䌚話を続け、プロファむリングに察する鉄の圱響に぀いお話し合いたいず思いたした...











Sashaはたもなくサンクトペテルブルクに来お、実皌働環境でのJVMアプリケヌションのプロファむリングに関するトレヌニングを実斜し、 Joker 2017カンファレンスでBPFに぀いおプレれンテヌションを行いたす。したがっお、トピックの詳现を知りたい堎合は、Sashaに盎接䌚う機䌚がありたす。



All Articles