PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

Ilya Kosmodemyansky による 2015 幎のレポヌト「PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング」の転写

免責事項: このレポヌトの日付は 2015 幎 4 月であるこずに泚意しおください。9.4 幎以䞊が経過し、かなりの時間が経過しおいたす。 レポヌトで説明されおいるバヌゞョン 4 はサポヌトされなくなりたした。 過去 5 幎間で、PostgreSQL の 15 ぀の新しいリリヌスがリリヌスされ、Linux カヌネルの XNUMX バヌゞョンがリリヌスされたした。 これらの郚分を曞き盎すず、別のレポヌトが䜜成されるこずになりたす。 ただし、ここでは、今日でも重芁な PostgreSQL 甚の基本的な Linux チュヌニングに぀いお考えたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ


私の名前はむリダ・コスモデミャンスキヌです。 私は PostgreSQL コンサルティングで働いおいたす。 ここで、デヌタベヌス党般ず特に PostgreSQL に関連しお Linux をどうするかに぀いお少し話したす。原理は非垞に䌌おいるからです。

䜕を話したしょうか PostgreSQL ず通信する堎合は、ある皋床は UNIX 管理者である必芁がありたす。 それはどういう意味ですか Oracle ず PostgreSQL を比范するず、Oracle では 80% が DBA デヌタベヌス管理者、20% が Linux 管理者である必芁がありたす。

PostgreSQL の堎合はもう少し耇雑です。 PostgreSQL を䜿甚するには、Linux がどのように動䜜するかをより深く理解する必芁がありたす。 同時に、機関車の少し埌ろを走りたす。最近はすべおが非垞にうたく曎新されおいるためです。 そしお、新しいカヌネルがリリヌスされ、新しい機胜が登堎し、パフォヌマンスが向䞊したす。

なぜ Linux に぀いお話しおいるのでしょうか? それは、私たちが Linux カンファレンス Peter に参加しおいるからではありたせん。珟代の状況においお、デヌタベヌス党般、特に PostgreSQL を䜿甚するのに最も正圓なオペレヌティング システムの XNUMX ぀が Linux であるからです。 残念なこずに、FreeBSD は非垞に奇劙な方向に発展しおいるからです。 そしお、パフォヌマンスや他の倚くのこずの䞡方で問題が発生するでしょう。 Windows 䞊の PostgreSQL のパフォヌマンスは、通垞、Windows には UNIX ず同じ共有メモリがないずいう事実に基づく別の深刻な問題ですが、PostgreSQL はマルチプロセス システムであるため、すべおこれに関係しおいたす。

そしお、誰もが゜ラリスのような゚キゟチックにはあたり興味がないず思うので、行きたしょう。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

最新の Linux ディストリビュヌションには、カヌネルの構築方法に応じお 1 を超える syctl オプションがありたす。 同時に、さたざたなナットに泚目するず、さたざたな方法で䜕かを調敎するこずができたす。 それらをマりントする方法に぀いおは、ファむル システム パラメヌタヌがありたす。 BIOS で䜕を有効にするか、ハヌドりェアの構成方法など、起動方法に関する質問がある堎合は、

これは、XNUMX ぀の短いレポヌトではなく、数日かけお議論できる非垞に倧ボリュヌムですが、ここでは重芁なこずに焊点を圓おたす。぀たり、Linux でのデヌタベヌスの適切な䜿甚を確実に劚げるレヌキを回避する方法です。修正しないでください。 同時に、重芁な点は、倚くのデフォルト パラメヌタヌがデヌタベヌスにずっお正しい蚭定に含たれおいないずいうこずです。 ぀たり、デフォルトでは、うたく動䜜しないか、たったく動䜜したせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

Linux にはどのような埓来のチュヌニング タヌゲットがありたすか? 皆さんは Linux の管理を扱っおいるので、タヌゲットが䜕かに぀いおは特に説明する必芁はないず思いたす。

以䞋を調敎できたす。

  • CPU。
  • メモリ。
  • ストレヌゞ。
  • 他の。 これに぀いおは最埌に軜食をずりながらお話したす。 たずえば、省゚ネ ポリシヌなどのパラメヌタでさえ、非垞に予枬䞍可胜で、あたり快適ずは蚀えない圢でパフォヌマンスに圱響を䞎える可胜性がありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

PostgreSQL ずデヌタベヌス党般の詳现は䜕ですか? 問題は、個々のナットを埮調敎しおもパフォヌマンスが倧幅に向䞊したこずを確認できないこずです。

確かにそのようなガゞェットはありたすが、デヌタベヌスは耇雑です。 サヌバヌが持぀すべおのリ゜ヌスず察話し、最倧限に察話するこずを奜みたす。 ホスト OS の䜿甚方法に関する Oracle の珟圚の掚奚事項を芋るず、それはモンゎルの宇宙飛行士に぀いおのゞョヌクのようなものになるでしょう - 犬に逌を䞎えお䜕も觊らないでください。 デヌタベヌスにすべおのリ゜ヌスを䞎えたしょう。デヌタベヌス自䜓がすべおを敎理したす。

原則ずしお、状況はある皋床たで PostgreSQL ずたったく同じです。 違いは、デヌタベヌスがただすべおのリ゜ヌスを自分自身で取埗できないこずです。぀たり、Linux レベルのどこかで自分ですべおを敎理する必芁がありたす。

䞻なアむデアは、単䞀のタヌゲット (メモリ、CPU など) を遞択しおチュヌニングを開始するのではなく、ワヌクロヌドを分析し、優れたプログラマヌが䜜成した負荷をできるだけ軜枛しおスルヌプットを向䞊させるこずです。ナヌザヌを含む私たちにずっおも。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

これが䜕であるかを説明するための写真です。 Linux OS バッファ、共有メモリ、PostgreSQL 共有バッファがありたす。 Oracle ずは異なり、PostgreSQL はカヌネル バッファを介しおのみ盎接動䜜したす。぀たり、ディスクからのペヌゞが共有メモリに入るには、たったく同じ状況でカヌネル バッファを通過しお戻る必芁がありたす。

ディスクはこのシステムの䞋に存圚したす。 これを円盀ずしお描きたした。 実際には、RAID コントロヌラヌなどが存圚する可胜性がありたす。

そしお、この入出力は䜕らかの圢でこの問題を通じお起こりたす。

PostgreSQL は叀兞的なデヌタベヌスです。 䞭にペヌゞがありたす。 すべおの入出力はペヌゞを䜿甚しお行われたす。 ペヌゞを䜿甚しおブロックをメモリに䞊げおいたす。 そしお、䜕も起こらなければ、単にそれらを読み取るだけで、その埌埐々にこのキャッシュや共有バッファヌから消えおいき、最終的にはディスクに戻りたす。

どこかを眮き換えるず、ペヌゞ党䜓がダヌティずしおマヌクされたす。 ここではそれらを青でマヌクしたした。 これは、このペヌゞがブロック ストレヌゞず同期する必芁があるこずを意味したす。 ぀たり、ダヌティにしたずき、WAL に゚ントリが䜜成されたした。 そしお玠晎らしい瞬間に、チェックポむントず呌ばれる珟象が起こりたした。 そしお圌が到着したずいう情報がこのログに蚘録されおいたした。 これは、その時点でこれらの共有バッファヌにあったすべおのダヌティ ペヌゞが、カヌネル バッファヌを介しお fsync を䜿甚しおストレヌゞ ディスクず同期されたこずを意味したす。

なぜこれが行われるのでしょうか? 電圧が倱われた堎合でも、すべおのデヌタが倱われるずいう状況は発生したせんでした。 誰もが私たちに話した氞続蚘憶は、これたでのずころデヌタベヌス理論の䞭にありたす。これは明るい未来であり、もちろん私たちはそれを目指しおおり、それを気に入っおいたすが、今のずころ、それらはマむナス20幎で生きたす。 そしおもちろん、これらすべおを監芖する必芁がありたす。

スルヌプットを最倧化するタスクは、これらすべおの段階で埮調敎しお、すべおが迅速に前埌に進むようにするこずです。 共有メモリは基本的にペヌゞ キャッシュです。 PostgreSQL では、遞択ク゚リなどを送信するず、このデヌタがディスクから取埗されたす。 これらは最終的に共有バッファヌに眮かれたした。 したがっお、これをより適切に動䜜させるには、倧量のメモリが必芁です。

これらすべおが適切か぀迅速に機胜するためには、すべおの段階でオペレヌティング システムを正しく構成する必芁がありたす。 たた、バランスのずれたハヌドりェアを遞択しおください。どこかに䞍均衡があるず、倧量のメモリを䜜成できたすが、十分な速床で凊理できなくなるからです。

これらの各ポむントを芋おみたしょう。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

これらのペヌゞの行き来を高速化するには、次のこずを達成する必芁がありたす。

  • たず、メモリをより効率的に䜿甚する必芁がありたす。
  • 第 XNUMX に、メモリからペヌゞがディスクに移動するずきのこの移行がより効率的になるはずです。
  • そしお第䞉に、良奜なディスクが存圚する必芁がありたす。

サヌバヌに 512 GB の RAM があり、そのすべおがキャッシュなしの SATA ハヌド ドラむブに眮かれる堎合、デヌタベヌス サヌバヌ党䜓が単なるカボチャではなく、SATA むンタヌフェむスを備えたカボチャになりたす。 盎接遭遇するこずになりたす。 そしお䜕もあなたを救っおはくれたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

XNUMX ぀目の蚘憶に関する点ですが、人生を非垞に困難にする芁因が XNUMX ぀ありたす。

その最初のものはNUMAです。 NUMA はパフォヌマンスを向䞊させるために䜜られたものです。 ワヌクロヌドに応じお、さたざたなこずを最適化できたす。 たた、珟圚の新しい圢匏では、ペヌゞ キャッシュ共有バッファを集䞭的に䜿甚するデヌタベヌスなどのアプリケヌションにはあたり適しおいたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

䞀蚀で蚀えば。 NUMA に問題があるかどうかはどうすればわかりたすか? ある皮の䞍快な衝撃があり、突然䞀郚の CPU が過負荷になりたす。 同時に、PostgreSQL のク゚リを分析するず、類䌌したク゚リが存圚しないこずがわかりたす。 これらのク゚リは CPU をそれほど集䞭的に䜿甚するべきではありたせん。 これなら長く釣れたすね。 PostgreSQL 甚の NUMA の構成方法に぀いおは、最初から正しい掚奚事項を䜿甚する方が簡単です。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

本圓に䜕が起こっおいるのでしょうか NUMA は Non-Uniform Memory Access の略です。 ポむントは䜕ですか CPU があり、その隣にはロヌカル メモリがありたす。 そしお、このメモリ盞互接続は他の CPU からメモリをプルアップできたす。

走れば numactl --hardware、そうするずこのような倧きなシヌトが埗られたす。 ずりわけ、距離フィヌルドがありたす。 10〜20のような数字が衚瀺されたす。 これらの数倀は、このリモヌト メモリを取埗しおロヌカルで䜿甚するためのホップの数にすぎたせん。 原則的には良いアむデアです。 これにより、さたざたなワヌクロヌド䞋でパフォヌマンスが倧幅に高速化されたす。

ここで、XNUMX ぀の CPU が最初にそのロヌカル メモリを䜿甚しようずしおいお、次に䜕かのためにむンタヌコネクト経由で別のメモリを取埗しようずしおいるず想像しおください。 そしお、この CPU は PostgreSQL ペヌゞ キャッシュ党䜓を取埗したす。぀たり、数ギガバむトです。 通垞、CPU のモゞュヌル自䜓にはメモリがほずんどないため、垞に最悪のケヌスが発生したす。 そしお、サヌビスされるすべおのメモリは、これらの盞互接続を経由したす。 それは遅くお悲しいこずがわかりたす。 そしお、このノヌドにサヌビスを提䟛するプロセッサは垞に過負荷状態になりたす。 そしお、このメモリのアクセス時間は悪く、遅いです。 これをデヌタベヌスに䜿甚しおいる堎合、これは望たしくない状況です。

したがっお、デヌタベヌスにずっおより正しいオプションは、Linux オペレヌティング システムがそこで䜕が起こっおいるかをたったく認識しないこずです。 そのため、メモリにアクセスするのず同じようになりたす。

䜕故ですか それは逆であるべきだず思われるでしょう。 これは XNUMX ぀の単玔な理由で発生したす。それは、ペヌゞ キャッシュに倧量のメモリ (数十、数癟ギガバむト) が必芁であるずいうこずです。

そしお、これらすべおを割り圓おおそこにデヌタをキャッシュした堎合、キャッシュを䜿甚するこずで埗られる利益は、メモリぞのこのようなトリッキヌなアクセスによる利益よりも倧幅に倧きくなりたす。 したがっお、NUMA を䜿甚しおより効率的にメモリにアクセスするこずず比べお、比范にならないほどのメリットが埗られたす。

したがっお、明るい未来が到来し、デヌタベヌス自䜓がどの CPU で実行されおいるのか、どこから䜕かを取埗する必芁があるのか​​を把握できないたで、珟時点では XNUMX ぀のアプロヌチがありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

したがっお、正しいアプロヌチは、NUMA を完党に無効にするこずです。たずえば、再起動時などです。 ほずんどの堎合、賞金は桁違いに倧きいため、どちらが良いかずいう問題はたったく生じたせん。

別のオプションもありたす。 クラむアントがサポヌトを求めお私たちに来たずき、サヌバヌを再起動するのはクラむアントにずっお倧きな問題ずなるため、最初のクラむアントよりも頻繁にこのクラむアントを䜿甚したす。 圌はそこでビゞネスをしおいたす。 そしお、NUMA が原因で問題が発生したす。 したがっお、再起動よりも䟵襲性の䜎い方法で無効にしようずしたすが、無効になっおいるこずを確認するように泚意しおください。 経隓からわかるように、芪 PostgreSQL プロセスで NUMA を無効にするのは良いこずですが、それが機胜する必芁はたったくありたせん。 圌女が本圓にスむッチを切ったのかどうかを確認する必芁がありたす。

Robert Haas による良い投皿がありたす。 これは PostgreSQL コミッタヌの XNUMX 人です。 すべおの䜎レベルのモツの䞻芁な開発者の XNUMX 人。 この投皿のリンクをたどるず、NUMA が人々の生掻をいかに困難にしたかに぀いお、いく぀かの倚圩なストヌリヌが説明されおいたす。 デヌタベヌスが正垞に動䜜するためにサヌバヌ䞊で䜕を構成する必芁があるかに぀いお、システム管理者のチェックリストを調べおください。 これらの蚭定は曞き留めお確認する必芁がありたす。そうしないず、あたり良い結果が埗られたせん。

これはこれから説明するすべおの蚭定に適甚されるこずに泚意しおください。 ただし、通垞、デヌタベヌスはフォヌルト トレランスのためにマスタヌ/スレヌブ モヌドで収集されたす。 い぀か事故に遭っおスレヌブに切り替わり、スレヌブがマスタヌになっおしたうので、スレヌブ偎でこれらの蚭定を行うこずを忘れないでください。

緊急事態が発生したずき、すべおが非垞に悪く、電話が鳎り続け、䞊叞が倧きな棒を持っお走っおくるずき、確認するこずを考える時間はありたせん。 そしお、その結果は非垞に悲惚なものになる可胜性がありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

次のポむントは巚倧ペヌゞです。 巚倧なペヌゞを個別にテストするのは困難であり、これを実行できるベンチマヌクはありたすが、テストするこずに意味はありたせん。 Google に簡単にアクセスできたす。

ポむントは䜕ですか たずえば、30 GB 以䞊の倧量の RAM を搭茉した、それほど高䟡ではないサヌバヌを䜿甚しおいるずしたす。 巚倧なペヌゞは䜿甚したせん。 これは、メモリ䜿甚量に関しお確実にオヌバヌヘッドがあるこずを意味したす。 そしお、このオヌバヌヘッドは決しお快適なものではありたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

䜕故ですか どうしたの オペレヌティング システムはメモリを现かく分割しお割り圓おたす。 それはずおも䟿利です、歎史的にはそうなったのです。 さらに詳しく説明するず、OS は仮想アドレスを物理アドレスに倉換する必芁がありたす。 たた、このプロセスは最も単玔ではないため、OS はこの操䜜の結果を Translation Lookaside Buffer (TLB) にキャッシュしたす。

TLB はキャッシュであるため、この状況ではキャッシュに固有の問題がすべお発生したす。 たず、倧量の RAM があり、すべおが小さなチャンクに割り圓おられおいる堎合、このバッファは非垞に倧きくなりたす。 たた、キャッシュが倧きい堎合、キャッシュ内の怜玢は遅くなりたす。 オヌバヌヘッドは正垞であり、それ自䜓がスペヌスを占有したす。぀たり、RAM が䜕か間違ったものによっお消費されおいたす。 この時。

XNUMX ぀目は、このような状況でキャッシュが増倧するほど、キャッシュ ミスが発生する可胜性が高くなりたす。 そしお、このキャッシュの効率は、サむズが倧きくなるに぀れお急速に䜎䞋したす。 そこで、オペレヌティングシステムはシンプルなアプロヌチを考案したした。 Linuxでは叀くから䜿われおきたした。 それは少し前に FreeBSD に登堎したした。 しかし、私たちは Linux に぀いお話しおいたす。 これらは巚倧なペヌゞです。

ここで泚目すべきは、アむデアずしおのヒュヌゞ ペヌゞは圓初、Oracle や IBM を含むコミュニティによっお掚進されたものでした。぀たり、デヌタベヌス メヌカヌは、これがデヌタベヌスにも圹立぀ず匷く考えおいたした。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

そしお、これを PostgreSQL ずどのように連携させるこずができるでしょうか? たず、Linux カヌネルでヒュヌゞ ペヌゞを有効にする必芁がありたす。

次に、sysctl パラメヌタでそれらの数を明瀺的に指定する必芁がありたす。 ここの数字は叀いサヌバヌからのものです。 巚倧なペヌゞがそこに収たる共有バッファヌの数を蚈算できたす。

たた、サヌバヌ党䜓が PostgreSQL 専甚である堎合は、RAM の 25% を共有バッファに割り圓おるか、デヌタベヌスがこの 75% に確実に収たるず確信しおいる堎合は 75% を割り圓おるのが良い開始点です。 出発点 256。 64 GB の RAM がある堎合、それに応じお XNUMX GB の倧容量バッファがあるこずを考えおください。 この数倀をどの皋床に蚭定するかに぀いお、ある皋床の䜙裕を持っお抂算しおください。

バヌゞョン 9.2 より前 (私の蚘憶が間違っおいなければ、バヌゞョン 8.2 以降) は、サヌドパヌティのラむブラリを䜿甚しお PostgreSQL を巚倧なペヌゞに接続するこずができたした。 そしお、これは垞に行われるべきです。 たず、カヌネルが巚倧なペヌゞを正しく割り圓おるこずができる必芁がありたす。 そしお 5 番目に、それらず連携するアプリケヌションがそれらを䜿甚できるようにするためです。 ただそのように䜿われるわけではありたせん。 PostgreSQL はシステム XNUMX スタむルでメモリを割り圓おたため、これは libhugetlbfs を䜿甚しお実行できたす。これはラむブラリの完党名です。

9.3 では、メモリを操䜜する際の PostgreSQL のパフォヌマンスが向䞊し、システム 5 のメモリ割り圓お方法が廃止されたした。 誰もがずおも満足しおいたした。そうしないず、9.3 台のマシンで XNUMX ぀の PostgreSQL むンスタンスを実行しようずしおしたい、共有メモリが足りないず蚀われたした。 そしお、sysctlを修正する必芁があるず圌は蚀いたす。 そしお、ただ再起動する必芁があるようなsysctlがありたす。䞀般に、誰もが満足しおいたした。 しかし、mmap のメモリ割り圓おにより、巚倧ペヌゞの䜿甚が䞭断されたした。 ほずんどのクラむアントは倧芏暡な共有バッファを䜿甚しおいたす。 たた、XNUMX ではオヌバヌヘッドが適切な割合で蚈算されるようになったため、XNUMX に切り替えないこずを匷くお勧めしたす。

しかし、コミュニティはこの問題に泚目し、9.4 ではこのむベントを非垞にうたく䜜り盎したした。 9.4 では、try をオンたたはオフにできるパラメヌタが postgresql.conf に远加されたした。

詊しおみるのが最も安党なオプションです。 PostgreSQL が起動するず、共有メモリが割り圓おられるずきに、このメモリを巚倧ペヌゞから取埗しようずしたす。 それが機胜しない堎合は、通垞の遞択に戻りたす。 FreeBSD たたは Solaris をお持ちの堎合は、い぀でも安党に詊しおみるこずができたす。

オンの堎合、巚倧なペヌゞから遞択できない堎合は単に起動したせん。 ここでは、誰が、䜕がより優れおいるかに぀いおはすでに話されおいたす。 ただし、詊しおみたら、間違いの䜙地がたくさんあるため、本圓に必芁なものが匷調衚瀺されおいるかどうかを確認しおください。 珟圚、この機胜は Linux でのみ動䜜したす。

次に進む前に、もう 32 ぀小さな泚意事項を蚘茉したす。 透過的な巚倧ペヌゞはただ PostgreSQL に関するものではありたせん。 圌はそれらを正垞に䜿甚するこずができたせん。 たた、このようなワヌクロヌドに透過的ヒュヌゞ ペヌゞを䜿甚するず、倧芏暡な共有メモリが必芁な堎合、非垞に倧容量の堎合にのみ利点が埗られたす。 テラバむト芏暡のメモリがある堎合は、これが有効になる可胜性がありたす。 もっず日垞的なアプリケヌションに぀いお話しおいる堎合、マシンに 64、128、256、XNUMX GB のメモリがある堎合、通垞の巚倧ペヌゞは問題なく、単に透過を無効にしたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

そしお最埌の蚘憶に぀いおは、果物ずは盎接関係がありたせん。それは本圓にあなたの人生を台無しにする可胜性がありたす。 すべおのスルヌプットは、サヌバヌが垞にスワップしおいるずいう事実によっお倧きく圱響されたす。

そしお、これはさたざたな意味で非垞に䞍快なものずなるでしょう。 そしお䞻な問題は、最新のカヌネルの動䜜が叀い Linux カヌネルずは若干異なるこずです。 そしお、これを螏むのは非垞に䞍快です。なぜなら、スワップに関するある皮の䜜業に぀いお話すずき、それはOOMキラヌの時機を超えた到着で終わるからです。 そしお、OOM キラヌがタむムリヌに到着せず、PostgreSQL をドロップしたのは䞍快です。 これに぀いおは、最埌のナヌザヌたで誰もが知るこずになりたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

䜕が起こっおいたすか そこには倧量の RAM があり、すべおがうたく動䜜したす。 しかし、䜕らかの理由でサヌバヌがスワップでハングし、これが原因で速床が䜎䞋したす。 メモリがたくさんあるように芋えたすが、これが起こりたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

以前は、vm.swappiness をれロに蚭定する、぀たりスワップを無効にするこずをお勧めしたした。 以前は、32 GB の RAM ずそれに察応する共有バッファは膚倧な量だず思われおいたした。 亀換の䞻な目的は、萜ちた堎合にクラストを捚おる堎所を確保するこずです。 そしおそれはもはや特に満たされおいたせんでした。 それで、この皮をどうする぀もりですか これは、特にこのようなサむズのスワップが必芁な理由があたり明確ではないタスクです。

しかし、より新しい、぀たりカヌネルの第 XNUMX バヌゞョンでは、動䜜が倉わりたした。 そしお、スワップをれロに蚭定するず、぀たりスワップをオフにするず、たずえ RAM がいくらか残っおいたずしおも、遅かれ早かれ、OOM キラヌがやっお来お、最も集䞭的なコンシュヌマヌを殺すこずになりたす。 なぜなら、そのようなワヌクロヌドではただ少し残っおいるので、システムプロセスを特定するのではなく、それほど重芁ではないものを特定するために飛び出すだろうず圌は考えるからです。 このそれほど重芁ではないものは、共有メモリを集䞭的に消費するもの、぀たりポストマスタヌになりたす。 あずは拠点を埩旧しなくおも良いです。

したがっお、珟圚のデフォルトは、私が芚えおいる限り、ほずんどのディストリビュヌションは 6 前埌です。぀たり、メモリの残量に応じお、どの時点でスワップの䜿甚を開始する必芁がありたす。 珟圚、vm.swappiness = 1 を蚭定するこずをお勧めしたす。これは実際には無効にしたすが、予期せず到着しお党䜓を砎壊する OOM キラヌず同じ効果は埗られたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

次は䜕ですか デヌタベヌスのパフォヌマンスに぀いお話し、埐々にディスクに移行するず、誰もが頭を抱え始めたす。 なぜなら、ディスクは遅く、メモリは速いずいう真実は、子䟛の頃から誰もが知っおいるからです。 そしお、デヌタベヌスにディスク パフォヌマンスの問題が発生するこずは誰もが知っおいたす。

ディスクが遅いため、チェックポむントのスパむクに関連する䞻芁な PostgreSQL パフォヌマンス問題は発生したせん。 これは、メモリずディスクの垯域幅のバランスが取れおいないこずが原因であるず考えられたす。 ただし、堎所によっおはバランスが取れない堎合がありたす。 PostgreSQL が構成されおおらず、OS も構成されおおらず、ハヌドりェアも構成されおおらず、ハヌドりェアが正しくありたせん。 そしお、この問題は、すべおが想定通りに起こった堎合、぀たり、負荷がないか、蚭定ずハヌドりェアが適切に遞択されおいる堎合にのみ発生するわけではありたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

それは䜕ですか、たたどのように芋えたすか? 通垞、PostgreSQL を扱う人はこの問題に䜕床か関わったこずがあるでしょう。 説明したす。 先ほども述べたように、PostgreSQL は定期的にチェックポむントを䜜成しお、共有メモリ内のダヌティ ペヌゞをディスクにダンプしたす。 倧量の共有メモリがある堎合、チェックポむントは fsync でこれらのペヌゞをダンプするため、ディスクに集䞭的な圱響を及がし始めたす。 これはカヌネル バッファに到着し、fsync を䜿甚しおディスクに曞き蟌たれたす。 このビゞネスの量が倚い堎合、ディスクの䜿甚量が非垞に倚くなるずいう䞍快な圱響が芳察される可胜性がありたす。

ここに90枚の写真がありたす。 それが䜕なのか、これから説明しおいきたす。 これらは 90 ぀の時間盞関グラフです。 最初のグラフはディスク䜿甚率です。 こちらは珟時点でほが100に達しおおりたす。 物理ディスクでデヌタベヌス障害が発生し、RAID コントロヌラヌの䜿甚率が XNUMX% になっおいる堎合、これは悪い知らせです。 これは、もう少し進むず XNUMX に達し、I/O が停止するこずを意味したす。

ディスクアレむを䜿甚しおいる堎合は、少し話が異なりたす。 それは、構成方法、アレむの皮類などによっお異なりたす。

そしお䞊行しお、内郚 postgres ビュヌからのグラフがここで構成され、チェックポむントがどのように発生するかを瀺したす。 ここの緑色は、その時点で同期のためにこのチェックポむントに到着したバッファ (ダヌティ ペヌゞ) の数を瀺しおいたす。 そしお、これがここで知っおおくべき重芁なこずです。 ここには倧量のペヌゞがあり、ある時点でボヌドに到達したした。぀たり、曞き続けたした。ここでは、ディスク システムが明らかに非垞にビゞヌになっおいたす。 そしお、チェックポむントはディスクに非垞に匷い圱響を䞎えたす。 理想的には、状況は次のようになるはずです。぀たり、ここでは録音が少なくなりたす。 そしお、この状態が継続するように蚭定で修正するこずができたす。 ぀たり、リサむクルは小さいですが、どこかでここに䜕か曞いおいたす。

この問題を克服するには䜕をする必芁がありたすか? デヌタベヌスで IO を停止した堎合、リク゚ストを実行するために来たすべおのナヌザヌが埅機するこずになりたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

Linux の芳点から芋た堎合、適切なハヌドりェアを䜿甚し、正しく構成し、これらのチェックポむントの頻床を枛らし、時間の経過ずずもに盞互に分散するように PostgreSQL を正垞に構成した堎合、デフォルトの Debian パラメヌタに螏み蟌むこずになりたす。 ほずんどの Linux ディストリビュヌションでは、vm.dirty_ratio=20、vm.dirty_background_ratio=10 のようになりたす。

それはどういう意味ですか カヌネル 2.6 からはフラッシングデヌモンが XNUMX ぀出珟したした。 Pdglush は、誰がどれを䜿甚しおいるかに応じお、カヌネル バッファからのダヌティ ペヌゞのバックグラりンドでの砎棄ず、バックグラりむンドでの砎棄が圹に立たない堎合にどうしおもダヌティ ペヌゞを砎棄する必芁がある堎合に砎棄したす。

背景はい぀来るのですか サヌバヌ䞊で䜿甚可胜な合蚈 RAM の 10% がカヌネル バッファ内のダヌティ ペヌゞによっお占有されおいる堎合、特別なラむトオフ関数がバックグラりンドで呌び出されたす。 なぜ背景なのでしょうか パラメヌタずしお、消去するペヌゞ数が考慮されたす。 そしお、圌は N ペヌゞを曞き捚おたずしたす。 そしおしばらくの間、これは眠りに萜ちたす。 そしお圌女は再びやっお来お、さらにいく぀かのペヌゞをコピヌしたした。

これは非垞に単玔な話です。 ここでの問題は、プヌルの堎合ず同じで、氎が XNUMX ぀のパむプに泚ぎ蟌たれるず、別のパむプに流れ蟌みたす。 チェックポむントが到着し、砎棄するためにいく぀かのダヌティ ペヌゞを送信した堎合、埐々に党䜓がカヌネル バッファヌ pgflush から適切に解決されたす。

これらのダヌティ ペヌゞが蓄積し続けるず、最倧 20% たで蓄積されたす。その埌、電源が萜ちおすべおが悪くなるため、OS の優先事項はすべおをディスクに曞き蟌むこずです。 たずえば、このデヌタは倱われたす。

コツは䜕ですか 重芁なのは、珟代䞖界におけるこれらのパラメヌタは、マシン䞊の合蚈 RAM の 20% ず 10% であり、ディスク システムのスルヌプットずいう芳点から芋るず、たったく巚倧なものであるずいうこずです。

128 GB の RAM があるず想像しおください。 12,8 GB がディスク システムに到着したす。 そしお、そこにどんなキャッシュがあっおも、どんな配列があっおも、それらはそれほど長くは続きたせん。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

したがっお、RAID コントロヌラヌの機胜に基づいおこれらの数倀をすぐに調敎するこずをお勧めしたす。 私はすぐに、512 MB のキャッシュを備えたコントロヌラヌをここで掚奚したした。

すべおが非垞に単玔であるず考えられおいたす。 vm.dirty_background をバむト単䜍で指定できたす。 そしお、これらの蚭定は前の XNUMX ぀の蚭定をキャンセルしたす。 どちらかの比率がデフォルトであるか、バむトを持぀比率がアクティブ化されおいる堎合は、バむトを持぀比率が機胜したす。 しかし、私は DBA コンサルタントであり、さたざたなクラむアントず仕事をしおいるため、バむト単䜍であれば、バむト単䜍でストロヌを描くようにしおいたす。 優秀な管理者がサヌバヌにメモリを远加したり再起動したりしないず、数倀が倉わらないずいう保蚌は誰もしたせんでした。 すべおが保蚌されおそこに収たるように、これらの数倀を蚈算するだけです。

適合しない堎合はどうなりたすか? フラッシングは効果的に停止されるず曞きたしたが、実際にはこれは比喩です。 オペレヌティング システムには倧きな問題がありたす。倚くのダヌティ ペヌゞがあるため、クラむアントが生成する IO は実質的に停止されたす。぀たり、アプリケヌションはデヌタベヌスに SQL ク゚リを送信しに来お埅機しおいたす。 デヌタベヌスはチェックポむントによっお占有されおいるため、デヌタベヌスぞの入力/出力の優先床は最も䜎くなりたす。 そしお圌女がい぀終わるのかは完党に䞍明だ。 そしお、非バックグラりンド フラッシュを達成するず、すべおの IO がそのフラッシュによっお占有されるこずを意味したす。 そしおそれが終わるたで、あなたは䜕もしたせん。

ここにはさらに XNUMX ぀の重芁な点がありたすが、このレポヌトの範囲を超えおいたす。 これらの蚭定は、postgresql.conf の蚭定、぀たりチェックポむント蚭定ず䞀臎する必芁がありたす。 たた、ディスク システムが適切に構成されおいる必芁がありたす。 RAID 䞊にキャッシュがある堎合は、バッテリヌが必芁です。 人々はバッテリヌなしで、優れたキャッシュを備えた RAID を賌入したす。 RAID に SSD がある堎合、それはサヌバヌ甚のものである必芁があり、そこにコンデンサがなければなりたせん。 詳现なチェックリストは次のずおりです。 このリンクには、PostgreSQL でパフォヌマンス ディスクを構成する方法に関する私のレポヌトが含たれおいたす。 これらすべおのチェックリストがそこにありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

他に人生を非垞に困難にするものは䜕ですか これらは XNUMX ぀のパラメヌタです。 比范的新しいものです。 デフォルトでは、これらはさたざたなアプリケヌションに含めるこずができたす。 たた、誀っおオンにするず、同じように生掻が困難になる可胜性がありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

比范的新しいものがXNUMX぀ありたす。 それらはすでに第 XNUMX コアに登堎しおいたす。 これは、ナノ秒単䜍の sched_migration_cost ず、デフォルトで XNUMX である sched_autogroup_enabled です。

そしお、それらはどのようにあなたの人生を台無しにするのでしょうか sched_migration_cost ずは䜕ですか? Linux では、スケゞュヌラはプロセスをある CPU から別の CPU に移行できたす。 たた、ク゚リを実行する PostgreSQL に぀いおは、別の CPU ぞの移行はたったく䞍透明です。 オペレヌティング システムの芳点からは、openoffice ずタヌミナルの間でりィンドりを切り替える堎合、これは良いこずかもしれたせんが、 デヌタベヌスにずっお、これは非垞に悪いこずです。 したがっお、適切なポリシヌは、migration_cost を䜕らかの倧きな倀 (少なくずも数千ナノ秒) に蚭定するこずです。

これはスケゞュヌラヌにずっお䜕を意味したすか? この間、プロセスはただ高枩であるず考えられたす。 ぀たり、長時間䜕かを実行しおいる長時間実行トランザクションがある堎合、スケゞュヌラはこれを理解したす。 このタむムアりトが経過するたでは、このプロセスをどこにも移行する必芁はないず想定したす。 同時にプロセスが䜕かを実行した堎合、そのプロセスはどこにも移行されず、割り圓おられた CPU 䞊で静かに動䜜したす。 そしお結果は玠晎らしいです。

XNUMX 番目のポむントは自動グルヌプです。 最新のデヌタベヌスに関係のない特定のワヌクロヌドに察しおは、プロセスを起動元の仮想端末ごずにグルヌプ化するずいう良いアむデアがありたす。 これは䞀郚のタスクに䟿利です。 実際には、PostgreSQL は単䞀の端末から実行されるプリフォヌクを備えたマルチプロセス システムです。 ロック ラむタヌずチェックポむントがあり、すべおのクラむアント リク゚ストが CPU ごずに XNUMX ぀のスケゞュヌラにグルヌプ化されたす。 そしお圌らは、お互いに干枉しお圌をより長く占領し続けるために、圌が自由になるたで䞀斉にそこで埅ちたす。 このような負荷の堎合は党く䞍芁なのでオフにする必芁があるずいう話です。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

私の同僚の Alexey Lesovsky は、単玔な pgbench を䜿甚しおテストを行い、そこで、migration_cost を䞀桁増やし、autogroup をオフにしたした。 䞍良ハヌドりェアではその差はほが 10% でした。 postgres メヌリング リストにはディスカッションがあり、ク゚リ速床に察する同様の倉曎の結果が報告されおいたす。 50%に圱響を䞎えた。 そういう話は結構倚いです。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

最埌に、節電政策に぀いおです。 良いのは、ラップトップでも Linux を䜿甚できるようになったこずです。 そしお、おそらくバッテリヌをよく䜿いたす。 しかし、突然、これがサヌバヌでも発生する可胜性があるこずが刀明したした。

さらに、どこかのホスティング䌚瀟からサヌバヌを借りおいる堎合、「良い」ホスティング䌚瀟はあなたのパフォヌマンスが優れおいるかどうかを気にしたせん。 圌らの任務は、鉄をできるだけ効率的に利甚するこずです。 したがっお、デフォルトでは、オペレヌティング システムでラップトップの省電力モヌドを有効にするこずができたす。

デヌタベヌスの負荷が高いサヌバヌでこれを䜿甚する堎合は、acpi_cpufreq + permormance を遞択したす。 オンデマンドであっおも問題は発生したす。

Intel_pstate は少し異なるドラむバヌです。 そしお今では、埌からのものでより良く機胜するため、これが優先されたす。

したがっお、知事はパフォヌマンスにすぎたせん。 オンデマンド、省電力、その他すべおはあなた次第ではありたせん。

省電力を有効にするず、PostgreSQL の Explain 分析の結果が数桁異なる堎合がありたす。これは、実際にはデヌタベヌスの CPU がたったく予枬できない方法で実行されるためです。

これらの項目はデフォルトで含たれおいる堎合がありたす。 デフォルトでオンになっおいるかどうかを泚意深く確認しおください。 これは非垞に倧きな問題になる可胜性がありたす。

PostgreSQL のパフォヌマンスを向䞊させるための Linux チュヌニング。 むリダ・コスモデミャンスキヌ

そしお最埌に、この問題で日々前進しおいる、PosgreSQL-Consulting DBA チヌムの Max Boguk ず Alexey Lesovsky に感謝の意を衚したいず思いたす。 そしお、私たちはクラむアントにずっおすべおがうたくいくように、クラむアントのためにできる限りのこずをしようず努めおいたす。 航空安党に関する指瀺ず䌌おいたす。 ここにあるものはすべお血で曞かれおいたす。 これらのナッツはそれぞれ、䜕らかの問題の過皋で芋぀かりたす。 皆さんず共有できるこずを嬉しく思いたす。

質問

ありがずう たずえば、䌁業がコストを節玄しおデヌタベヌスずアプリケヌション ロゞックを XNUMX ぀のサヌバヌに配眮したい堎合、たたは䌁業が PostgreSQL をコンテナ内で実行するマむクロサヌビス アヌキテクチャの流行のトレンドに埓っおいる堎合です。 コツは䜕ですか Sysctl はカヌネル党䜓にグロヌバルに圱響したす。 sysctl がコンテナ䞊で個別に動䜜するように䜕らかの圢で仮想化されおいるずいう話は聞いたこずがありたせん。 cgroup だけがあり、そこにはコントロヌルの䞀郚しかありたせん。 これでどうやっお生きおいけたすか それずも、パフォヌマンスが必芁な堎合は、別のハヌドりェア サヌバヌで PostgreSQL を実行しお調敎したすか?

私たちはあなたの質問にXNUMX぀ほどの方法で答えたした。 調敎できるハヌドりェア サヌバヌの話ではない堎合は、安心しおください。これらの蚭定がなくおもすべおが正垞に動䜜したす。 これらの蚭定を行う必芁があるほどの負荷がある堎合は、これらの蚭定よりも早くアむアン サヌバヌにアクセスするこずになりたす。

䜕が問題ですか これが仮想マシンの堎合、たずえば、ほずんどの仮想マシンではディスクの遅延がたったく䞀貫しおいないなど、倚くの問題が発生する可胜性がありたす。 ディスクのスルヌプットが良奜であっおも、チェックポむント時たたは WAL ぞの曞き蟌み時に発生した平均スルヌプットに倧きな圱響を及がさない I/O トランザクションが XNUMX 回倱敗するず、デヌタベヌスはこれによっお倧きな圱響を受けたす。 そしお、これらの問題に遭遇する前に、これに気づくでしょう。

同じサヌバヌ䞊に NGINX がある堎合も、同じ問題が発生したす。 圌は共有された蚘憶を求めお戊うだろう。 そしお、ここで説明されおいる問題に遭遇するこずはありたせん。

しかし䞀方で、これらのパラメヌタの䞭には、䟝然ずしお重芁なものもありたす。 たずえば、それほどおかしくないように sysctl を䜿甚しお Dirty_ratio を蚭定したす。いずれにせよ、これは圹に立ちたす。 いずれにせよ、ディスクず察話するこずになりたす。 そしおそれは間違ったパタヌンに埓っおしたうでしょう。 これは通垞、私が瀺したパラメヌタのデフォルトです。 そしお、いずれにせよ、それらを倉曎する方が良いでしょう。

ただし、NUMA に問題がある可胜性がありたす。 たずえば、VmWare は、たったく逆の蚭定を䜿甚した NUMA で適切に動䜜したす。 そしおここで、鉄補サヌバヌか非鉄補サヌバヌかを遞択する必芁がありたす。

Amazon AWS に関する質問がありたす。 事前に構成されたむメヌゞがありたす。 そのうちの XNUMX ぀は Amazon RDS ず呌ばれたす。 オペレヌティング システム甚のカスタム蚭定はありたすか?

蚭定はありたすが、別の蚭定です。 ここでは、デヌタベヌスがこれをどのように䜿甚するかずいう芳点からオペレヌティング システムを構成したす。 そしお、敎圢など、今どこに行くべきかを決定するパラメヌタヌがありたす。 ぀たり、非垞に倚くの資源が必芁なので、それを今すぐに食べおしたうのです。 この埌、Amazon RDS はこれらのリ゜ヌスを匷化し、そこでパフォヌマンスが䜎䞋したす。 人々がこの問題にどのように干枉し始めおいるかに぀いおは、個別の話がありたす。 堎合によっおは非垞に成功するこずさえありたす。 ただし、これはOSの蚭定ずは関係ありたせん。 クラりドをハッキングするようなものです。 それは別の話です。

Huge TLB ず比范しお、Transparent huge Page が効果がないのはなぜですか?

あげないで。 これはさたざたな方法で説明できたす。 しかし実際には、圌らはただそれを䞎えたせん。 PostgreSQLの歎史は䜕ですか? 起動時に、倧きな共有メモリが割り圓おられたす。 透明かどうかは党く関係ありたせん。 圌らが最初に目立぀ずいう事実がすべおを説明したす。 たた、倧量のメモリがあり、shared_memory セグメントを再構築する必芁がある堎合は、透過的なヒュヌゞ ペヌゞが関連したす。 PostgreSQL では、最初に巚倧なチャンクに割り圓おられるだけで、それだけで、その埌は特別なこずは䜕も起こりたせん。 もちろん䜿甚できたすが、䜕かを再割り圓おするずきにshared_memoryが砎損する可胜性がありたす。 PostgreSQL はこれに぀いお知りたせん。

出所 habr.com

コメントを远加したす