サヌバヌで䜕が起こっおいるかを理解する方法





アレクサンダヌ・クリザノフスキヌ krizhanovsky 、 NatSys Lab。 



この写真は長い間Web䞊で実行されおきたした。少なくずもFacebookでよく芋かけたした。







Googleで入力したずころ、それを䜜成した人がLinuxのパフォヌマンスの最適化に取り組んでいるこずがわかりたした。圌には玠晎らしいブログがありたす。 この画像が存圚するプレれンテヌションだけでなく、玄3぀のプレれンテヌションがあり、他のドキュメントもありたす。 このブログに行くこずをお勧めしたす。この写真にリストされおいるすべおのナヌティリティに぀いおよく説明しおいたす。 再話したくなかったので、プレれンテヌションぞのリンク-http://www.brendangregg.com/linuxperf.htmlを提䟛したす 。



䞀方、圌はプレれンテヌションに非垞に圧瞮されたストリヌムを持ち、これらの各ナヌティリティに぀いお1時間のプレれンテヌションがありたす-実際には、man'eで芋぀けるこずができるのず同じこず、たたは単にそれぞれの名前を入力するだけですGoogleでこれらのナヌティリティの。 ボトルネックを芋぀けお、䜕が起こっおいるのかを理解する方法に぀いお、いく぀か䟋を挙げたいず思いたした。



Greggは、ボトルネックの芋぀け方の議論から始たる方法論、5぀の「なぜ」質問などを提䟛したす。 方法論を䜿甚したこずはありたせん。ただ芋お、䜕かをしお、䜕ができるかを芋せたいです。







残念ながら、プレれンテヌションを準備しおいたずき、゜フトりェア、ベンチマヌク、぀たり スクリプト党䜓を繰り返すこずができたせんでした。 持っおいたログ、チャット、ラップトップ、仮想マシンでいく぀かのスクリプトを再珟しようずしたので、いく぀かの数字が疑わしい堎合は、本圓に疑わしいので、少し芋おみたしょう。指。 数字の順序ずその芋方、認識方法は、私たちにずっおより重芁です。



最初の䞻な䟋は、カスタムアプリケヌションがあり、nginxモゞュヌル、非垞に重いモゞュヌルがありたしたが、アプリケヌションロゞックは考慮したせん。 人々は倚くの接続を望んでいたずいう問題がありたしたが、倚くの接続がうたくいかず、すべおがそこで止たりたした。 入力トラフィックは1秒あたり玄250 MBで、このようなかなり控えめなトラフィックでは倚くの䞊列接続が行われたした。 リ゜ヌスを完党に消費したしたが、䜕も起こりたせんでした。 新しい接続、新しい芁求は単に砎棄されたした。



芋たした。 最初に行うこずは、netstatを確認し、grepを実行し、別のgrepを実行するこずです。 netstatには2䞇を超える接続があり、これらのストリヌムがそこにありたす。 パフォヌマンスの問題が発生するず、システムが非垞に悪く感じるこずは明らかです。 そしお、netstatを実行するず、grepで非垞に長時間ハングするため、可胜であれば、procを䜿甚するこずをお勧めしたす。実際には垞に存圚し、パむプでは機胜しないがすぐに読み取るawkスクリプトを蚘述したす。 procの文字列がそれを解析し、カりントした結果を提䟛したす。 䜜業が少し速くなり、快適になりたす。



䜕が起こっおいるのかを理解するために2番目に行うこずは、単に着信パケットをカりントするこずです。 ここでは耇雑なものは䜿甚したせんでした。パケットカりンタヌ、バむトカりンタヌを䜿甚したす。 実際、これらの数倀はどのように取埗されたすか倉動を平準化するために10秒間スリヌプし、䞀方から他方を枛算しお10で陀算したす。







次に、Top normalを実行したす。 Topにはある皮の写真がありたす。䞀般に、犯眪者はいたせん。 nginxはプロセッサの100を消費したせん。平均も基本的に正垞です。 システム時間が33で、゜フトりェア割り蟌みsi-゜フトりェア割り蟌み-52であるこずが疑われたす。 ぀たり 実際、nginxはほずんど圹に立ちたせんが、OSカヌネルには倚くのこずができたす。 たた、2぀のksoftirqdスレッドがあるこずもわかりたす。これを仮想マシン内で再珟したしたが、コアは2぀しかありたせんでした。 2぀のネットワヌクハンドラスレッドがトップになりたした。







䞊郚に䟿利なボタンがありたす-「1」を抌す必芁がありたす。 プロセッサヌの芁玄統蚈は衚瀺されたせんが、プロセッサヌごずに個別に衚瀺されたす。 ここでは、䞀般的に、プロセッサが均等に動䜜する、良い画像を芋るこずができたす。 1぀のプロセッサが100ねじを倖され、他のプロセッサが暪たわっおいる堎合、明らかに負荷分散に問題がありたす。 パケットが䞻に1぀のコア、1぀の割り蟌みに送られる堎合、残りには残りがありたす。 ここで私たちは良い分垃がありたした。







私はそれを䜿うのが倧奜きです。 これは良くありたせん、それは蟲民の方法ですが、䞀般的にGDBは非垞に匷力なむンタヌフェヌスを提䟛したす。 ルヌプ内のすべおのnginxプロセスでGDBのスクリプトを蚭定し、それらで䜕が行われるかを確認できたす。 ここでは、スタックの䞀番䞊、぀たり最初ず2番目の関数を芋おいきたすが、原則ずしお、より興味深いこずを行うこずができたす。バックトレヌスを収集できるだけでなく、倉数を出力するこずもできたす。 これは、サヌバヌの内郚をリアルタむムで確認し、サヌバヌで䜕が行われおいるか、そのステヌタスを確認できるほど匷力なメカニズムですが、あたり停止しないでください。 このスクリプトは、実際にはスロヌダりンし、nginxが悪化しおいるこずは明らかですが、䞀般的には動䜜し、リアルタむムで実行できたす。



このスクリプトを数回実行するず、䞀般に、耇数のプロセス、耇数のスレッドだけでも、ほずんどの堎合、䞀郚のスレッドが1぀たたは2぀の機胜に時間を費やしおいるこずがわかりたす。これが単なるボトルネックです。 関心のあるスレッドたたはプロセスが1぀しかない堎合は、それを数回実行するだけで、これが非垞に単玔なサンプリングであるこずを理解できたす。



この堎合、私たちはここで単に゚ポヌルを芋るずはただ蚀っおいたせん。 Epollはあたりおもしろくはありたせん。ナヌザヌ空間のコヌドを芋れば、もっずおもしろいです。 開始した堎合、ナヌザヌスペヌスコヌドがあり、凊理した正芏衚珟があり、ボトルネックがありたした。



次は、問題がnginxではなくシステムの問題であるこずがわかったため、システムに進みたす。 OSがどのように感じるかを確認したす。 ぀たり 珟時点では、すでに怜玢領域を分割し、分割しおおり、OSで既に怜玢しおいたす。







䟿利なperf topナヌティリティがありたす。これはカヌネルトレヌサヌであり、システム内のすべおのプロセス、特定のプロセッサ、特定のプロセス、そのcall_traceを衚瀺できたす。 ここでは、ほずんどの時間がnf_conntrackで費やされおいるこずがわかりたす。 䞀般的に、それはあたり明確ではありたせん。 最埌の2行がnginxであるこずがわかりたす。 nginxはもはやボトルネックではないこずがわかっおいるため、アプリケヌションコヌドには䜕らかの皮類があるこずを理解しおいたす。 私たちが探しおいるのは、OSの内郚を探しおいるこずです。最初の3぀の呌び出しに興味がありたす。



最初の nf_ct_tuple_equalが䜕であるかを芋぀けるには、カヌネル゜ヌスを手元に眮いおおくず䟿利です。 私は誰もがそれを理解する必芁があるずいう事実に぀いおは話しおいたせんが、カヌネル内でgrepを実行するだけです-私がしたこず-あなたは非垞に簡単に理解するこずができたす。たたは、perfに衚瀺される呌び出しをGoogleに入力するこずができたす。 最初はわかりにくいかもしれたせんが、どのようなサブシステムであるかをすぐに芋぀けるこずができたす。 このシステムコヌルが䜕をするのか、このカヌネル関数を正確に知る必芁はありたせん。カヌネルの速床が䜎䞋するサブシステムの皮類を理解するだけです。



grepを実行するだけです。 ディレクトリ内で䞀般的な再垰grepを䜜成し、Kconfigが存圚する堎所を芋぀け、そこに人間の説明がありたす-カヌネル構成で埗られるもの、このサブシステムが行うこず。 次にGoogleにアクセスし、conntrackずは䜕かを芋お、conntrackがシステムの速床を䜎䞋させおいる倚くのメッセヌゞを確認したす。これらは、特にhtpサヌバヌの堎合、着信トラフィックには意味がありたせん。



すべおがすべおのデヌタ、すべおのデヌタが䞀臎するこずを確認するために、conntrackが攟牧しおいる接続の数を出力したす。そこには、確立された接続の数ずほが同じ数が衚瀺されたす。 LinuxのConnectrackは、接続を監芖するファむアりォヌルサブシステムです。 FTPの鮮明な䟋では、接続が1぀ある堎合にポヌトが䞎えられ、ファむアりォヌルは最初ず2番目の䞡方の接続を取埗しお接続する必芁がありたす。 そしお、このサブシステムには、すべおの接続ず䞀臎し始めるかなり遅い機胜があり、アむドル状態で動䜜するだけで、䜕もしないため、オフにするこずができたす。



最初のボトルネックを芋぀けたした。次を芋おみたしょう。







Intel_idle 正盎なずころ、Intelカヌドからだず思ったのは初めおです。 繰り返したすが、カヌネル内でgrepを実行したす。 Kconfigでは、垞にオンになっおいるため、すでに䜕もありたせんが、Intel開発者は゜ヌス内で適切なコメントを䜜成するように泚意しおおり、プロセッサが無駄になる時間はスレッド内で費やしおいたす。 このスレッドは優れおいたす。぀たり、プロセッサがしばらくアむドル状態であり、私たちはそれで䜕もしおいたせん。







次のポむント。 再床grepを実行し、。/ block / cfq-ioスケゞュヌラヌがあるこずを確認し、I / Oスケゞュヌラヌを凊理しおいるこずを理解しおいたす。 だから、おそらく、nginxは䜕かを入力/出力しおいたす。 同時に、ブロックIO-これは、ネットワヌク郚分ではなくファむルシステムがあるこずを意味したす。 ネットワヌク郚分はネットにありたす。



これが発生した堎合、I / O統蚈を確認したいので、iostatがこれを支揎したす。 倧量の蚘録があり、ディスクが䜕らかの圢で15〜20䜿甚されおいるこずがわかりたす。 それほど倚くはありたせんが、時間が無駄になりたす。



さらに、perf topを芋るず、実際にOSがI / Oで行っおいるこずがわかりたした。 これは、nginxがこれを行うこずを意味するものではなく、䜕かを出力するkswapdである可胜性があり、cronに䞊がっお䜕らかのデヌタベヌス曎新を開始するUpdatedbデヌモンである可胜性がありたす。曎新など 良い意味で、システムのI / Oに負荷がかかっおいるこずがわかった堎合、誰がこれを行っおいるかを芋るのはただ良いこずです。







そしお、iotopがありたす-通垞のtop'aの類䌌物ですが、入出力甚です。 このような入出力を生成するナヌザヌを瀺しおいたす。 nginxが衚瀺されたす。







次に行うこずは、nginxがI / Oで行うこずを確認するこずです。 OSずアプリケヌションプロセスの間のむンタヌフェむスにあるstraceアプリケヌションナヌティリティがありたす。 すべおのシステムコヌルにフックを出力したす。 曞き蟌みず曞き蟌みを蚭定する必芁があるず考えたした。 わざず䜕もしおいたせんでした。 実際、倚くのシステムコヌルはありたせん。 ここでそれは正しかった-「-e write、write w」ず、おそらくそれだけです。 ぀たり ファむルI / Oの速床が䜎䞋しおいるこずがわかっおいる堎合は、かなり少ない数のシステムコヌルに関心がありたす。



2番目のオプション。 ここで私は幞運になった、私は明確な結論を持っおいる。 本圓にたくさんのwrite'ovがありたした。 実際には、非垞に悪い状況に陥る可胜性がありたす。システムコヌルのごくわずかなものを芋ただけで、゚ポヌルが発生し、゜ケットから䜕らかの読み取りが行われ、曞き蟌みが発生するこずがあり、䞀般に、それが䜕であるかを理解するのは困難です。



straceを実行するこずもできたす。 straceをファむルに入れおから、システムコヌルの統蚈を䜜成するスクリプトでこのファむルを凊理したす。 Topにあるシステムコヌルを理解しおいるため、システムコヌルのTopでレコヌドのシステムコヌルを探しおいたす。これは曞き蟌みになりたす。 曞き蟌みによっお、曞き蟌みの最初の匕数ずしおファむル蚘述子8があるこずがわかりたす。



lsofを䜿甚するのは正しいこずですが、䜿甚方法はただ孊習しおいたせん。docfsを䜿甚しおいたす。 fdディレクトリに移動し、8番目の蚘述子の内容を確認したす。 このaccess.logは驚くこずではありたせん。







最埌のシナリオは、トップが沈黙しおいる堎合、良い数倀を瀺しおいる堎合、䞀般的にはシステム内のすべおが正垞であるが、それが良くないこずを知っおいたす。



そのような䟋。 私はちょうどベンチマヌクを取りたした-これは、ミュヌテックスで同期キュヌをロヌドするベンチマヌクであり、Topの蚀うこずを芋たした。 Topによるず、アむドル状態は非垞に倧きく、CPUごずの統蚈情報を衚瀺しない堎合、プロセッサ䜿甚率は玄130になりたすが、400になるはずです。 統蚈はすべお良奜であるこずがわかりたすが、そのむデオロギヌにより、ベンチマヌクはすべおのリ゜ヌスを完党に利甚すべきであり、そうではありたせん。



䜕が起こるか芋おみたしょう。







ここで再びstraceを実行したすが、既に-pず-cを䜿甚しお呌び出しおいたす。 -sを䜿甚するず、システムコヌルに関する統蚈を収集できたす。



なぜnginxに察しおこれを行わなかったのか、䜕らかのスクリプトを䜿甚しおstraceからの出力を解析する必芁があるず蚀ったのはなぜですか 事実、straceは実行するプログラムの最埌にこれらの統蚈を生成し、トレヌスしたす。nginxを実行しおいお、それを䞭断したくない堎合は、これらの統蚈を取埗しないため、統蚈を自分で収集する必芁がありたす。



ここで、straceは、トレヌス、よく呌び出すシステムコヌル、これらのシステムコヌル内の時間を瀺しおおり、futexがあるこずがわかりたす。 man futexず入力するず、これがナヌザヌ空間の同期に䜿甚されるOCメカニズムであり、これらがmutexであるこずがわかりたす。 そしお、pathReadロック、条件倉数はこの単䞀のfutex呌び出しのみを䜿甚したす-これは、pathRead同期に問題があるこずを意味したす。



䞀般的に、I / Oが良奜で、プロセッサは良奜で、すべおが正垞で、メモリは良奜であるような画像が衚瀺されおも、RPSの数に達しおいないため、原則ずしおロック競合、この数字はわずか130です-ランダムではありたせん。 ぀たり ロックの競合䞭に、1぀のロックを求めお4぀のプロセッサを䜿甚しおいる堎合、䞀床に1぀のプロセッサしか䜿甚できたせん。 ぀たり、実際には、4぀のプロセッサのいずれかを取埗したす。 そしお、プランナヌの远加費甚ず100を少し超えるものを犠牲にしおのみ、30を远加したすが、これは競合の性質です。



連絡先



» Ak@natsys-lab.com

「Abrander onHabré クリザノフスキヌ

» NatSys Labブログ



このレポヌトは、負荷の高いシステムHighLoad ++ Juniorの開発者のトレヌニング䌚議で行われた最高のプレれンテヌションの1぀です。



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



さお、䞻なニュヌスは、 HighLoad ++ Juniorを含む8぀の䌚議を含む春祭り「 Russian Internet Technologies 」の準備を開始したこずです。 アレクサンドラは間違いなく再びスピヌカヌを呌び出したす



All Articles