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明示的な状態 それはずっと速いはずです。
何かご意見は?
ブラッド、あなたに知らせるためだけに。私は非常によく似た質問をかなり深く見てきました。
関連質問: 行数の少ない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
回答としてこれを書いてすみませんが、コメントリンクが見つかりませんでした。おそらく既にコメントが多すぎるためです。
考慮すべきいくつかの代替アプローチ:
前者は「クリーンルーム」アプローチであり、後者は、テストデータがデータベースに長期間保持されることを意味します。オフライン削除での「ダーティー」アプローチは、約20,000のテストを含むテストスイートに使用しているものです。はい、開発データベースに「余分な」テストデータがあるために時々問題が発生することがあります。しかし、この「汚れ」がバグを見つけて修正するのに役立つことがあります。「乱雑」は、クリーンルームのアプローチでは決して実現できない方法で、現実世界の状況をよりよくシミュレートするためです。
私は最近、同様の問題に遭遇しました、すなわち:
:deletion
に変更すると、最大10倍の改善が得られました。速度低下の根本的な原因は、データベースストレージに使用されるジャーナリング(ext4)を備えたファイルシステムでした。 TRUNCATE操作中、ジャーナリングデーモン(jbd2)はディスクの〜90%を使用していましたIO容量。これがバグか、Edgeケースか、これらの状況で実際に通常の動作かはわかりません。しかし、TRUNCATEがDELETEよりはるかに遅い理由を説明します-大量のディスク書き込みを生成しました。実際にDELETEを使用したくないので、fsync=off
を設定することに頼り、この問題を軽減するのに十分でしたこの場合重要)。