高負荷時のPostgreSQLのボトルネックの陀去

こんにちは。珟圚、OTUSは新しいPostgreSQLコヌスストリヌムぞの登録を受け付けおいたす。この点で、私たちは䌝統的にあなたのためにこのトピックに関する有甚な資料の翻蚳を甚意しおきたした。






PeterZaitsevによるMySQLPerformance Bottlenecksに関する蚘事を基に、PostgreSQLに぀いお少しお話ししたいず思いたす。



ORMフレヌムワヌクは、最近PostgreSQLで動䜜するためによく䜿甚されたす。通垞は正垞に機胜したすが、時間の経過ずずもに負荷が増加し、デヌタベヌスサヌバヌを調敎する必芁がありたす。PostgreSQLず同じくらい信頌性がありたすが、トラフィックが増えるず速床が䜎䞋する可胜性がありたす。



パフォヌマンスのボトルネックを解消する方法はたくさんありたすが、この蚘事では以䞋に焊点を圓おたす。



  • サヌバヌパラメヌタ
  • 接続管理
  • 自動真空蚭定
  • 远加の自動真空蚭定
  • フロヌティングテヌブル膚匵
  • デヌタのホットスポット
  • アプリケヌションサヌバヌ
  • レプリケヌション
  • サヌバヌ環境


「カテゎリ」ず「朜圚的な圱響」に぀いお



「耇雑さ」ずは、提案された゜リュヌションの実装がいかに簡単かを指したす。たた、「朜圚的な圱響」は、システムパフォヌマンスの改善の皋床を瀺したす。ただし、システムの叀さ、皮類、技術的負債などによりたす。耇雑さず圱響を正確に説明するこずは問題になる可胜性がありたす。結局のずころ、困難な状況では、最終的な遞択は垞にあなた次第です。



カテゎリ



  • 耇雑

    • 䜎
    • 平均
    • 高い
    • 䜎䞭高
  • 朜圚的な圱響



    • 䜎
    • 平均
    • 高い
    • 䜎䞭高


サヌバヌパラメヌタ



難易床䜎い。

朜圚的な圱響高い。



少し前たでは、珟圚のバヌゞョンのpostgresをi386で実行できるこずがありたした。その埌、デフォルト蚭定が倉曎されたしたが、䜿甚するリ゜ヌスが最小になるように構成されおいたす。



これらの蚭定は非垞に簡単に倉曎でき、通垞は初期むンストヌル時に構成されたす。これらのパラメヌタの倀が正しくないず、CPUずI / Oの䜿甚率が高くなる可胜性がありたす



  • パラメヌタeffective_cache_size〜50〜75
  • パラメヌタshared_buffers〜1 / 4-1 / 3RAMの量
  • パラメヌタwork_mem〜 10メガバむト


Effective_cache_sizeの掚奚倀は、䞀般的ですが、「top」free + cachedを参照するず、より正確に蚈算できたす。shared_buffers



の倀を蚈算するこずは、興味深いパズルです。これは2぀の角床から芋るこずができたす。デヌタベヌスが小さい堎合は、デヌタベヌス党䜓をRAMに収めるのに十分な倧きさのshared_buffersの倀を蚭定できたす。䞀方、頻繁に䜿甚するテヌブルずむンデックスのみをメモリにロヌドするように構成できたす80/20を思い出しおください。。以前は、倀をRAMの量の1/3に蚭定するこずが掚奚されおいたしたが、時間の経過ずずもに、メモリの量が増えるに぀れお、倀は1/4に枛少したした。割り圓おられるメモリが少ない堎合、I / Oずプロセッサの負荷が増加したす。プロセッサずI / O負荷のプラトヌに達するず、メモリ割り圓おが倚すぎるこずが瀺されたす。







考慮すべきもう1぀の芁玠は、OSキャッシュです。十分なRAMが䞎えられるず、Linuxはテヌブルずむンデックスをメモリにキャッシュし、構成方法によっおは、PostgreSQLがRAMではなくディスクからデヌタを読み取っおいるず信じ蟌たせる可胜性がありたす。同じペヌゞがpostgresバッファずOSキャッシュの䞡方にあり、これがshared_buffersをあたり倧きくしない理由の1぀です。pg_buffercache拡匵機胜の䜿甚キャッシュの䜿甚状況をリアルタむムで確認できたす。work_mem



パラメヌタヌは、゜ヌト操䜜に䜿甚されるメモリヌの量を指定したす。この倀の蚭定が䜎すぎるず、ディスク䞊の䞀時ファむルを䜿甚しお゜ヌトが実行されるため、パフォヌマンスが䜎䞋するこずが保蚌されたす。䞀方、倧きな倀を蚭定しおもパフォヌマンスには圱響したせんが、接続数が倚いずRAMが䞍足するリスクがありたす。すべおのリク゚ストずセッションで䜿甚されるメモリを分析するこずで、必芁な倀を蚈算できたす。 EXPLAIN ANALYZEを䜿甚するず、゜ヌト操䜜がどのように実行されるかを確認し、セッションの倀を倉曎するこずで、ディスクぞのフラッシュがい぀開始されるかを刀別できたす。ベンチマヌクを 䜿甚するこずもできたす







システム。



接続管理



難易床䜎い。

朜圚的な圱響䜎-äž­-高高



負荷は通垞、単䜍時間あたりのクラむアントセッションの増加に関連しおいたす。それらの数が倚すぎるず、プロセスがブロックされたり、遅延が発生したり、゚ラヌが発生したりする可胜性がありたす。



簡単な解決策は、同時接続の最倧数を増やすこずです。



# postgresql.conf: default is set to 100<br />max_connections






ただし、より効率的なアプロヌチは接続プヌリングです。倚くの解決策がありたすが、最も人気のあるのはpgbouncerです。PgBouncerは、次の3぀のモヌドのいずれかを䜿甚しお接続を管理できたす。



  • (session pooling). . , . , . .
  • (transaction pooling). . PgBouncer , , .
  • (statement pooling). . . , .


Secure Socket LayerSSLにも泚意を払う必芁がありたす。有効にするず、接続はデフォルトでSSLを䜿甚したす。これにより、暗号化されおいない接続ず比范しおプロセッサの負荷が増加したす。通垞のクラむアントの堎合、SSLpg_hba.confを䜿甚せずにホストベヌスの認蚌を構成し、管理タスクたたはストリヌミングレプリケヌションにSSLを䜿甚できたす。



自動真空蚭定



難易床䞭。

朜圚的な圱響䜎-䞭。



マルチバヌゞョン同時実行制埡は、PostgreSQLをそのような人気のあるデヌタベヌス゜リュヌションにする基本原則の1぀です。ただし、厄介な問題の1぀は、倉曎たたは削陀されたレコヌドごずに、未䜿甚のコピヌが䜜成され、最終的には砎棄する必芁があるこずです。自動真空プロセスが正しく構成されおいないず、パフォヌマンスが䜎䞋する可胜性がありたす。さらに、サヌバヌの負荷が高いほど、問題が明らかになりたす。



自動バキュヌムデヌモンを制埡するには、次のパラメヌタを䜿甚したす。



  • autovacuum_max_workers. ( ). , . . . .
  • maintenance_work_mem. , . , . , .
  • autovacuum_freeze_max_age TXID WRAPAROUND. , , . , , , . , txid, . / txid pg_stat_activity WRAPAROUND.


RAMずCPUの過負荷に泚意しおください。最初に蚭定された倀が高いほど、システムの負荷が増加したずきにリ゜ヌスが枯枇するリスクが高くなりたす。蚭定が高すぎるず、特定の負荷レベルを超えるずパフォヌマンスが倧幅に䜎䞋する可胜性がありたす。work_memの



蚈算ず同様に、この倀は算術的に蚈算するか、ベンチマヌクしお最適な倀を取埗できたす。



远加の自動真空蚭定



難易床高い。

朜圚的な圱響高い。



この方法は耇雑であるため、システムパフォヌマンスがすでにホストの物理的限界に近づいおおり、これが実際に問題になっおいる堎合にのみ䜿甚する必芁がありたす。



ランタむム自動バキュヌムオプションはで構成されpostgresql.confたす。残念ながら、高負荷システムで機胜する䞇胜の゜リュヌションはありたせん。



テヌブルのストレヌゞオプション。倚くの堎合、デヌタベヌスでは、負荷のかなりの郚分が少数のテヌブルにのみかかりたす。テヌブルの自動真空蚭定をカスタマむズするこずは、システムに倧きな圱響を䞎える可胜性のあるVACUUMを手動で開始する必芁をなくすための優れた方法です。次のコマンド



を䜿甚しおテヌブルをカスタマむズできたす。



ALTER TABLE .. SET STORAGE_PARAMETER


フロヌティングテヌブル膚匵



難易床䜎い。

朜圚的な圱響䞭〜高。



時間の経過ずずもに、テヌブルの過床の肥倧化による䞍適切なクリヌンアップポリシヌにより、システムパフォヌマンスが䜎䞋する可胜性がありたす。したがっお、autovacuumデヌモンを蚭定しお手動でVACUUMを起動しおも、問題は解決したせん。このような堎合、pg_repack拡匵機胜が圹に立ちたす。pg_repack



拡匵機胜を䜿甚しお、本番環境でテヌブルずむンデックスを再構築および再線成できたす。



デヌタのホットスポット



難易床高い。

朜圚的な圱響䜎-äž­-高。MySQLず



同様に、PostgreSQLはホットスポットを取り陀くためにデヌタストリヌムに䟝存しおおり、システムのアヌキテクチャを倉曎するこずさえありたす。 たず、次の点に泚意する必芁がありたす。







  • むンデックス。怜玢する列にむンデックスがあるこずを確認しおください。システムカタログずビュヌを䜿甚しお、ク゚リがむンデックスを䜿甚しおいるこずを監芖および確認できたす。pg_stat_statementおよびpgbadger拡匵機胜を䜿甚しお、ク゚リのパフォヌマンスを分析したす。
  • ヒヌプのみのタプルHOT。むンデックスが倚すぎる可胜性がありたす。未䜿甚のむンデックスを削陀するこずで、朜圚的な肥倧化を枛らし、テヌブルサむズを枛らすこずができたす。
  • . , , . , , , . , . , , .
  • . postgres. , .
  • . , . . , !








難易床䜎い。

朜圚的な圱響高い。



同じホストでアプリケヌションPHP、Java、Pythonずpostgresを実行するこずは避けおください。これらの蚀語のアプリケヌション、特にガベヌゞコレクタヌは倧量のRAMを消費する可胜性があるため、リ゜ヌスをめぐっおデヌタベヌスシステムずの競合が発生し、党䜓的なパフォヌマンスが䜎䞋するため、泚意しおください。



レプリケヌション



難易床䜎い。

朜圚的な圱響高い。



同期および非同期レプリケヌション。postgresの最近のバヌゞョンは、同期モヌドず非同期モヌドの䞡方で論理レプリケヌションずストリヌミングレプリケヌションをサポヌトしおいたす。デフォルトのレプリケヌションモヌドは非同期ですが、特に遅延が倧きいネットワヌクでは、同期レプリケヌションを䜿甚するこずの圱響を考慮する必芁がありたす。



サヌバヌ環境



最埌になりたしたが、これはホスト容量の単玔な増加です。各リ゜ヌスがPostgreSQLのパフォヌマンスにどのように圱響するかを芋おみたしょう。



  • . , . . , , -.
  • . , , . .
  • . .

    • -, ,
  • .



    • . , .
    • .
    • . .
    • WAL-, , , . , (log shipping) , , .












:






All Articles