web-dev-qa-db-ja.com

Postgresqlの切り捨て速度

DbサーバーとしてPostgresql 9.1.4を使用しています。私はテストスイートを高速化しようとしてきたので、何が起こっているのかを正確に確認するためにdbのプロファイルを少し見つめました。 database_cleaner を使用して、テストの終了時にテーブルを切り捨てます。はい、私はトランザクションがより速いことを知っています、特定の状況でそれらを使用できないので、私はそれについて心配しません。

私が心配しているのは、TRUNCATIONが非常に長くかかる(DELETEを使用するよりも長い)理由と、CIサーバーでさらに長い時間がかかる理由です。

現在、ローカル(Macbook Air上)では、完全なテストスイートに28分かかります。テーブルを切り捨てるたびにログをテーリングします...すなわち:

TRUNCATE TABLE table1, table2  -- ... etc

切り捨ての実行には1秒以上かかります。 CIサーバー(Ubuntu 10.04 LTS)のログをテーリングするには、テーブルの切り捨てに8秒かかり、ビルドには84分かかります。

:deletion戦略に切り替えたとき、ローカルビルドに20分かかり、CIサーバーは44分になりました。これは重要な違いであり、なぜそうなるのかについて本当に感動しています。 CIサーバー上の tunedthe DBには、16GBのシステムRAM、4GBのshared_buffers ...、およびSSDがあります。すべての良いもの。どのように可能ですか:

a。それはSO 2GBのRAMを搭載したMacbook Airよりもずっと遅い
b。postgresql docs明示的な状態 それはずっと速いはずです。

何かご意見は?

61
brad

ブラッド、あなたに知らせるためだけに。私は非常によく似た質問をかなり深く見てきました。

関連質問: 行数の少ない30個のテーブル-それらを空にしてアタッチされたシーケンスをリセットする最も速い方法を切り捨てますか?

この問題とこのプルリクエストもご覧ください。

https://github.com/bmabey/database_cleaner/issues/126

https://github.com/bmabey/database_cleaner/pull/127

また、このスレッド: http://archives.postgresql.org/pgsql-performance/2012-07/msg00047.php

回答としてこれを書いてすみませんが、コメントリンクが見つかりませんでした。おそらく既にコメントが多すぎるためです。

5

考慮すべきいくつかの代替アプローチ:

  • 静的な「フィクスチャ」データを含む空のデータベースを作成し、その中でテストを実行します。完了したら、データベースをドロップするだけで、高速になります。
  • テーブル名と主キーIDの列を含む「test_ids_to_delete」という新しいテーブルを作成します。削除ロジックを更新して、代わりにこのテーブルにID /テーブル名を挿入します。これは、削除を実行するよりもはるかに高速です。次に、「オフライン」で実行するスクリプトを作成して、テスト実行全体が終了した後、または夜間にデータを実際に削除します。

前者は「クリーンルーム」アプローチであり、後者は、テストデータがデータベースに長期間保持されることを意味します。オフライン削除での「ダーティー」アプローチは、約20,000のテストを含むテストスイートに使用しているものです。はい、開発データベースに「余分な」テストデータがあるために時々問題が発生することがあります。しかし、この「汚れ」がバグを見つけて修正するのに役立つことがあります。「乱雑」は、クリーンルームのアプローチでは決して実現できない方法で、現実世界の状況をよりよくシミュレートするためです。

0
Mark Stosberg

私は最近、同様の問題に遭遇しました、すなわち:

  1. DatabaseCleanerを使用したテストスイートの実行時間は、同等のハードウェアを備えた異なるシステム間で大きく異なり、
  2. DatabaseCleaner戦略を:deletionに変更すると、最大10倍の改善が得られました。

速度低下の根本的な原因は、データベースストレージに使用されるジャーナリング(ext4)を備えたファイルシステムでした。 TRUNCATE操作中、ジャーナリングデーモン(jbd2)はディスクの〜90%を使用していましたIO容量。これがバグか、Edgeケースか、これらの状況で実際に通常の動作かはわかりません。しかし、TRUNCATEがDELETEよりはるかに遅い理由を説明します-大量のディスク書き込みを生成しました。実際にDELETEを使用したくないので、fsync=offを設定することに頼り、この問題を軽減するのに十分でしたこの場合重要)。

0
Maksym Kammerer