大量のRAMに対するpostgresqlのチューニング


29

(ハードウェアの点で)2つの同一のサーバーがあり、どちらもWindows Server 2008 r2の標準インストールであり、最小限のソフトウェアがインストールされています(基本的には私のコードとjvmなどの必要なもの)。

1台のサーバーで、2台目のサーバーpostgresql 9.1でSQL Server 2005を実行しています。これら2台のサーバーでのパフォーマンスの違いは驚異的であり、上司への最初の「SQLサーバーライセンスの代金を支払う代わりにpostgresqlを使用しましょう」と後悔しています。同じコマンドで30秒と15分という違いを話しているのですが、これはこの1つのコマンドだけでなく、私が投げるクエリやコマンドでもあります。両方ともほぼ同じデータを持ち(レコードは異なる順序で挿入されました)、両方のデータベースはまったく同じ構造/インデックスなどを持っています。

しかし、それは単なるパフォーマンスチューニングの問題だと思います。実は、SQLサーバーはサーバー上で32ギガバイトすべてのRAMを使用していますが、postgreslは何も使用しておらず、ギグよりも確実に少ないのですが、実際には詳細に把握していません。

postgresqlで20ギガバイト以上のRAMを使用するにはどうすればよいですか?これらのサーバーはこのデータベース専用に構築されているため、データベースとサポートプロセスで使用されていないラムは無駄になります。


4
初期チューニングに何か変更しましたか?ステップ1: SET effective_cache_size=18G;(デフォルトの設定は極めて低い)ところで:これは64ビットマシン(なしPTE)であると仮定

1
あなたは本当に多くを助けるのに十分な私たちを与えていません。「遅い」以外は、データセット、アクセス方法、一般的に実行が遅いクエリの種類、サーバーのチューニング(および場合によってはミスチューニング)のためにすでに行ったことをあまり知りません。ヘック、たくさんのコアとメモリチャネルを備えたLinuxマシンでは、postgresqlをインストールするずっと前に、パフォーマンスが悪くなることがあります。CPUまたはIOバウンドですか?既定以外の設定は既にありますか?どのようなクエリが遅いですか?
スコットマーロウ

2
Postgresは、あなたが言うように「ラムを使用する」ことはありません。キャッシュの大部分はOSファイルシステムのページキャッシュに依存しているため、postgresを実行しているシステムでRAMの使用状況を見ると、通常、OSバッファー/キャッシュで使用されているGBが多く、それぞれ数十MB。
-dbenhur

1
このリンクを参照してください: tekadempiere.blogspot.ae/2014/09/… そして、ここからリソースベースのconf値を見つけてください:pgtune.leopard.in.ua
Sajeev

関連する質問、おそらく興味深い:stackoverflow.com/questions/47311485/…–
mountainclimber

回答:


41

を介して初期化される調整可能な定数は多数ありますpostgres.conf。最も重要なものは次のとおりです。

  • max_connections:同時セッションの数
  • work_mem :ハッシュテーブルなどの中間結果とソートに使用されるメモリの最大量
  • shared_buffers 「ピン留めされた」バッファスペース専用のメモリ量。
  • effective_cache_size OSのLRUバッファによって使用されると想定されるメモリの量。
  • random_page_cost :ディスクシークの相対コストの見積もり。

max_connections必要以上に高く設定しないでください。接続がアイドル状態でもリソースにコストがかかります。ほとんどの場合、接続は外部で待機するよりも内部で待機する方が時間がかかります。(並行性の代償で)経験則としては、「スピンドルの数+プロセッサの数+ X」という素晴らしい経験則があります。

work_memトリッキーです。これはすべてのサブクエリに適用できるため、5のクエリのHASHJOINSコストは5 *になりwork_memます。また、最悪のシナリオでは、複数のセッションがこの量を消費することも考えてください(これもmax_connections低く抑える理由です)。

shared_buffers(私見)過大評価されています。通常、利用可能なすべての「空き」メモリの約1/4 ... 1/2に設定することをお勧めしますが、私はそれを低く保ち、effective_cache_size利用可能なすべての「空き」メモリに設定する傾向があります。

random_page_costディスク上のシーク+読み取りのコストです。これは、1に相対的sequential_disk_costです。デフォルトの(4)random_page_costは、最新のマシンおよびネットワークストレージに対して高すぎる値に設定されており、通常は2〜1.xに下げることができます。SSDでは、シークはほぼ無料であるため、youldは1.0に設定します。


優れた!effective_cache_sizeの重要性を見たことはなく、常にshared_buffersだけにだまされています。これは本当に大きな違いをもたらしました。pgtuneも実行し、shard_buffersには20GBの96を使用することをお勧めしますが、effective_cache_sizeには64GBを使用することをお勧めします。ありがとう!

1
FWIW、これらとPostgresのドキュメントで提案されている他の設定を調べ、サーバーの分析を行いました
mlissner

答えてくれてありがとう。デフォルトが100で、サーバーRAMが32GB(専用postgresサーバー)のwork_mem場合、推奨されるものを尋ねることはできmax_connectionsますか?私は毎日のクエリに基づいて自分でこれを調整する必要があることを知っていました。「1つのサイズがすべての回答に適合する」値(または開始点の値)を教えてもらえないかと思っています。50MBは大きすぎますか?どうもありがとう。
sgon00

これは、マシンの一般的な同時アクティビティに依存します。50M(10..20Mの上)を必要とする100セッションはそれぞれ適合します。または、そうではないかもしれません。印象を得るには、vmstatまたはtopを監視します。さらに、クエリ(およびその他)に依存します。計画を見てください。
wildplasser

@wildplasserは迅速な返信をありがとうございました。面白いウェブサイトpgtune.leopard.in.uaを見つけました 。その提案から出発点として40MBを使用し、それに基づいて調整すると思います。乾杯。
sgon00

20

PostgreSQL構成の調整に役立つpgtuneの使用を検討してください。PgFoundryから:

pgtuneはwimpyのデフォルトのpostgresql.confを取得し、データベースサーバーを展開して、展開先のハードウェアと同じくらい強力にします

PostgreSQLのデフォルト設定は非常に保守的であり、このツールはこの正確な状況を支援することを目的としています。ドキュメントは簡単に読むことができ、ツールの使用は非常に簡単です。

pgtuneの正確な提案を使用する必要がないことに注意してください。設定を再生し、confファイルに加えられた変更を監視することで、PostgreSQLの設定と、手動で設定を調整する方法について理解を深めることができます。


8
pgtuneの最後の更新は2009年で、5年前であり、まだ数えられています。9.1-9.2-9.3シリーズでまだ有効かどうか疑問に思っています。
ソリン14

9
pgtuneが利用可能になりましたオンライン
Alfabravo

3

すべてのクエリまたはコマンドがゆっくり実行されている場合、私はそれを疑います:

  • 実行するクエリごとにデータベースに接続します。
  • 何らかの認証方法を設定しましたが、これは機能せず、この特定の認証方法がタイムアウトするまでクエリを停止します。

次のようなクエリの実行にかかる時間を教えてくださいselect version()。インスタント(私のワークステーションでは0,16ms)でなければなりません。


2

すべてのクエリが非常に遅い場合、サーバーまたは何かで何かがひどく間違っています。私の経験では、各データベースには他のデータベースよりも優れている点がいくつかありますが、パフォーマンスに関してはpgsqlはmssqlサーバーと同じ領域に簡単にあります。

それでは、どのOSでpgsqlを実行していますか?どんなハードウェア?すでにどの設定を変更しましたか?データセットの大きさは?質の悪いクエリとExplain分析の出力の例は次のとおりです(次のようにクエリを実行します。

分析選択...クエリの残りをここで説明...;

出力をhttp://explain.depesz.com/に投稿し、リンクをここに投稿します。


1
はい、すべてのクエリ/コマンドはゆっくり実行され、はい、「何か」はひどく間違っているので、私の質問です。問題は、mssqlがサーバー上で使用可能なRAMをフルに使用しているため(大量のキャッシュ)、psqlはそうではないことです。コメントとアドバイスを感謝しますが、私の質問の大部分と件名自体を見逃してしまったに違いありません... psqlが利用可能なRAMを利用する方法を知りたいだけです。現在...他の人がリストされているいくつかの提案をしよう
user85116

1
RAMの使用は問題ではありません。Postgresqlは、ほとんどのキャッシングをOSに依存しています。したがって、すべてのRAMを使用する必要はありません。繰り返しますが、あなたは私の要点の多くを逃しました。あなたは私たちにあなたを助けるために貴重な少しを与えています。私は生涯5000 TPSのpostgresqlクラスターを運転しています。あなたは私のアドバイスに従うか、pgsqlがどのように機能し、議論するかをあなたが知っていると考え続けることができます。
スコットマーロウ

@ user85116、スコット、聞いてください。スーパーレイテンシに依存するMySQLのワークフローが既にあるため、現在MySQLは64GBのRAMを使用してクエリを高速に実行していますが、マテリアライズドビューだけで2​​G Postgresでも同じことができます。すべてのデータベースをRAMにキャッシュしても問題は解決しませんが、目に見えにくくなります。DB構造に同じ問題がある場合、Postgresはそれを修正したり非表示にしたりしません。
kworr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.