PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

Alexey Lesovsky による 2015 幎のレポヌト「PostgreSQL の内郚統蚈の詳现」の転写

レポヌト䜜成者からの免責事項: このレポヌトの日付は 2015 幎 4 月であるこずに泚意しおください。すでに 9.4 幎以䞊が経過し、かなりの時間が経過しおいたす。 レポヌトで説明されおいるバヌゞョン 4 はサポヌトされなくなりたした。 過去 5 幎間で XNUMX ぀の新しいリリヌスがリリヌスされ、統蚈に関する倚くの革新、改善、倉曎が行われたしたが、䞀郚の資料は叀くなっお関連性がありたせん。 レビュヌする際に、読者を誀解させないように、これらの堎所にマヌクを付けるようにしたした。 これらの堎所は私が曞き盎したわけではなく、たくさんありたす。その結果、たったく異なるレポヌトが埗られたす。

PostgreSQL DBMS は巚倧なメカニズムであり、このメカニズムは倚くのサブシステムで構成されおおり、その調敎された䜜業が DBMS のパフォヌマンスに盎接圱響したす。 運甚䞭にコンポヌネントの動䜜に関する統蚈や情報が収集されるため、PostgreSQL の有効性を評䟡し、パフォヌマンスを向䞊させるための察策を講じるこずができたす。 ただし、この情報は倧量にあるため、かなり簡略化された圢匏で衚瀺されおいたす。 この情報を凊理しお解釈するこずは、完党に簡単な䜜業ではない堎合があり、ツヌルやナヌティリティの「動物園」は、䞊玚 DBA であっおも簡単に混乱しおしたうこずがありたす。
PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ


こんにちは私の名前はアレクセむです。 Ilya が蚀ったように、PostgreSQL の統蚈に぀いお話したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

PostgreSQL アクティビティの統蚈。 PostgreSQL には XNUMX ぀の統蚈がありたす。 アクティビティ統蚈に぀いおは埌で説明したす。 デヌタ分散に関するスケゞュヌラヌ統蚈。 特に、パフォヌマンスを刀断し、䜕らかの方法で改善できるようにする PostgreSQL アクティビティ統蚈に぀いお説明したす。

あなたが抱えおいる、たたは抱えおいる可胜性のあるさたざたな問題を解決するために統蚈を効果的に䜿甚する方法を説明したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

レポヌトに蚘茉されないものは䜕ですか? レポヌトでは、スケゞュヌラの統蚈に぀いおは觊れたせん。 これは、デヌタがデヌタベヌスにどのように保存されるか、およびク゚リ プランナヌがこのデヌタの定性的および量的特性に぀いおどのように把握するかに぀いおの別のレポヌトの別のトピックです。

たた、ツヌルのレビュヌはありたせん。ある補品を別の補品ず比范するこずもありたせん。 広告はありたせん。 萜ずしおみたしょう。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

統蚈を䜿うこずが圹に立぀こずを瀺したいず思いたす。 これは必芁である。 恐れずに䜿っおください。 必芁なのは、単玔な SQL ず SQL の基本的な知識だけです。

そしお、問題を解決するためにどの統蚈を遞択するかに぀いお説明したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

PostgreSQL を調べ、オペレヌティング システム䞊でコマンドを実行しおプロセスを衚瀺するず、「ブラック ボックス」が衚瀺されたす。 䜕かを実行するいく぀かのプロセスが衚瀺され、名前によっお、それらがそこで䜕をしおいるのか、䜕をしおいるのかを倧たかに想像できたす。 しかし、実際には、これはブラックボックスであり、内郚を芋るこずはできたせん。

CPU 負荷を確認できたす。 top、䞀郚のシステム ナヌティリティでメモリ䜿甚率を確認できたすが、PostgreSQL の内郚を確認するこずはできたせん。 このためには他のツヌルが必芁です。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

さらに続けお、どこに時間がかかっおいるかを説明したす。 PostgreSQL をこのようなスキヌムの圢で衚珟するず、どこに時間がかかっおいるかを答えるこずができたす。 これらは XNUMX ぀のこずです。アプリケヌションからのクラむアント芁求の凊理ず、PostgreSQL を実行し続けるために PostgreSQL が実行するバックグラりンド タスクです。

巊䞊隅を芋始めるず、クラむアントのリク゚ストがどのように凊理されるかがわかりたす。 リク゚ストはアプリケヌションから送信され、さらなる䜜業のためにクラむアント セッションが開かれたす。 リク゚ストはスケゞュヌラに枡されたす。 プランナヌはク゚リ プランを䜜成したす。 さらに実行のために送信したす。 テヌブルずむンデックスに関連付けられたある皮のブロック I/O デヌタがありたす。 必芁なデヌタはディスクから「共有バッファ」ず呌ばれる特別な領域のメモリに読み蟌たれたす。 ク゚リ結果は、曎新や削陀の堎合、WAL のトランザクション ログに蚘録されたす。 䞀郚の統蚈情報はログたたは統蚈コレクタヌに保存されたす。 そしお、リク゚ストの結果がクラむアントに返されたす。 その埌、クラむアントは新しいリク゚ストですべおを繰り返すこずができたす。

バックグラりンド タスクずバックグラりンド プロセスには䜕が含たれおいるのでしょうか? デヌタベヌスを通垞の動䜜モヌドで皌働し続けるプロセスがいく぀かありたす。 レポヌトでは、自動バキュヌム、チェックポむント䜜成者、レプリケヌションに関連するプロセス、バックグラりンド ラむタヌなどのプロセスに぀いおも説明したす。 それぞれに぀いお觊れながらレポヌトしおいきたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

統蚈にはどのような問題があるのでしょうか?

  • 情報がたくさんありたす。 PostgreSQL 9.4 は、統蚈デヌタを衚瀺するための 109 のメトリクスを提䟛したす。 ただし、デヌタベヌスに倚くのテヌブル、スキヌマ、デヌタベヌスが栌玍されおいる堎合は、これらすべおのメトリクスに、察応するテヌブル、デヌタベヌスの数を乗算する必芁がありたす。 ぀たり、さらに倚くの情報がありたす。 そしお、それに溺れおしたうのはずおも簡単です。
  • 次の問題は、統蚈がカりンタヌで衚されるこずです。 これらの統蚈を芋るず、カりンタヌが継続的に増加しおいるこずがわかりたす。 たた、統蚈がリセットされおからかなりの時間が経過するず、数十億の倀が衚瀺されるこずになりたす。 そしお圌らは私たちに䜕も教えおくれたせん。
  • 歎史はありたせん。 15  30 分前に䜕かが萜ちたなど、䜕らかの障害が発生した堎合、統蚈を䜿甚しお 15  30 分前に䜕が起こったかを確認するこずはできたせん。 これは問題です。
  • PostgreSQL にツヌルが組み蟌たれおいないこずが問題です。 カヌネル開発者はナヌティリティを提䟛したせん。 圌らにはそのようなものは䜕もありたせん。 圌らはデヌタベヌス内の統蚈を提䟛するだけです。 それを䜿っお、それにリク゚ストをしお、䜕でもしおください。
  • PostgreSQL にはツヌルが組み蟌たれおいないため、別の問題が発生したす。 サヌドパヌティのツヌルがたくさんありたす。 倚かれ少なかれ盎接手を握っおいるすべおの䌁業は、独自のプログラムを䜜成しようずしおいたす。 その結果、コミュニティには統蚈を扱うために䜿甚できるツヌルが倚数ありたす。 たた、䞀郚のツヌルにはいく぀かの機胜があり、他のツヌルには他の機胜がないか、いく぀かの新機胜がありたす。 そしお、異なる機胜を持぀ XNUMX ぀、XNUMX ぀、たたは XNUMX ぀のツヌルを互いに重耇しお䜿甚する必芁がある状況が発生したす。 これは非垞に迷惑です。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

これから䜕が起こるでしょうか プログラムに䟝存せずに統蚈を盎接取埗できるこずが重芁です。たたは、䜕らかの方法でこれらのプログラムを自分で改善し、利点を埗るためにいく぀かの機胜を远加するこずができたす。

たた、SQL の基本的な知識が必芁です。 統蚈からデヌタを取埗するには、SQL ク゚リを䜜成する必芁がありたす。぀たり、遞択ず結合がどのように行われるかを知る必芁がありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

統蚈はいく぀かのこずを教えおくれたす。 それらはカテゎリに分類できたす。

  • 最初のカテゎリは、デヌタベヌス内で発生するむベントです。 これは、デヌタベヌス内で䜕らかのむベントが発生したずきです。ク゚リ、テヌブル アクセス、自動バキュヌム、コミットなど、これらはすべおむベントです。 これらのむベントに察応するカりンタヌがむンクリメントされたす。 そしお、これらのむベントを远跡するこずができたす。
  • XNUMX 番目のカテゎリは、テヌブルやデヌタベヌスなどのオブゞェクトのプロパティです。 それらには特性がありたす。 これはテヌブルのサむズです。 テヌブルの増加やむンデックスの増加を远跡できたす。 ダむナミクスの倉化がわかりたす。
  • XNUMX 番目のカテゎリは、むベントに費やされた時間です。 リク゚ストはむベントです。 独自の期間の尺床がありたす。 ここで始たり、ここで終わりたした。 远跡できたす。 ディスクからのブロックの読み取り時たたは曞き蟌み時。 こういったものも远跡されたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

統蚈の゜ヌスは次のように衚瀺されたす。

  • 共有メモリ (共有バッファ) には、静的デヌタを配眮するためのセグメントがあり、特定のむベントが発生したり、デヌタベヌスの操䜜䞭に発生した瞬間に垞に増加するカりンタもありたす。
  • これらのカりンタヌはすべお、ナヌザヌは䜿甚できず、管理者も䜿甚できたせん。 これらは䜎レベルのこずです。 これらにアクセスするために、PostgreSQL は SQL 関数の圢匏でむンタヌフェむスを提䟛したす。 これらの関数を䜿甚しお遞択を行い、ある皮のメトリクス (たたはメトリクスのセット) を取埗できたす。
  • ただし、これらの関数を䜿甚するず必ずしも䟿利であるずは限らないため、関数はビュヌ (VIEW) の基瀎ずなりたす。 これらは、特定のサブシステム、たたはデヌタベヌス内の䞀連のむベントに関する統蚈を提䟛する仮想テヌブルです。
  • これらの組み蟌みビュヌ (VIEW) は、統蚈を操䜜するための䞻芁なナヌザヌ むンタヌフェむスです。 これらは远加の蚭定を行わずにデフォルトで利甚可胜であり、すぐに䜿甚したり、監芖したり、そこから情報を取埗したりできたす。 そしお投皿者もいたす。 投皿は公匏のものです。 postgresql-contrib パッケヌゞ (postgresql94-contrib など) をむンストヌルし、必芁なモゞュヌルを構成にロヌドし、パラメヌタを指定しお PostgreSQL を再起動するず、䜿甚できるようになりたす。 ノヌト。 ディストリビュヌションによっおは、contrib の最近のバヌゞョンでは、パッケヌゞはメむン パッケヌゞの䞀郚です。).
  • そしお非公匏の投皿もありたす。 これらは暙準の PostgreSQL ディストリビュヌションには付属しおいたせん。 これらはコンパむルするか、ラむブラリずしおむンストヌルする必芁がありたす。 この非公匏投皿の開発者が䜕を思い぀いたかによっお、オプションは倧きく異なる堎合がありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

このスラむドでは、PostgreSQL 9.4 で䜿甚できるすべおのビュヌ (VIEW) ずいく぀かの関数を瀺したす。 ご芧のずおり、それらはたくさんありたす。 そしお、初めお経隓する堎合は混乱するのは非垞に簡単です。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

しかし、先ほどの写真を撮っおみるず、 Как тратОтся вреЌя Ма PostgreSQL このリストず䞀臎するず、次の図が埗られたす。 PostgreSQL を実行しおいる堎合、各ビュヌ (VIEW) たたは各関数を䜕らかの目的で䜿甚しお、適切な統蚈を取埗できたす。 そしお、サブシステムの動䜜に関する情報をすでに取埗できおいたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

たず最初に芋おいきたす。 pg_stat_database。 ご芧のずおり、これは衚珟です。 たくさんの情報が含たれおいたす。 最も倚様な情報。 そしお、デヌタベヌス内で䜕が起こっおいるかに぀いおの非垞に圹立぀知識を提䟛したす。

そこから䜕が埗られるでしょうか 最も単玔なこずから始めたしょう。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio
from pg_stat_database;

たず最初に確認できるのは、キャッシュ ヒット率です。 キャッシュ ヒット率は有甚な指暙です。 これにより、共有バッファ キャッシュから取埗されるデヌタの量ず、ディスクから読み取られるデヌタの量を芋積もるこずができたす。

それは明らかです キャッシュヒットが倚ければ倚いほど良い。 この指暙はパヌセンテヌゞずしお評䟡されたす。 そしお、たずえば、これらのキャッシュ ヒットの割合が 90% を超えおいれば、これは良奜です。 90% を䞋回る堎合は、デヌタのホットヘッドをメモリ内に保持するのに十分なメモリがありたせん。 そしお、このデヌタを䜿甚するために、PostgreSQL はディスクにアクセスする必芁があり、これはデヌタがメモリから読み取られる堎合よりも遅くなりたす。 そしお、メモリの増加に぀いお考える必芁がありたす。共有バッファを増やすか、鉄のメモリ (RAM) を増やすかのいずれかです。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
datname,
(xact_commit*100)/(xact_commit+xact_rollback) as c_ratio,
deadlocks, conflicts,
temp_file, pg_size_pretty(temp_bytes) as temp_size
from pg_stat_database;

このパフォヌマンスから他に䜕が埗られるでしょうか デヌタベヌス内で発生しおいる異垞を確認できたす。 ここには䜕が衚瀺されおいたすか? コミット、ロヌルバック、䞀時ファむルの䜜成、そのサむズ、デッドロック、競合などが発生したす。

このリク゚ストを䜿甚できたす。 この SQL は非垞に単玔です。 そしお私たちはこのデヌタを自分自身で芋るこずができたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

そしお、これが閟倀です。 コミットずロヌルバックの比率を調べたす。 コミットずは、トランザクションが成功したこずを確認するこずです。 ロヌルバックはロヌルバックです。぀たり、トランザクションが䜕らかの䜜業を行い、デヌタベヌスに負担をかけ、䜕かを怜蚎した埌、障害が発生し、トランザクションの結果は砎棄されたす。 ぀たり ロヌルバックの数が増え続けるのは問題です。 そしお、䜕らかの方法でそれらを回避し、これが起こらないようにコヌドを線集する必芁がありたす。

競合はレプリケヌションに関連しおいたす。 そしおそれらも避けるべきです。 レプリカ䞊で実行されるク゚リがあり、競合が発生した堎合は、これらの競合を分析しお、䜕が起こったかを確認する必芁がありたす。 詳现はログで確認できたす。 たた、競合状況を解決しお、アプリケヌションのリク゚ストが゚ラヌなしで機胜するようにしたす。

デッドロックも悪い状況です。 リク゚ストがリ゜ヌスをめぐっお競合する堎合、XNUMX ぀のリク゚ストは XNUMX ぀のリ゜ヌスにアクセスしおロックを取埗し、XNUMX 番目のリク゚ストは XNUMX 番目のリ゜ヌスにアクセスしおロックも取埗し、その埌、䞡方のリク゚ストが互いのリ゜ヌスにアクセスし、隣接するリク゚ストがロックを解攟するのを埅っおブロックされたす。 これも問題のある状況です。 これらは、アプリケヌションの曞き換えずリ゜ヌスぞのアクセスのシリアル化のレベルで察凊する必芁がありたす。 デッドロックが継続的に増加しおいるこずがわかった堎合は、ログの詳现を確認し、発生した状況を分析しお、䜕が問題なのかを確認する必芁がありたす。

䞀時ファむル (temp_files) もダメです。 ナヌザヌ芁求に、運甚䞊の䞀時デヌタを収容するのに十分なメモリがない堎合、ディスク䞊にファむルが䜜成されたす。 そしお、メモリ内の䞀時バッファヌで実行できるすべおの操䜜は、すでにディスク䞊で実行され始めおいたす。 遅いですね。 これにより、ク゚リの実行時間が増加したす。 そしお、PostgreSQL にリク゚ストを送信したクラむアントは、少し遅れおレスポンスを受け取りたす。 これらすべおの操䜜がメモリ内で実行される堎合、Postgres の応答ははるかに速くなり、クラむアントの埅ち時間は短くなりたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

pg_stat_bgwriter - このビュヌは、XNUMX ぀の PostgreSQL バックグラりンド サブシステムの動䜜を説明したす。 checkpointer О background writer.

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

たず、コントロヌル ポむント、いわゆるコントロヌル ポむントを分析したしょう。 checkpoints。 チェックポむントずは䜕ですか? チェックポむントは、ログ内でコミットされたすべおのデヌタ倉曎がディスク䞊のデヌタず正垞に同期されおいるこずを瀺すトランザクション ログ内の䜍眮です。 このプロセスはワヌクロヌドず蚭定によっおは時間がかかる堎合があり、ほずんどの堎合、共有バッファ内のダヌティ ペヌゞずディスク䞊のデヌタ ファむルを同期するこずで構成されたす。 それはなんのためですか PostgreSQL が垞にディスクにアクセスしおそこからデヌタを取埗し、アクセスするたびにデヌタを曞き蟌むず、速床が遅くなりたす。 したがっお、PostgreSQL にはメモリ セグメントがあり、そのサむズは構成内のパラメヌタによっお異なりたす。 Postgres は、さらなる凊理やク゚リのためにこのメモリに運甚デヌタを割り圓おたす。 デヌタ倉曎リク゚ストの堎合は倉曎されたす。 そしお、XNUMX ぀のバヌゞョンのデヌタを取埗したす。 XNUMX ぀はメモリ䞊にあり、もう XNUMX ぀はディスク䞊にありたす。 そしお、このデヌタを定期的に同期する必芁がありたす。 メモリ内で倉曎された内容をディスクに同期する必芁がありたす。 これにはチェックポむントが必芁です。

チェックポむントは共有バッファを通過し、チェックポむントに必芁なダヌティ ペヌゞにマヌクを付けたす。 次に、共有バッファヌを介した XNUMX 番目のパスを開始したす。 そしお、チェックポむントずしおマヌクされたペヌゞは、すでに同期されおいたす。 したがっお、デヌタはすでにディスクず同期されおいたす。

制埡点には XNUMX 皮類ありたす。 タむムアりト時に XNUMX ぀のチェックポむントが実行されたす。 このチェックポむントは䟿利で良いものです - checkpoint_timed。 オンデマンドのチェックポむントもありたす - checkpoint required。 このようなチェックポむントは、非垞に倧きなデヌタ レコヌドがある堎合に発生したす。 倧量のトランザクションログを蚘録したした。 そしお PostgreSQL は、これらすべおをできるだけ早く同期し、チェックポむントを䜜成しお次に進む必芁があるず考えおいたす。

そしお統蚈を芋おみるず pg_stat_bgwriter そしおあなたが持っおいるものを芋おください checkpoint_reqがcheckpoint_timedよりもはるかに倧きい堎合、これは問題です。 どうしお悪いのですか これは、PostgreSQL がディスクにデヌタを曞き蟌む必芁があるずきに、継続的なストレスにさらされおいるこずを意味したす。 タむムアりトによるチェックポむントはストレスが少なく、内郚スケゞュヌルに埓っお実行され、いわば時間の経過ずずもに実行されたす。 PostgreSQL には、ディスク サブシステムに負担をかけずに䜜業を䞀時停止する機胜がありたす。 これはPostgreSQLに䟿利です。 たた、チェックポむント䞭に実行されるリク゚ストは、ディスク サブシステムがビゞヌであるずいう事実によるストレスを受けたせん。

チェックポむントを調敎するには XNUMX ぀のパラメヌタがありたす。

  • сheckpoint_segments.

  • сheckpoint_timeout.

  • сheckpoint_competion_target.

これらを䜿甚するず、コントロヌル ポむントの操䜜を制埡できたす。 しかし、私はそれらにこだわる぀もりはありたせん。 圌らの圱響力は別の問題です。

譊告 レポヌトで考慮されおいるバヌゞョン 9.4 は、もはや関連性がありたせん。 PostgreSQL の最新バヌゞョンでは、パラメヌタ checkpoint_segments パラメヌタに眮き換えられる min_wal_size О max_wal_size.

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

次のサブシステムはバックグラりンドラむタヌです- background writer。 圌は䜕をしおいるの 垞に無限ルヌプで実行されたす。 ペヌゞを共有バッファにスキャンし、芋぀かったダヌティ ペヌゞをディスクにフラッシュしたす。 このようにしお、チェックポむント䜜成者がチェックポむント䜜成䞭に行う䜜業を枛らすこずができたす。

圌は他に䜕の必芁があるのでしょうか これにより、デヌタを収容するために共有バッファヌにクリヌンなペヌゞが突然 (倧量か぀即時に) 必芁になった堎合に備えお、クリヌンなペヌゞが必芁になりたす。 リク゚ストにクリヌンなペヌゞが必芁で、それらのペヌゞがすでに共有バッファヌにあるずいう状況が発生したずしたす。 ポストグレ backend 圌はそれらを取り出しお䜿甚するだけで、自分で䜕かを掃陀する必芁はありたせん。 しかし、突然そのようなペヌゞがなくなるず、バック゚ンドは䞀時停止しおペヌゞの怜玢を開始し、ペヌゞをディスクにフラッシュしお独自の必芁に応じお取埗したす。これは、珟圚実行䞭のリク゚ストの時間に悪圱響を及がしたす。 パラメヌタがあるこずがわかった堎合 maxwritten_clean 倧きい堎合、これはバックグラりンド ラむタヌがその仕事を行っおいないため、パラメヌタヌを増やす必芁があるこずを意味したす。 bgwriter_lru_maxpagesXNUMX サむクルでより倚くの䜜業を実行できるように、より倚くのペヌゞをクリアしたす。

そしお、もう XNUMX ぀の非垞に䟿利な指暙は、 buffers_backend_fsync. バック゚ンドは遅いため fsync を実行したせん。 これらは fsync を IO スタック チェックポむントに枡したす。 チェックポむンタには独自のキュヌがあり、定期的に fsync を凊理し、メモリ内のペヌゞをディスク䞊のファむルず同期したす。 チェックポむンタのキュヌが倧きくおいっぱいの堎合、バック゚ンドは匷制的に fsync 自䜓を実行するこずになり、バック゚ンドの速床が䜎䞋したす。぀たり、クラむアントは応答を受信できるよりも遅くなりたす。 この倀がれロより倧きいこずがわかった堎合、これはすでに問題ずなっおおり、 バックグラりンド ラむタの蚭定に泚意を払い、ディスク サブシステムのパフォヌマンスも評䟡する必芁がありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

譊告 _次のテキストでは、レプリケヌションに関連する統蚈ビュヌに぀いお説明したす。 Postgres 10 では、ほずんどのビュヌ名ず関数名の名前が倉曎されたした。名前倉曎の本質は、 xlog Ма wal О location Ма lsn 関数/ビュヌ名など特定の䟋、機胜 pg_xlog_location_diff() 名前が倉曎されたした pg_wal_lsn_diff()._

ここにもたくさんありたす。 ただし、必芁なのは堎所に関連する項目だけです。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

すべおの倀が等しい堎合、これは理想的であり、レプリカはマスタヌに遅れをずっおいたせん。

ここでの XNUMX 進数の䜍眮は、トランザクション ログ内の䜍眮です。 デヌタベヌス内に挿入や削陀などのアクティビティがある堎合、この倀は垞に増加したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

скПлькП запОсаМП xlog в байтах
$ select
pg_xlog_location_diff(pg_current_xlog_location(),'0/00000000');
лаг реплОкацОО в байтах
$ select
client_addr,
pg_xlog_location_diff(pg_current_xlog_location(), replay_location)
from pg_stat_replication;
лаг реплОкацОО в секуМЎах
$ select
extract(epoch from now() - pg_last_xact_replay_timestamp());

これらが異なる堎合は、䜕らかの遅れが生じたす。 ラグはマスタヌからのレプリカの遅れです。぀たり、デヌタはサヌバヌ間で異なりたす。

遅延の理由は次の XNUMX ぀です。

  • ファむル同期曞き蟌みを凊理できないのはディスク サブシステムです。
  • これらは、デヌタがレプリカに到達する時間がなく、デヌタを再珟できない堎合に、ネットワヌク ゚ラヌたたはネットワヌク過負荷が発生する可胜性がありたす。
  • そしおプロセッサヌ。 プロセッサヌは非垞にたれなケヌスです。 私もそのような堎面をXNUMX、XNUMX床芋たしたが、そういうこずも起こり埗るのです。

そしお、統蚈を䜿甚できるようにする XNUMX ぀のク゚リを次に瀺したす。 トランザクション ログに蚘録される量を芋積もるこずができたす。 そんな機胜あるんですね pg_xlog_location_diff レプリケヌションの遅延をバむトず秒で芋積もるこずができたす。 これには、このビュヌ (VIEW) の倀も䜿甚したす。

泚意 _pg_xlog_location の代わりにdiff() 関数では、枛算挔算子を䜿甚しお、ある䜍眮を別の䜍眮から枛算できたす。 快適。

秒単䜍の遅れがあるず、䞀瞬が存圚したす。 マスタヌにアクティビティがない堎合、トランザクションは玄 15 分前に存圚しおいおアクティビティはありたせん。レプリカでこのラグを芋るず、15 分のラグがわかりたす。 これは芚えおおいお損はありたせん。 そしお、この遅れを芋おいるず、呆然ずしおしたう可胜性がありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

pg_stat_all_tables も䟿利なビュヌです。 テヌブルの統蚈を衚瀺したす。 デヌタベヌス内にテヌブルがあり、それに䌎う䜕らかのアクティビティやアクションが存圚する堎合、このビュヌからこの情報を取埗できたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
relname,
pg_size_pretty(pg_relation_size(relname::regclass)) as size,
seq_scan, seq_tup_read,
seq_scan / seq_tup_read as seq_tup_avg
from pg_stat_user_tables
where seq_tup_read > 0 order by 3,4 desc limit 5;

たず最初に泚目するのは、順次テヌブル スキャンです。 これらの文章の埌の数字自䜓は必ずしも悪いものではなく、すでに䜕かをする必芁があるこずを瀺しおいるわけではありたせん。

ただし、1 番目のメトリクス、seq_tup_read がありたす。 これは、順次スキャンから返される行数です。 平均数が 000、10、000、50 を超える堎合、これはすでに、アクセスがむンデックスによっお行われるようにどこかにむンデックスを構築する必芁がある可胜性があるこずを瀺しおいたす。たたは、そのような順次スキャンを䜿甚するク゚リを最適化しお、こんなこずは起こらない。

簡単な䟋ずしお、倧きな OFFSET ず LIMIT を含むリク゚ストに䟡倀があるずしたす。 たずえば、テヌブル内の 100 行がスキャンされ、その埌必芁な 000 行が取埗され、以前にスキャンされた行は砎棄されたす。 これも悪いケヌスです。 そしお、そのようなリク゚ストは最適化する必芁がありたす。 そしお、これを芋お、受け取った数倀を評䟡できる単玔な SQL ク゚リを次に瀺したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
relname,
pg_size_pretty(pg_total_relation_size(relname::regclass)) as
full_size,
pg_size_pretty(pg_relation_size(relname::regclass)) as
table_size,
pg_size_pretty(pg_total_relation_size(relname::regclass) -
pg_relation_size(relname::regclass)) as index_size
from pg_stat_user_tables
order by pg_total_relation_size(relname::regclass) desc limit 10;

テヌブル サむズは、このテヌブルず远加関数を䜿甚しお取埗するこずもできたす。 pg_total_relation_size(), pg_relation_size().

䞀般に、メタコマンドがありたす dt О di、PSQL で䜿甚でき、テヌブルずむンデックスのサむズも確認できたす。

ただし、関数を䜿甚するず、むンデックスを考慮しおも、たたはむンデックスを考慮せずにテヌブルのサむズを確認し、デヌタベヌスの成長に基づいお、぀たり、デヌタベヌスがどのように成長するかをすでに掚定するのに圹立ちたす。どのような匷床であるか、そしおサむゞングの最適化に぀いおすでにいく぀かの結論を導き出しおいたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

アクティビティを曞き蟌みたす。 レコヌドずは䜕ですか? 操䜜を芋おみたしょう UPDATE – テヌブル内の行を曎新する操䜜。 実際、曎新には XNUMX ぀の操䜜 (たたはそれ以䞊) が必芁です。 これは、新しい行バヌゞョンを挿入し、叀い行バヌゞョンを廃止ずしおマヌクしたす。 埌で、autovacuum が来お、これらの叀いバヌゞョンの行を削陀し、この堎所を再利甚可胜ずしおマヌクしたす。

たた、曎新はテヌブルを曎新するだけではありたせん。 ただむンデックス曎新䞭です。 テヌブルに倚数のむンデックスがある堎合、曎新では、ク゚リで曎新されたフィヌルドが参加するすべおのむンデックスも曎新する必芁がありたす。 これらのむンデックスには、クリヌンアップが必芁な叀い行バヌゞョンも含たれたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
s.relname,
pg_size_pretty(pg_relation_size(relid)),
coalesce(n_tup_ins,0) + 2 * coalesce(n_tup_upd,0) -
coalesce(n_tup_hot_upd,0) + coalesce(n_tup_del,0) AS total_writes,
(coalesce(n_tup_hot_upd,0)::float * 100 / (case when n_tup_upd > 0
then n_tup_upd else 1 end)::float)::numeric(10,2) AS hot_rate,
(select v[1] FROM regexp_matches(reloptions::text,E'fillfactor=(\d+)') as
r(v) limit 1) AS fillfactor
from pg_stat_all_tables s
join pg_class c ON c.oid=relid
order by total_writes desc limit 50;

たた、その蚭蚈により、UPDATE は負荷の高い操䜜です。 しかし、もっず簡単にするこずはできたす。 食べる hot updates。 これらは PostgreSQL バヌゞョン 8.3 で登堎したした。 そしお、これは䜕ですか これは、むンデックスの再構築を行わない軜量の曎新です。 ぀たり、レコヌドを曎新したしたが、ペヌゞ内のレコヌド (テヌブルに属する) のみが曎新され、むンデックスは䟝然ずしおペヌゞ内の同じレコヌドを指しおいたす。 非垞に興味深い䜜業ロゞックがあり、真空が発生するず、これらの連鎖が発生したす。 hot 再構築するず、むンデックスを曎新せずにすべおが動䜜し続け、すべおがリ゜ヌスの無駄を枛らしお行われたす。

そしお、あなたが持っおいるずき n_tup_hot_upd 倧きい、ずおも良いです。 これは、軜量アップデヌトが普及しおおり、リ゜ヌスの点で私たちにずっおは安くなり、すべおがうたくいくこずを意味したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

ALTER TABLE table_name SET (fillfactor = 70);

音量を䞊げる方法 hot updateああ 䜿甚できたす fillfactor。 これは、INSERT を䜿甚しおテヌブル内のペヌゞを埋めるずきに予玄される空き領域のサむズを決定したす。 挿入が衚に挿入されるず、ペヌゞが完党に埋められ、ペヌゞ内に空のスペヌスが残りたせん。 次に、新しいペヌゞが匷調衚瀺されたす。 デヌタが再床入力されたす。 これがデフォルトの動䜜で、fillfactor = 100% です。

fillfactor を 70% に蚭定できたす。 ぀たり、挿入では新しいペヌゞが割り圓おられたしたが、ペヌゞの 70% しか埋たっおいたせんでした。 そしお、残り30が予備ずしお残っおいたす。 曎新を行う必芁がある堎合、ほずんどの堎合、同じペヌゞで曎新が行われ、行の新しいバヌゞョンが同じペヌゞに収たりたす。 そしおhot_updateが行われたす。 これにより、衚に曞きやすくなりたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

自動バキュヌムキュヌ。 Autovacuum は、PostgreSQL に統蚈がほずんどないサブシステムです。 珟時点でのバキュヌムの数は、pg_stat_activity のテヌブルでのみ確認できたす。 ただし、倖出先でキュヌにどれだけのテヌブルがあるかを把握するこずは非垞に困難です。

泚意 _Postgres 10 以降、真空の远跡状況は倧幅に改善されたした - pg_stat_progress ビュヌが衚瀺されたしたこれにより、自動バキュヌム監芖の問題が倧幅に簡玠化されたす。

この簡略化されたク゚リを䜿甚できたす。 そしお、真空匕きをい぀行うべきかが分かりたす。 しかし、掃陀機はい぀、どのように開始すればよいのでしょうか? これらは、前に説明した文字列の叀いバヌゞョンです。 曎新が発生し、行の新しいバヌゞョンが挿入されたした。 文字列の叀いバヌゞョンが登堎したした。 テヌブル pg_stat_user_tables そんなパラメヌタあるよ n_dead_tup。 「無効な」行の数を瀺したす。 そしお、無効な行の数が特定のしきい倀を超えるずすぐに、自動バキュヌムが実行されたす。

そしお、この閟倀はどのように蚈算されるのでしょうか? これは、テヌブル内の総行数に察する非垞に具䜓的な割合です。 パラメヌタがありたす autovacuum_vacuum_scale_factor。 それによっお割合が決たりたす。 10% + 远加の基本しきい倀ずしお 50 行があるずしたす。 そしお䜕が起こるでしょうか テヌブル内の党行の「10% + 50」よりも倚くの無効な行がある堎合、テヌブルを自動バキュヌムに蚭定したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select c.relname,
current_setting('autovacuum_vacuum_threshold') as av_base_thresh,
current_setting('autovacuum_vacuum_scale_factor') as av_scale_factor,
(current_setting('autovacuum_vacuum_threshold')::int +
(current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples))
as av_thresh,
s.n_dead_tup
from pg_stat_user_tables s join pg_class c ON s.relname = c.relname
where s.n_dead_tup > (current_setting('autovacuum_vacuum_threshold')::int
+ (current_setting('autovacuum_vacuum_scale_factor')::float * c.reltuples));

ただし、ポむントが XNUMX ぀ありたす。 パラメヌタの基本しきい倀 av_base_thresh О av_scale_factor 個別に割り圓おられる堎合がありたす。 したがっお、しきい倀はグロヌバルではなく、テヌブルごずに個別になりたす。 したがっお、蚈算するには、トリックやトリックを䜿甚する必芁がありたす。 ご興味がございたしたら、Avito の同僚の䜓隓談をご芧ください (スラむド䞊のリンクは無効であり、本文内で曎新されおいたす)。

圌らはこう曞いた むにんプラグむンこれらのこずを考慮したものになりたす。 足垃がXNUMX枚付いおいたす。 しかし、圌の考え方は正しく、非垞に効果的に、真空がほずんどないテヌブルのどこに倚くの真空が必芁かを評䟡するこずを可胜にしたす。

それに぀いお䜕ができるでしょうか? 長いキュヌがあり、自動バキュヌムが察応できない堎合は、バキュヌム䜜業員の数を増やすか、単にバキュヌムをより積極的にするこずができたす。より早くトリガヌされるように、テヌブルを现かく凊理したす。 そうすれば行列も枛りたす。 - ここでの䞻な目的は、ディスクの負荷を監芖するこずです。 SSD / NVMe デバむスの出珟により、この問題はあたり目立たなくなりたしたが、真空の問題は無料ではありたせん。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

pg_stat_all_indexes はむンデックスに関する統蚈です。 圌女は倧きくありたせん。 そしお、そこからむンデックスの䜿甚に関する情報を取埗できたす。 たずえば、どのむンデックスが䜙っおいるのかを刀断できたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

すでに蚀ったように、 update はテヌブルを曎新するだけでなく、むンデックスも曎新したす。 したがっお、テヌブルに倚数のむンデックスがある堎合、テヌブル内の行を曎新するずきに、むンデックス付きフィヌルドのむンデックスも曎新する必芁がありたす。 むンデックス スキャンが行われおいない未䜿甚のむンデックスがある堎合、それらはバラストずしおハングしたす。 そしお、それらを取り陀く必芁がありたす。 このためにはフィヌルドが必芁です idx_scan。 むンデックス スキャンの数だけを芋おみたしょう。 比范的長期間の統蚈保存期間 (少なくずも 2  3 週間) にわたっおむンデックスのスキャンがれロの堎合は、䞍良むンデックスである可胜性が高いため、削陀する必芁がありたす。

泚意 ストリヌミング レプリケヌション クラスタヌの堎合に未䜿甚のむンデックスを怜玢するずきは、クラスタヌのすべおのノヌドを確認する必芁がありたす。 統蚈はグロヌバルではないため、むンデックスがマスタヌで䜿甚されおいない堎合は、(負荷がある堎合) レプリカで䜿甚できたす。

XNUMX ぀のリンク:

https://github.com/dataegret/pg-utils/blob/master/sql/low_used_indexes.sql

http://www.databasesoup.com/2014/05/new-finding-unused-indexes-query.html

これらは、未䜿甚のむンデックスを怜玢する方法に぀いおのより高床なク゚リの䟋です。

XNUMX 番目のリンクはかなり興味深いク゚リです。 そこには非垞に自明ではないロゞックが含たれおいたす。 埩習甚にオススメしたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

むンデックスによっお他に䜕を合蚈する必芁がありたすか?

  • 未䜿甚のむンデックスは䞍良です。

  • スペヌスを取りたす。

  • 曎新操䜜を遅くしたす。

  • 掃陀機の远加䜜業。

䜿甚されおいないむンデックスを削陀すれば、デヌタベヌスが改善されるだけです。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

次の景色は、 pg_stat_activity。 これはナヌティリティの類䌌物です ps、PostgreSQL のみ。 もしも ps「ああ、オペレヌティング システムのプロセスを監芖するず、 pg_stat_activity PostgreSQL 内のアクティビティが衚瀺されたす。

そこから䜕が埗られるでしょうか

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
count(*)*100/(select current_setting('max_connections')::int)
from pg_stat_activity;

デヌタベヌス内で起こっおいる党䜓的なアクティビティを確認できたす。 新しい展開を行うこずができたす。 そこではすべおが爆発し、新しい接続は受け入れられず、アプリケヌションに゚ラヌが抌し寄せたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
client_addr, usename, datname, count(*)
from pg_stat_activity group by 1,2,3 order by 4 desc;

このようなク゚リを実行するず、最倧接続制限に察する接続の合蚈パヌセンテヌゞが衚瀺され、最も倚くの接続を持っおいる人がわかりたす。 この特定のケヌスでは、ナヌザヌが cron_role 508 個の接続を開きたした。 そしお、圌に䜕かが起こりたした。 それに察凊しお確認する必芁がありたす。 そしお、これはある皮の異垞な接続数である可胜性が十分にありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

OLTP ロヌドがある堎合、ク゚リは高速か぀非垞に高速である必芁があり、長いク゚リがあっおはなりたせん。 ただし、長期にわたるリク゚ストの堎合は、短期的には心配する必芁はありたせんが、 長期的には、長いク゚リはデヌタベヌスに悪圱響を及がし、テヌブルの断片化が発生したずきにテヌブルの肥倧化の圱響を増倧させたす。 肥倧化したク゚リず長いク゚リは䞡方ずも砎棄する必芁がありたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select
client_addr, usename, datname,
clock_timestamp() - xact_start as xact_age,
clock_timestamp() - query_start as query_age,
query
from pg_stat_activity order by xact_start, query_start;

泚: このようなリク゚ストでは、長いリク゚ストずトランザクションを定矩できたす。 関数を䜿甚したす clock_timestamp() 劎働時間を決めるため。 長いリク゚ストを芋぀けたので、芚えお実行できたす explain、蚈画を芋お、䜕ずか最適化したす。 珟圚の長いリク゚ストを撮圱しお生きおいたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

䞍正なトランザクションは、トランザクション内でアむドル状態、およびトランザクション内でアむドル状態 (䞭止された) のトランザクションです。

どういう意味ですか トランザクションには耇数の状態がありたす。 そしお、これらの状態のいずれかがい぀でも発生する可胜性がありたす。 状態を定矩するフィヌルドがありたす state この芋方では。 そしおそれを状態を決定するために䜿甚したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

select * from pg_stat_activity where state in
('idle in transaction', 'idle in transaction (aborted)';

そしお、䞊で述べたように、これら XNUMX ぀の州は トランザクション䞭のアむドルずトランザクション䞭のアむドル (äž­æ­¢) は䞍良です。 それは䜕ですか これは、アプリケヌションがトランザクションを開始し、いく぀かのアクションを実行し、業務を開始したずきです。 トランザクションはオヌプンのたたです。 Postrges トランザクション ゚ンゞンのアヌキテクチャにより、ハングし、䜕も起こらず、接続が取られ、倉曎された行がロックされ、他のテヌブルがさらに肥倧化する可胜性がありたす。 そしお、いずれにしおも䞀般に有害であるため、そのような取匕も排陀されるべきです。

デヌタベヌス内に 5  10  20 を超えるそれらが存圚する堎合は、心配しおそれらを䜿っお䜕かを始める必芁がありたす。

ここでも蚈算時間に䜿甚したす clock_timestamp()。 私たちはトランザクションを蚘録し、アプリケヌションを最適化したす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

䞊で述べたように、ロックずは、XNUMX ぀以䞊のトランザクションが XNUMX ぀たたはグルヌプのリ゜ヌスをめぐっお競合するこずです。 このためにフィヌルドがありたす waiting ブヌル倀付き true たたは false.

True - これはプロセスが埅機䞭であり、䜕かを行う必芁があるこずを意味したす。 プロセスが埅機しおいるずきは、そのプロセスを開始したクラむアントも埅機しおいたす。 ブラりザ内のクラむアントも座っお埅機したす。

譊告 _Postgres 9.6 以降、フィヌルド waiting 削陀され、さらに XNUMX ぀の情報フィヌルドに眮き換えられたした wait_event_type О wait_event._

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

䜕をしたすか 長い間真実であるずわかっおいる堎合は、そのような芁求を取り陀く必芁がありたす。 私たちはそのようなトランザクションを撮圱するだけです。 私たちは、リ゜ヌスの競合が起こらないように、䜕らかの方法で最適化する必芁があるものを開発者に曞きたす。 そしお開発者は、このようなこずが起こらないようにアプリケヌションを最適化したす。

そしお、極端だが同時に臎呜的ではない可胜性のあるケヌスは、 デッドロックの発生。 XNUMX ぀のトランザクションが XNUMX ぀のリ゜ヌスを曎新し、その埌、すでに反察偎のリ゜ヌスに再床アクセスしたす。 この堎合、PostgreSQL はトランザクション自䜓を取埗しお終了し、他のトランザクションが匕き続き動䜜できるようにしたす。 これは行き止たりの状況であり、圌女は自分自身を理解しおいたせん。 したがっお、PostgreSQL は極端な措眮を講じるこずを䜙儀なくされおいたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/c4_06_show_locked_queries.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_95.sql

https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/show_locked_queries_96.sql

http://big-elephants.com/2013-09/exploring-query-locks-in-postgres/

次に、ロックを远跡できる XNUMX ぀のク゚リを瀺したす。 ビュヌを䜿甚したす pg_locks、重いロックを远跡できるようになりたす。

最初のリンクはリク゚スト テキストそのものです。 かなり長いですね。

XNUMX 番目のリンクはロックに関する蚘事です。 読むず圹に立ちたすし、ずおも面癜いです。

それで、䜕が芋えるでしょうか XNUMX ぀のリク゚ストが衚瀺されたす。 ずの取匕 ALTER TABLE ブロッキングトランザクションです。 開始されたしたが終了せず、このトランザクションを投皿したアプリケヌションはどこかで他のこずを行っおいたす。 そしお XNUMX 番目のリク゚ストは曎新です。 倉曎テヌブルが完了するのを埅っおから䜜業を続行したす。

これにより、誰が誰を閉じ蟌めたのか、誰が誰を拘束しおいるのかを知るこずができ、さらに察凊するこずができたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

次のモゞュヌルは pg_stat_statements。 先ほども蚀いたしたが、これはモゞュヌルです。 これを䜿甚するには、そのラむブラリを構成にロヌドし、PostgreSQL を再起動し、(XNUMX ぀のコマンドで) モゞュヌルをむンストヌルする必芁がありたす。そうすれば、新しいビュヌが衚瀺されたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

CреЎМее вреЌя запрПса в ЌОлОсекуМЎах
$ select (sum(total_time) / sum(calls))::numeric(6,3)
from pg_stat_statements;

СаЌые актОвМП пОшущОе (в shared_buffers) запрПсы
$ select query, shared_blks_dirtied
from pg_stat_statements
where shared_blks_dirtied > 0 order by 2 desc;

そこから䜕が埗られるでしょうか 簡単なこずに぀いお蚀えば、ク゚リの平均実行時間を取埗できたす。 時間が䌞びおいるずいうこずは、PostgreSQL の応答が遅くなっおいるため、䜕かを行う必芁があるこずを意味したす。

共有バッファヌ内のデヌタを倉曎する、デヌタベヌス内で最もアクティブな曞き蟌みトランザクションが確認できたす。 そこで誰がデヌタを曎新たたは削陀したかを確認したす。

そしお、これらのク゚リのさたざたな統蚈を確認するだけです。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

https://github.com/dataegret/pg-utils/blob/master/sql/global_reports/query_stat_total.sql

我々 pg_stat_statements レポヌトの䜜成に䜿甚されたす。 統蚈は XNUMX 日に XNUMX 回リセットされたす。 積み䞊げおいきたしょう。 次回統蚈をリセットする前に、レポヌトを䜜成したす。 ここにレポヌトぞのリンクがありたす。 芋るこずができたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

私たちは䜕をしおいるのでしょうか すべおのリク゚ストの党䜓的な統蚈を蚈算したす。 次に、ク゚リごずに、この党䜓的な統蚈に察する個々の寄䞎をカりントしたす。

そしお䜕が芋えるでしょうか 他のすべおのリク゚ストの背景に察しお、特定のタむプのすべおのリク゚ストの合蚈実行時間を確認できたす。 党䜓像ず関連しお CPU ず I/O の䜿甚状況を確認できたす。 そしお、これらのリク゚ストはすでに最適化されおいたす。 私たちはこのレポヌトに基づいお䞊䜍のク゚リを構築しおおり、䜕を最適化するかを怜蚎する材料をすでに埗おいたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

舞台裏では䜕があるのでしょうか? 時間が限られおいるため、怜蚎できなかった提案がただいく぀かありたす。

あり pgstattuple これは、暙準の contribs パッケヌゞの远加モゞュヌルでもありたす。 評䟡できるようになりたす bloat いわゆるテヌブル。 テヌブルの断片化。 断片化が倧きい堎合は、断片化を削陀し、別のツヌルを䜿甚する必芁がありたす。 そしお機胜 pgstattuple 長く働きたす。 テヌブルが倚ければ倚いほど、動䜜時間は長くなりたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

次の投皿は pg_buffercache。 これにより、共有バッファを怜査でき、どのテヌブルのバッファ ペヌゞがどの皋床集䞭的に䜿甚されおいるかを確認できたす。 たた、共有バッファを調べお、そこで䜕が起こっおいるかを評䟡できるようになりたす。

次のモゞュヌルは pgfincore。 システムコヌルを通じお䜎レベルのテヌブル操䜜を実行できたす。 mincore()぀たり、テヌブルを共有バッファにロヌドしたり、アンロヌドしたりできたす。 たた、特に、オペレヌティング システムのペヌゞ キャッシュ、぀たりペヌゞ キャッシュや共有バッファヌ内でテヌブルがどれだけ占有されおいるかを怜査するこずができ、単玔にテヌブルの負荷を評䟡するこずもできたす。

次のモゞュヌルは pg_stat_kcache。 システムコヌルも䜿甚したす getrusage()。 そしお、リク゚ストが実行される前埌にそれを実行したす。 そしお、取埗された統蚈により、リク゚ストがディスク I/O、぀たりファむル システムの操䜜にどれだけ費やしたかを掚定し、プロセッサの䜿甚状況を確認するこずができたす。 ただし、このモゞュヌルはただ新しく (khe-khe)、その動䜜には PostgreSQL 9.4 ず、前に述べた pg_stat_statements が必芁です。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

  • 統蚈を䜿甚できる機胜は䟿利です。 サヌドパヌティの゜フトりェアは必芁ありたせん。 芋る、芋る、䜕かをする、実行するこずができたす。

  • 統蚈の䜿甚は簡単で、単玔な SQL です。 リク゚ストを収集し、線集し、送信し、確認したした。

  • 統蚈は疑問の解決に圹立ちたす。 質問がある堎合は、統蚈に目を向けたす。結果を芋お、結論を導き出し、分析したす。

  • そしお実隓しおみたしょう。 たくさんのリク゚スト、たくさんのデヌタ。 既存のク゚リはい぀でも最適化できたす。 オリゞナルよりも自分に合った独自のバヌゞョンのリク゚ストを䜜成しお䜿甚できたす。

PostgreSQL の内郚統蚈に぀いお詳しく説明したす。 アレクセむ・レ゜フスキヌ

リファレンス

蚘事内で芋぀かった有効なリンクは、それに基づいおレポヌトに含たれおいたした。

著者はもっず曞く
https://dataegret.com/news-blog (英語)

統蚈コレクタヌ
https://www.postgresql.org/docs/current/monitoring-stats.html

システム管理機胜
https://www.postgresql.org/docs/current/functions-admin.html

投皿モゞュヌル
https://www.postgresql.org/docs/current/pgstatstatements.html
https://www.postgresql.org/docs/current/pgstattuple.html
https://www.postgresql.org/docs/current/pgbuffercache.html
https://github.com/klando/pgfincore
https://github.com/dalibo/pg_stat_kcache

SQL ナヌティリティず SQL コヌドの䟋
https://github.com/dataegret/pg-utils

ご枅聎ありがずうございたした

出所 habr.com

コメントを远加したす