16 GBのRAMを搭載した8コアのRHEL 6.3で実行されているPostgreSQL 9.2インスタンスがあります。サーバーはこのデータベース専用です。デフォルトのpostgresql.confはメモリ設定に関してかなり保守的であるため、Postgresがより多くのメモリを使用できるようにすることは良い考えだと思いました。驚いたことに、wiki.postgresql.org / wiki / Tuning_Your_PostgreSQL_Serverのアドバイスに従うと、実際に実行するすべてのクエリが大幅に遅くなりましたが、より複雑なクエリでは明らかに目立ちます。
pgtuneの実行も試してみました。これは、調整されたパラメーターを増やして次の推奨事項を提示しましたが、何も変わりませんでした。RAMサイズの1/4のshared_buffersが推奨されますが、これは他のアドバイス(特にPG wiki)に沿っているようです。
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
設定を変更した後(を使用してreindex database
)データベース全体のインデックスを再作成しようとしましたが、それも役に立ちませんでした。shared_buffersとwork_memをいじりました。非常に控えめなデフォルト値(128k / 1MB)から徐々に変更すると、パフォーマンスが徐々に低下します。
私は走ったEXPLAIN (ANALYZE,BUFFERS)
いくつかのクエリにし、犯人はハッシュが大幅に遅くなりましょうということのようです。理由は明らかではありません。
特定の例を挙げると、次のクエリがあります。デフォルト構成で約2100ミリ秒、バッファーサイズを増やした構成で約3300ミリ秒で実行されます。
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
上記のクエリの場合:
- デフォルトのバッファー:http : //explain.depesz.com/s/xaHJ
- より大きなバッファ:http : //explain.depesz.com/s/Plk
問題は、バッファサイズを増やすとパフォーマンスが低下するのはなぜですか?マシンのメモリが不足していません。OSの共有メモリが(shmmax
およびshmall
)の値が非常に大きな値に設定されている場合の割り当ては、問題になりません。Postgresログにもエラーが記録されていません。私はデフォルト設定でautovacuumを実行していますが、それとは何の関係もないと思います。すべてのクエリは、構成が変更された(PGが再起動された)だけで、同じマシンで数秒間隔で実行されました。
編集:特に興味深い事実を見つけました。2010年半ばのiMac(OSX 10.7.5)でPostgres 9.2.1と16GB RAMを使用して同じテストを実行しても、スローダウンは発生しません。具体的には:
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
サーバー上でまったく同じデータを使用してまったく同じクエリ(上記のクエリ)を実行すると、work_mem = 1MBで2100ミリ秒、96 MBで3200ミリ秒になります。
MacにはSSDが搭載されているため、当然ながら高速ですが、期待どおりの動作を示します。
pgsql-performanceに関するフォローアップの議論も参照してください。