web-dev-qa-db-ja.com

大量のRAMに合わせてpostgresqlを調整する

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

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

しかし、それがパフォーマンスのチューニングの問題であることを願っています。実際のところ、SQLサーバーはサーバー上で32ギガバイトのRAMをすべて使用していますが、postgreslは何も使用していません。

Postgresqlで20 GB以上のRAMを使用するにはどうすればよいですか?これらのサーバーはこのデータベース用に特別に構築されたので、データベースとサポートプロセスで使用されていないRAMは無駄だと思います。

29
user85116

多くの調整可能な定数があり、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は(IMHO)過大評価されています。通常は、使用可能なすべての「空き」メモリの約1/4 ... 1/2に設定することをお勧めしますが、低くして、effective_cache_sizeをすべての使用可能な「空き」メモリに設定する傾向があります。

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

41
wildplasser

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

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

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

Pgtuneの正確な提案を使用する必要がないことに注意してください。その設定で遊んで、confファイルへの結果の変更を監視することで、PostgreSQLの構成とそれを手動で微調整する方法について理解を深めることができます。

20
Paul Bellora

すべてのクエリまたはコマンドの実行速度が遅い場合、次のように思われます。

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

select version()のようなクエリの実行にかかる時間を教えてください。インスタントである必要があります(私のワークステーションでは0、16ms)。

3
Tometzky

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

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

select select ... rest of query ...を分析してください;

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

2
Scott Marlowe