web-dev-qa-db-ja.com

Postgres DISK IO非常に高いです。すぐに減らすにはどうしたらいいですか?

私が使用しているものよりも高速なディスクが役立つことはわかっていますが、これを挿入するのに時間がかかり、いくつかの緊急対策を使用してディスクIOを減らしようとしています。 atopはDSKの使用状況をほぼ常に赤字で報告しています。これはpostgres 8.3用です。

サーバーには16GBのRAMがあり、完全には利用されていませんが、共有バッファー設定は24MBです。私が最初に考えたのは、データベースにできるだけ多くのRAMを提供することでしたが、その方法がわかりません(これは専用のデータベースサーバーです)。

再起動を必要としないソリューションが望ましいですが、この時点で取得できるものを使用します。

ありがとう!

13
Harel

24MBのshared_buffers設定は控えめなデフォルトですが、16GBのRAMが利用可能な専用データベースの場合はかなり高くする必要があります。しかし、はい、再起動する必要がありますサイズを変更するサーバー http://wiki.postgresql.org/wiki/Performance_Optimization は、パフォーマンス構成ガイドラインを開始するのに適した場所です。shared_buffersを4GBまたは6GBに設定することは、より合理的に思えます。

Linuxでは、kernel.shmmax sysctl設定を(/etc/sysctl.confで、または/ proc/sys/kernel/shmmaxと書くだけで)調整して、この共有メモリのブロックを割り当てる必要があることに注意してください。要求された量を指定するエラーが発生しない場合は、kernel.shmmaxをそれよりも高く設定する必要があります。

大量のメモリがあるため、デフォルトのwork_memを高く設定することも検討してください。これにより、並べ替えやハッシュ(グループ/順序/個別など)が一時ファイルを使用するのではなく、メモリで機能する傾向があります。これを行うためにサーバーを再起動する必要はありません。設定ファイルを更新してサービスをリロードするだけで、newセッションが新しい設定を取得します。セッションのデフォルトのワークメモリは1MBです。一度に使用できる最大値をwork_mem * max_client_connectionsとして計算し、その影響を見積もることができます。

カーネルFS=レイヤーが多くのページをpostgresqlの共有バッファーの外のメモリにキャッシュしている可能性が高いことをプランナーに示すために、effective_cache_sizeを増やす必要もあります。

等々これがあなたが良いスタートを切るのを願っています。

12
araqnid

noatime でディスクを再マウントします

3
jamespo

ここで与えられた提案の他に、自動バキューム設定を確認することもできます。デフォルトでは、約50回の更新後にトリガーされます。データベースが大量の更新/挿入を実行している場合、これにより、大量のIOを生成する不必要なバキュームステートメントがトリガーされる可能性があります。

2
jishi

通常の操作中に最大I/Oスループットに非常に近いシステムではcheckpoint_completion_targetを増やして、チェックポイントからのI/O負荷を減らすことができます。これの欠点は、チェックポイントを延長するとリカバリ時間に影響することです。リカバリで使用するために、より多くのWALセグメントを保持する必要があるためです。

詳細はこちら こちら

1
Christian

Postgresqlのdiskioが非常に高い場合は、実行中のステートメント、特に「ディスク上のソート」を実行しているステートメントを確認し、適切なインデックスを設定する必要があります。

「Postgresql Performance Tuning」をググると、どこから始めればよいかがわかります。

0
Thomas Berger