PostgreSQLの蚺断方法-りラゞミヌルボロディンずむルダスクルバンガリ゚フ

2015幎のPG Dayカンファレンスで最も人気のあったレポヌトの1぀は、危機埌の拠点が病気になった堎合のりラゞミヌルボロディンずむルダスクルバンガリ゚フの話であり、それらを蚺断しおボトルネックを探す必芁がありたす。 レポヌトのすべおの䟋は、実際のYandexの実践から取られおおり、むラストず「botnek」の怜玢に関する詳现なストヌリヌが添えられおいたす。 デヌタベヌスの9.4および9.5バヌゞョンのコンテキストで問題が考慮されたずいう事実にもかかわらず、りラゞミヌルずむルダスのアドバむスの党䜓的な䟡倀ず実甚的な適甚性は倉わっおいたせん。 このレポヌトの転写を提䟛しお喜んでいたす。



むリダ・コスモデミャンスキヌによる玹介 今、私たちはあなたが本圓にオラクルを持ちたいなら生きる方法に぀いおの物語を持ちたすが、そうではありたせん。 実際、これは有甚なレポヌトです。なぜなら、珟圚抱えおいる問題の1぀は蚺断ツヌルの問題だからです。 䞀郚の堎所では、通垞の蚺断ツヌルの代わりに蚺断ツヌルを䜿甚できたせん。DBAではなくLinux開発者向けの非垞に耇雑なツヌルを䜿甚する必芁がありたす。 DBAの歯は、これらのスクリプトを芋るず傷぀き始めたす。 たた、YandexずPG Proのメンバヌは、䜿甚しおいるPostgresの蚺断方法、それらの䜿甚方法、およびこの䞖界をどのように改善するかに぀いお少し話したす。







りラゞミヌル・ボロディン みなさん、こんにちは。 私の名前はVovaで、Yandexメヌルの管理者です。 レポヌトはIldusず共同で、Postgres ProでPostgreSQLを開発しおいたす。



Postgres蚺断レポヌトずその重芁なポむントは写真です。 レポヌトの最初の郚分は、䜕をすべきか、モニタリングが倱敗した堎合に䜕をすべきかを説明しおいたす。







この堎合、どこで実行したすか 監芖の爆発-これは非垞に抜象的なこずで、デヌタベヌスに関連付けられた監芖が爆発したこずを意味したす。







Postgresは優れたデヌタベヌスであるず考えおいたす。 良いデヌタベヌス、それがすべお悪いずき、それは原則ずしお䜕かの䞊に眮かれたす。 ほずんどの堎合、これは䜕らかのシステムリ゜ヌスです。 圌女にはプロセッサヌがありたせん。 圌女にはディスクもネットワヌクもありたせん。 重いロック、回線のロック、タブレットなどに耐えるこずができたす。 しかし、ベヌスが他の䜕かにかかっおいる堎合がありたす。







同じプロダクションからのいく぀かの写真。 ここで、たずえば、プロセッサに眮かれた1぀のPostgresベヌスのhtop。 Load Average 200、倚数のセッション、およびナヌザヌ空間のプロセッサ党䜓、これが発生したす。







ベヌスはホむヌルに茉せるこずもできたす。 sgresで非垞に人気のあるもの。 䞀察のディスクでの廃棄はほが100です。 倧量のディスク読み取りを埅ちたす。







ディスクはiopsたたは垯域幅で終わるだけでなく、残念ながら所定の䜍眮で終わる可胜性がありたす。 これは、xlogセクションで終了したデヌタベヌスの写真です。







ベヌスがネットワヌク䞊にあり、xlogをレプリカ、アヌカむブ、たたは他の堎所に転送しおクラむアントぞの回答を「厚く」する状況がありたす。







メモリの堎合、すべおがより耇雑です。 原則ずしお、問題がメモリにあるこずはわかりたせん。 オペレヌティングシステムの蚭定方法に応じお、SWAPぞのクロヌルを開始し、ディスクアクティビティの問題ずしおこれを確認するか、OOMが到着しおバック゚ンドを匷制終了し、結果ずしおPostgres党䜓が刀明したす。











これらはすべお、Postgresの倖郚のツヌルによっお非垞によく蚺断されたす。 ぀たり、お気に入りのtop-likeナヌティリティ、dstat、iostatなどです。 私は䞻にLinuxに぀いお話したす。 デヌタベヌスが重いロックに眮かれおいる堎合、この情報はPGロックを介しお衚瀺できたす。たた、そこからの出力を目で簡単に解析できるようにするリク゚ストがいく぀かありたす。 しかし、それらはPostgres wikiでコンパむルされおいたす。 実際、䞊蚘の䟋はすべおを矎しく瀺しおいたす。







爆発が発生し、䜕かに遭遇したした。 圌らが䌑んだもののために、悪魔は圌を知っおいたす。 ほずんどの堎合、この図のように、䜕かが倉曎されたり、䜕かが展開されたり、ベヌスの負荷が増加したり、芁求の蚈画がなくなっお、期埅どおりに機胜しなくなったりしたす。







バヌゞョン9.4より前には、優れたpg_stat_statementsツヌルがありたした。 最も時間がかかるク゚リを怜玢できたす。 ぀たり、ベヌスが最も倚くの時間を費やすク゚リです。 さお、それはすでに暙準であり、分析を説明しお、この時間をどこで過ごすか、䜕をするかなどを確認したす。 ただし、デヌタベヌスがク゚リの実行に費やす時間は最良の指暙ではありたせん。 この時間はさたざたなリ゜ヌスに費やすこずができたす。 ディスクから読み取ったり、プロセッサを「匷制」したり、䜕かを゜ヌトしたり、䜕らかのロックを期埅したりできたす。







9.4からは、pg_stat_kcacheず呌ばれる玠晎らしいものがありたした。これにより、ナヌザヌ時間でのプロセッサ消費、システム時間でのプロセッサ消費など、リク゚ストたで確認できたす。 そしお、圌女ができる非垞にクヌルなこずは、ディスクからの物理的な読み取り倀を共有し、オペレヌティングシステムからペヌゞキャッシュデヌタを取埗するこずです。







いく぀かの䟋。 たずえば、䞊䜍のク゚リに関する情報も衚瀺するク゚リ。 繰り返したすが、時間で゜ヌトされおいたす。 しかし、システム時間、ナヌザヌ時間、ディスクからの曞き蟌み/読み取り、メモリからの取埗量などでプロセッサをどれだけ消費したかも瀺しおいたす。 これらのリク゚ストのテキストを芋るこずができたす。











リク゚スト自䜓は次のようになりたす。 このテキストはコピヌできたす。 圌はそれほど耇雑ではありたせん。 ここではすべおが簡単です。 この特定のケヌスでは、pg_stat_statements、pg_stat_kcacheからデヌタを取埗し、デヌタベヌスがこのリク゚ストに費やした時間で゜ヌトしたす。







しかし、これはpg_stat_kcacheの最倧の利点ではありたせん。 ディスクからの読み取り、ディスクぞの曞き蟌みなどで゜ヌトできたす。 たずえば、同じpg_stat_statementsはshared_hitずshared_readを共有できたす。 これは、共有バッファおよびその他すべおからの読み取りを意味したす。 それ以倖はすべお、オペレヌティングシステムのペヌゞキャッシュから取埗するこずも、ディスクから物理的に取埗するこずもできたす。 pg_stat_kcacheはそれらを分離できたす。 圌はgetrusageシステムコヌルを䜿甚しおこれを行いたす。このシステムコヌルは、各リク゚ストの埌に痙攣したす。







たずえば、読み取り倀を持぀ディスク䞊に眮かれたベヌスがあり、そのようなものを構築したした。ディスクからの物理的な読み取り倀で゜ヌトするク゚リです。 そしお、これらは盞察的な倀です。 ここでは、最䞊䜍にあるリク゚ストがあるこずは明らかです。 数パヌセントがディスクに到達し、ディスクから䜕かを読み取りたす。 それ以倖のすべおは、共有メモリたたはオペレヌティングシステムのキャッシュから提䟛されたす。 ぀たり、このデヌタベヌスのキャッシュは非垞に効果的に機胜したした。 9.4を䜿甚する堎合は、必ずpg_stat_kcacheを䜿甚しおください。







䞀般に特定の芁求によっお決定されない、より耇雑な問題がありたす。 たずえば、このような問題。 最初の矢印で、ディスクIOを増やしたす。 画像の䞭倮にあるフィヌルドの説明。 これらの2぀の列はiopsです。 iopsを1䞇から10䞇に増やしたす。 そしお、しばらくしおから、ベヌスはシステム時間でプロセッサ党䜓を殺し始めたす。 この時点で、すべおが悪くなり、䞀般的に圌女が䜕をしおいるかは明確ではありたせん。 そしお、pg_stat_statementsたたはpg_stats_kcacheを芋るず、システム時間に、システムがすべおのリク゚ストを少しでも実行するこずがわかりたす。 これは特定のク゚リの問題ではありたせん。







プロセッサが無駄にしおいるものを蚺断するための玠晎らしいパフォヌマンスナヌティリティがあり、DBAやカヌネル開発者にずっおは䟿利ではありたせんが、サンプリングによっお機胜し、戊闘プロセスを傷぀けたせん。 通垞、システムを「匷制」するこずはありたせん。 そしお、ここで、プロセッサ時間のほずんどがスピンロックに費やされおいるこずがわかりたす。 同時に、最も可胜性が高いのは、軜量ロックを取埗するこずです。 そしお、最も可胜性が高いのは、バッファキャッシュの領域です。 圌らは、PinBuffer、UnpinBuffer、ReadBufferなどを呌び出したした。 この結論のperf topを芋るず、プロセスがシステム時間のどこで費やされおいるかを理解したり、デヌタベヌス内で正確にどこで費やされおいるかを掚枬したりできたす。







同じスピンロックを芋るず悪い状況がありたすが、同時に、このスピンロックの入手元ずその凊理方法は明確ではありたせん。







ミヌム画像があるはずです。 もっず深く、そこで䜕が起こっおいるのか、䜕に基づいおいるのかを芋るこずができたす。







これにはいく぀かのツヌルがありたす。 それらの1぀は、dtraceずsystemtapLinuxの堎合です。 その利点は、文字通りすべおを芋るこずができるこずです。 しかし、このためには、いく぀かのコヌドを曞く必芁がありたす。 これが最初です。 次に、systemtapがPostgresにアクセスできるようにPostgresを再構築する必芁がありたす。 そしお最倧の問題は、systemtapがどのような条件䞋でも適甚できないこずです。 負荷テスト甚のスタンドで䜿甚できたす。 垞に安定しお動䜜するずは限らず、生産に远加される可胜性があるためです。 これは私たちず䜕床か起こりたした。 広告ずしお、「ブログ」でsystemtapを䜿甚したデバッグ状況に぀いお曞きたした。







別のツヌルは叀兞的なGDBデバッガヌであり、それを䜿甚したす。 非垞に簡単に蚀えば、プロセスに固執し、スレッドからバックトラックを削陀したす。Postgresの堎合、1぀のプロセス、1぀のスレッドです。 したがっお、バックトラックを削陀するだけです。 そしお、プロセッサから切り離したす。







結論は次のずおりです。 バッファキャッシュを操䜜する領域で軜量ロックを埅機しおいお、どこかで簡単ではなく、特定の゜ヌス行で䜜業しおいるこずがわかりたす。 591行bufmgr.cの゜ヌスコヌドに移動しお、そこで䜕が起こるかを確認できたす。 Cを知らなくおも、非垞に良いコメントがあり、どこで䜕が起こっおいるのかを理解できたす。







GDBに䞍愉快な欠陥がある唯䞀のこず。 プロセスにしがみ぀いおctrl + Cず蚀うず、 SIGTERMやSIGQUITではなくプロセスに飛びたすが、 SIGKILLは飛び、Postgresはそれを远加したす。 したがっお、非垞に愚かなバむンディングを䜜成したした。 このバむンディングに送信するすべおのシグナルをGDBに送信するわけではありたせん。 したがっお、明るいバック゚ンドにも到達したせん。



ストラップを䜿甚するず、アドホックバック゚ンドからスタックトレヌスを削陀できたす。その埌、圌らは目を凝芖し、そこで䜕が起こっおいるのかを理解したす。 プラスの点は、安定しお動䜜し、「戊闘」を傷぀けないこずです。 これが機胜するためには、䜕も再構築する必芁はありたせん。 debuginfoパッケヌゞをむンストヌルするだけですpostgresql-debuginfo、libc-debuginfo、kernel-debuginfo、そしおあなたは満足するでしょう。 重芁なのは、バック゚ンドが時間を費やしおいる正確な堎所をコヌド行に察しお正確に理解できるようにするこずです。







プレれンテヌションの2番目の郚分は、䜕らかのパフォヌマンスの問題を思い付かなかった堎合の察凊方法に専念し、自信を持っお再珟したす。 あなたは圌女をさらに治療する方法を知りたせん。 そしお、圌らはあなたがニュヌスレタヌに䜕を曞くべきかを教えお、䜕をすべきか尋ねたす。 ただし、ニュヌスレタヌに曞き蟌む前に、より倚くの蚺断を収集できたす。







いく぀かの䟋。 たずえば、そのような状況がありたした。 プロセッサ䞊にあるベヌスを撃ちたした。 ここの2番目の写真では、黄色がナヌザヌスペヌスのプロセッサであり、ほずんど䜕も食べずにすべお消費されおいるこずがわかりたす。 同時に、このようなプロファむル負荷では、ベヌスが負荷をたったく凊理しなかった最倧2分の時間間隔がありたした。 すべおが利害関係でした。 オペレヌティングシステムからのバヌストは衚瀺されたせんでした。







perftopの出力も目を匕くものではありたせん。 その時点で泚意を払った唯䞀のこずは、この障害が出力に衚瀺されるず、ginを操䜜する呌び出しが衚瀺されるこずです。 それに費やされる時間は非垞に少ないずいう事実にもかかわらず。 しかし、ここで倱敗するずすぐに、それらが衚瀺されたす。 すべおが良くなるずすぐに消えたす。 このデヌタベヌスにはゞンむンデックスが1぀ありたした。 たず、このgin-indexが䜿甚するク゚リをオフにしおオフにし、すべおが正垞であるこずを確認したした。







それから圌らは理解し始めたした。 い぀ものように、ドキュメントを読たなかったこずが刀明したした。 9.4では、ginのfastupdateが登堎したした。 ほずんどの堎合、挿入時間は短瞮されたすが、非決定的な挿入時間が発生する堎合がありたす。 私たちにずっお、時間の安定性は、盞察的に蚀えば、この時間自䜓の間隔よりも重芁です。 fastupdateをオフにしたしたが、すべおが正垞でした。 したがっお、最初の掚奚事項は、ニュヌスレタヌに曞き蟌む前にドキュメントを読むこずです。 ほずんどの堎合、そこに答えがありたす。







2番目の䟋。 繰り返しになりたすが、撮圱䞭に、非垞識な秒単䜍の回答のバヌストのスキャンを芳察したした。 たた、自動バキュヌム、チェックポむント、たたは他のシステムプロセスず時間的に盞関したせんでした。







perfoの偎面からは、このように芋えたした。 compaction_allocの最䞊郚には、異垞なものは䜕もありたせんでした。 プロセッサ消費の叀兞的な図。







GDBでは、共有メモリの問題のように芋えたしたが、やはりバッファキャッシュの領域にありたした。 重芁なのは、9.4に曎新した埌に出始めたした。 9.3ではそうではありたせんでした。 9.4で倧芏暡ペヌゞがサポヌトされ、赀い垜子ベヌスのオペレヌティングシステムではデフォルトで透明な倧芏暡ペヌゞがオンになり、うんざりしおいたため、圌らはそれを芋぀け始めたした。 実際、私たちはこの問題に最初に遭遇したこずにはほど遠い。







この問題を議論しおいるスレッドぞのリンクはこちらです。 透明な巚倧ペヌゞをオフにするず、すべおが飛び始めたした。 これは2番目の掚奚事項であり、ドキュメントの読み方が圹に立たなかった分野です。 ただし、ケヌスの95で圹立ちたす。 むンタヌネットを怜玢するのは理にかなっおいたす。おそらく、あなた以倖の誰かがこの問題に遭遇したでしょう。







3番目の䟋。 ディスクIOの増加埌しばらくしおから、デヌタベヌスがシステムですべおの時間を費やし始めたずきの同じ問題。 プロセッサ党䜓。







たた、perf出力では、スピンロックのように芋えたす。







䞀定数のbacktrace'ovを撮圱し、さらに分析しお、バッファキャッシュの操䜜に関するほがすべおのこずがわかりたした。 ゜ヌスに行く必芁さえありたせん。







この堎合の叀兞的な掚奚事項は、共有バッファを枛らすこずです。 通垞、Postgresで䜜業を開始するナヌザヌは、共有バッファヌに䜿甚可胜なすべおのRAMを切断したす。 これは通垞ひどく終わりたす。 埓来の掚奚事項は、すべおのメモリの25ですが、8 GB以䞋です。 実際に、 8 GBに枛らすず、この問題は解消されたす。 でも、なんらかの理由で、共有バッファの䞋で倚くを削枛したかったのです。



゜ヌスに行き、これらの行がどこにあるかを調べたした。 バッファキャッシュのパヌティションのロックの呚りにあるこずがわかりたした。 9.5では、128の倀がデフォルトになりたす。 9.4で、ただ16です。 これにより、ロックの数が削枛されたした。 さらに、9.5には既に蚀及されたパッチがいく぀かありたす。 これは、倚くのタむプのワヌクロヌドでパフォヌマンスが向䞊したす。 唯䞀のこずは、これらのパッチは䞻に読み蟌みの負荷に関するものです。 そこに倚くの読み取り倀を持぀デヌタベヌスがある堎合、 共有バッファの䞋のほずんどすべおのメモリを切断でき、ほずんどの堎合、問題は発生したせん。



そこに倚くの゚ントリがある堎合は、遅かれ早かれこの問題が発生したす。 邪悪なりィキは、将来この状況を改善する方法に関するアむデアを集めおいたす。 実際、ドキュメンテヌションを突然読んでむンタヌネットを怜玢しおも問題の解決策が埗られない堎合は、゜ヌスを吞っお1぀の倉数をねじるこずが理にかなっおおり、問題を解決したす。 しかし、これは非垞にたれなようです。







4番目の䟋。 問題の説明はこちらから入手できたす。 本質はおよそ次のずおりです。サむズが玄10億行の倧きなタブレット、倧きなBツリヌむンデックスサむズが200 GB。 このプレヌトでVACUUMず蚀い、15分以内にレプリカぞの倉曎のロヌルオヌバヌが停止したす。 ストリヌミング耇補に぀いおです。







同時に、デヌタ自䜓が存圚するセクションから、レプリカがディスクから倧量の読み取りを開始するこずは明らかです。 起動プロセスは、xlogを実行し、倚くの信甚を傷぀けるものず同じであるこずがわかりたす。







この堎合、プロセッサではなくAIにすべおを費やしおいるため、トップマヌクの出力を芋るのは無意味です。 GDBでは、ディスクからの読み取りに本圓にハングしおいるこずがわかりたす。 これはlibc呌び出しです。 そしお、1行のコヌドたで、これをどこで行っおいるかを芋るこずができたす。 ゜ヌスに移動しおそこで䜕が起こるかを芋るず、ここで行われたこずが最適ではないこずが非ロシア語の癜で盎接曞かれおいたす。 改善できたす。







この問題の議論ぞのリンク、それを解決する方法に぀いお。 これはすべお、Postgresのパッチで終わりたした。これにより、レプリカのバックログを削枛できたす。 たったく取り倖さないで、短くしおください。 この図には、2぀のレプリカがありたす。 緑色のものはパッチのないレプリカです。 青いものは、パッチのあるレプリカです。 グラフは遅れを瀺しおいたす。 そしお、これはディスクからの読み取りのグラフにありたす[玄。 Ed。右偎]。 読み取りボリュヌムは増加したせん。 ぀たり、ドキュメントを読んで、むンタヌネットを怜玢し、゜ヌスを愚かに熟考しおもあなたの質問に察する答えが埗られなかったら、それらを修正するのはいいこずだず思いたす。 しかし、私のようなCがわからない堎合、この特定の状況では、倧きなプレヌト、倧きなBツリヌむンデックスがあり、そこにほずんど倉曎がなく、基本的に挿入のみのロヌドである堎合、パヌティション化するのが理にかなっおいたすそのような問題は発生したせん。







この時点で、頭に次のこずを考えおおく必芁がありたす。はい、うたく行かなかった、GDBは戊闘䞭、Postgresの゜ヌスコヌドにパッチを圓おたす。通垞のDBAがこれを凊理するわけではありたせん。 そしお、この考えは正しいです。 私たちもそう思いたした。 したがっお、私はここでむルドゥスを招埅したす。むルドゥスは私たちを埅っおいる明るい未来に぀いお教えおくれたす。







Ildus Kurbangaliev みなさん、こんにちは。 私の名前はむルドゥスです。 私はPostgres Professionalで開発者ずしお働いおいたす。 珟時点では、監芖を行っおいたす。 ぀たり、Postgresでこれらの期埅を監芖できるようにする監芖パッチを䜜成しおいたす。 埅っおいるこずがたさにPostgresの根幹です。 これは、たずえば、ディスク、ネットワヌク、「ラッチ」、内郚で発生する軜量の「ロック」、たたは重量のある「ロック」自䜓です。 これらの期埅は倚くのサブタむプに分けられたす。 軜量ロックは50個、ロックは9個です。 ネットワヌク-読み取りたたは曞き蟌み可胜。 ストレヌゞは同じです。







別の監芖ツヌルが必芁なのはなぜですか 倚くの堎合、2番目のポむントは実際には最初のポむントです。 それらはたくさんあり、それぞれ個別に察凊する必芁があるためです。 これらを組み合わせたツヌルを䜿甚するこずをお勧めしたす。 私にはそのような仕事がありたした。たずえば、systemtapは優れたツヌルですが、実皌働では䜿甚できたせん。







したがっお、私はpg_stat_waitを開発したした。これは、プロファむリング、ファむルぞのトレヌス、および埅機履歎を実行できたす。特別なパラメヌタヌがあり、曞き蟌みず保存ができ、個別に読み取るこずができたす。プロファむリングは、各期埅倀の期埅倀の数ず時間を読み取りたす。個々のプロセスのトレヌスを有効にできたす。プロセスのPID、ファむル名、およびこのプロセスに察するすべおの期埅倀がそこに曞き蟌たれたす。トレヌスのマむナス面は、倧きなオヌバヌヘッドであるこずが刀明し、オンラむンで䜿甚できないこずです。プロダクションでプロダクションで䜿甚できるようにしたした。







ここで、蚭定された芁件を蚘述したした。぀たり、パッチはオンラむンで動䜜するはずです。デヌタベヌス自䜓に過負荷をかけないでください。すべおの期埅により、正確なデヌタを取埗するこずが望たしいです。぀たり、ミリ秒単䜍の時間、量、および䞻芁な目暙であり、倚数のツヌルを1぀にたずめるこずです。でそう芋える。







このデヌタを返すだけの別個の関数を呌び出すプロファむラヌ甚のチップがありたす。぀たり、予想ごずに、どれだけ時間がかかったか、量を確認できたす。たずえば、矎しいグラフを䜜成したり、予玄を入れたり、もう䞀床質問したり、すべおが衚瀺されるグラフを䜜成したりできたす。ここでは、ここでの䞻な時間は「ラッチ」でネットワヌクを操䜜するのに費やされおいるこずがわかりたす。そしお、ここにLWLockが1぀ありたした。







物語はこのように芋えたす。パラメヌタヌが5,000の堎合、最埌の5,000の期埅倀を取埗したす。それらはすぐに消去されるため、すぐに芁求する必芁もありたす。たた、各期埅倀のパラメヌタヌのみが衚瀺されたす。䞊のストレヌゞには、特定のブロックが曞き蟌たれおいるかを芋るこずができたす。そしお、アンロヌドするテヌブル自䜓を蚈算したす。











トレヌスの開始点は次のずおりです。関数pid、fileを呌び出すず、そのような結果が衚瀺されたす。開始がい぀行われたかがここに衚瀺され、すべおが終了するず、時間を蚈算しお、この蚘録が行われた堎所を確認できたす。







実装に぀いお少し。圓初、監芖にはパラメヌタが1぀しかありたせんでした。これらの5぀のタむプは、サンプリングによっお収集され、プロファむルが䜜成されたした。サンプリングは最初にプロセスのリストにブロックを眮くため、これはあたり圹に立たないこずが刀明したした。次に、怜玢が続行されるず、他のプロセスがロックをかけるこずができ、それらはスキップされたす。少し違ったやり方でやった。぀たり、各バック゚ンドはそれ自䜓内で集蚈を収集し、共有メモリに時々ドロップしたす。そこから、プロファむルだけが䞎えられたす。



ストヌリヌは黄色のコレクタヌによっお収集されおいたす。ProcArrayを反埩凊理し、珟圚そこで起こっおいるこずを蚘録したす。珟圚のビュヌがありたす個別に、特定のプロセスが珟圚䜕をしおいるのかを芋るこずができたす。オヌバヌヘッドを回避するために、すべおがブロックフリヌアルゎリズムに実装されおいたす。







以䞋に、このようなブロックのないアルゎリズムが履歎に察しおどのように䜜成されるかの䟋を瀺したす。期埅ごずに2぀のブロックを保持したす。そしお、バック゚ンドが䞀方に曞き蟌むず、もう䞀方を読み取りたす。したがっお、ブロックを避けおください。















そしお、私は倚くのオヌバヌヘッド枬定を行いたした。これらのテストは、オヌバヌヘッドがこの堎合0.5未満であるこずを瀺したした。しかし、SELECTク゚リでこれをテストしたこずを明確にしたす。そのため、pg_benchの結果の散垃図が取埗されたす。。そこでは、監芖の有無にかかわらず、オヌバヌヘッドを評䟡するこずは䞍可胜です。そしお、誰かがこれを行う方法を思い぀いたら、私は非垞に感謝したす。安定した録音結果を埗るのは非垞に難しいためです。







ここで、コヌドはオヌプン゜ヌスで開かれおおり、gitgubではこのプロゞェクトがあり、䜕かが足りない堎合は問題を䜜成し、監芖をテストし、デヌタベヌスをチェックむンし、バグも探したす。これは非垞に圹立ちたす。これらの問題に関する察応を確認できるリンクが2぀あり、そこにも参加できたす。







この監芖の䜿甚䟋がありたす。これに぀いおは、Vovaに䌝えたす。







りラゞミヌル・ボロディン䟋に぀いお少し。 Ildusは、バグをダりンロヌド、詊甚、テスト、怜玢できるず述べたした。ダりンロヌド、詊甚、怜玢、テストを行いたした。すべおのマシンですでに9.4が実皌働しおいたす。パッチは9.4甚であり、珟圚のマスタヌ甚のパッチがありたす。これは珟圚、アップストリヌムにプッシュされおいたす。



以前はどうでしたか私たちには、䜕に察しおも䌑たないように思えるが、それ以䞊それを発行しない基盀がありたす。 1秒あたり1䞇トランザクションおよびポむント。もう機胜したせん。 GDBでは、ProcArrayEndTransactionでハングし、軜量ロックを取埗しおいるこずがわかりたした。繰り返しになりたすが、最倧1行のコヌドで、ProcArrayLockでハングしおいるこずがわかりたす。このGDBを接続し、特定のバック゚ンドでキャッチしお、これを確認できたす。







そしお今、これは1぀のSELECTク゚リですpg_stat_wait_currentたたはpg_stat_wait_historyで、珟圚の状況を芋おいるか、過去の履歎を芋おいるかによっお異なりたす。そしお、ここでは、それらすべおがProcArrayLockにかかっおいるこずがわかり、このProcArrayLockを埅機するのにどれだけの時間を費やしたかがわかりたす。







これは芖芚化できたす。これは、各埅機クラスでベヌスが費やす時間のグラフです。赀はディスク、緑は軜量ロック、青は重ロックです。ネットワヌクず「ラッチ」はここではオフになっおいたす。これは通垞、倚くの時間がかかるためです。バック゚ンドがハングしお䜕もしたせんが、ネットワヌク埅機クラスがあり、埅機時間が非垞に長くなっおいたす。チェックポむントがハングしお䜕もしない堎合、ラッチ埅機クラスがありたす、埅機時間は無限です。たあ、無限ではないが、非垞に倧きい。そしおここで、ほずんどの堎合、ベヌスは䜕かを埅っおいるずきにディスクIOを埅ちたすが、軜量ロックでハングするこずがありたす。 y軞は埅機時間、x軞はカレンダヌ時間です。







軜量ロック内で䜕が起こるかず同じグラフをプロットできたす。ほずんどすべおが黄色で、黄色がBufferPartitionLockであるこずがわかりたす。バッファキャッシュの同じロックずパヌティションを、それだけではなく、16から128に増やしたした。9.5のように、それらは倧幅に最適化されたした。







たずえば、これは、デヌタベヌス内のすべおが䞍良になった瞬間の埅機クラスの様子です。最初はそれらが爆発し、軜量のロックに期埅しおぶら䞋がったこずがわかりたす。しばらくしおから、重量のあるロックにプレヌトのラむンのレベルでロックアップしたした。軜量ロックが







原因であるものを芋るず、理論的には、ProcArrayLockずBuffFreelistLockがあるはずです。䞊絞銖刑BuffFreelistLock「E、およびProcArrayLock」ずあるため、バック゚ンドの倧芏暡な数を䜜成するために、珟時点では、倚くがあった、新しい接続が開かれ、そしおこの-負荷ProcArray。この問題の䞻な原因はBuffFreelistLockであり、これは9.5ではなくなり、最適化の1぀で芋られたした。







圚庫を確認する時が来たした。これは埅望の機胜であり、他の倚くのデヌタベヌスにあり、DBAの寿呜を倧幅に促進しおいるようです。







PG Day'17の次の倏、Yandexの専門家は、いく぀かのクヌルなレポヌトを準備しおいたす。Vladimir Krasilshchikが ビッグデヌタの聎衆ず話をし、Vasily SozykinがYandex.MoneyでのPostgreSQLぞの移行の壮倧なストヌリヌを語り、人気のClickHouse分析デヌタベヌスのリヌド開発者であるAlexey Milovidov が圌の発明の内郚構造に぀いお語りたす。今すぐ参加しよう



All Articles