2016-03-30 18 views
3

ステージングサーバAWS上のt2.microインスタンスが絶えずダウンしていました。調べると、manage.py migrateを実行すると、CPU使用率が最大99%になることがわかりました。ローカルマシンで簡単に再現できました。我々はDjango 1.9postgresqlデータベースを実行しています。私は今何か間違っているのか、そういう意味であるのかは分かりません。プロジェクトには約18個のアプリケーションがありますが、migrate app_nameを実行しても同じ動作になります。 CPU使用量のスクリーンショットを添付してください。Djangoがあまりにも多くのCPUを消費 "migrate"

Staging server

また、私は移行機能をプロファイリング、ここグラフである:多くのモデルと多くのアプリを、より多くのアプリケーションを持ったときに、私は移行は、特別に、大量に消費すると信じて

enter image description here

+0

好奇心の邪魔をして、グラフをどのように生成しましたか? – JRodDynamite

+3

@JasonEstibeiro:私はこのライブラリを使用しました:https://github.com/jrfonseca/gprof2dot – Shubham

+2

私は本当に 'migrate'を定期的に実行している理由を知りたいと思います。デプロイメント後、必要な場合にのみ、 – Risadinha

答えて

3

migrateは定期的に実行していますか?プロジェクトが近づいてからプロダクション状態に入ると、実行するマイグレーションは多くありません。または、migrate --listに移行するものがないことが示されていても、migrateにかかる時間がかかることを意味しますか?

また、Postgresが何をしているのかを知るには、時間を含むクエリのログを設定する必要があります。 http://www.postgresql.org/docs/9.5/static/runtime-config-logging.html

explain analyze SQLコマンドを使用してこれらのクエリを実行します:

psql> EXPLAIN ANALYZE <complete query>; 

http://www.postgresql.org/docs/9.5/static/using-explain.html

は、あなたがさらに取得するexplainから取得する情報を提供する必要があるあなたは、クエリを実行しているだけ長くログインしてフィルタリングすることができます助けて。


EDIT:あなたが移行ファイルの多くを持っている場合にも

は、あなたがsquash migrationsに試みることができます。私はDjangoが1つ1つずつ自分自身で動作すると想像することができます。だから、お互いに依存して多くのファイルを持つ多くのアプリを持っている場合、何が起こるか想像することができます。 https://docs.djangoproject.com/en/1.9/topics/migrations/#squashing-migrations


EDIT 2:

答えにコメントから、この移動:

migrate --listはまた、多くのCPUを消費していますか?そうでない場合は、最初にそれを実行して、移行する必要が本当にあるかどうかを確認し、オープンマイグレーションを持つアプリでmigrateを実行するだけです。

私はこれが一番良いと思います。より詳細にプロファイルできる場合は、実際にDjangoコミュニティに助けを求めるかもしれません。 Djangoのマイグレーションを調整して、あまり(実際は不要な)作業をする方法を見つけるための興味深いセットアップがあると思います。しかし、私は移行のコードがあまりにも多くないのでわかりません。 これはまた、私たちが話しているアプリの数と移行ファイルの数にもよる。 30個未満のアプリ(サードパーティーを含む)がある場合は、正常に動作するはずですが、何か間違っていると思います(IMHO!)。

また、サーバーのリソース使用状況が表示されていません。スローダウンがスワッピング/あまりにも多くのRAMの使用に起因するならば、(プロセスに)より多くのRAMを供給することによって、それを高めることができるかもしれません。

+0

はい、私は確かにこれを試してみます。 2番目の注記では、pythonのCPU使用率が高くなり、postgresqlではなくなります。それは純粋にDjango(Python)に関連する問題であり、データベースではないことを示唆することができます。 – Shubham

+0

確かに、もっと理にかなっています。最後に何をすべきかは関係ありません。 'migrate --list'もそのCPUを消費しますか?そうでない場合は、最初にそれを実行して、マイグレーションが必要なのかどうかを確認し、マイグレーションが開いているアプリでのみマイグレーションを実行することができます。 – Risadinha

+0

私たちはマイグレーションを押しつぶしてみましたが、運はありませんでした。私たちは 'compress'コマンドで同じ問題に直面しているので、大きなボックスが必要だと思っています。そうでなければ@Mounirが提案したようなことをする必要があります。 – Shubham

1

よりより多くのマイグレーションの複雑さ。

この後にマイグレーションとシャットダウンを実行する新しいインスタンスを開始することをお勧めします。この方法でWebサーバーに到達することができます。

+0

私は@mounirと完全に同意します。これは、単独で移行を実行する別のインスタンスを開始するか、または独自のインスタンスを実行しているポストログサーバーを使用することができます。 – pitaside

0

これは問題のステートメントを正確には扱いませんが、その一部です。私はdocumentation of AWS t2.microを調べ、T2.Microインスタンスは、適切な長い間隔の後に短い間隔(約1分)のCPU Burstを処理するように設計されていることがわかりました。 t2.microのドキュメント:

CPUクレジットは、1分間完全CPUコアのパフォーマンスを提供します。伝統的なAmazon EC2インスタンスタイプは固定のパフォーマンスを提供し、T2インスタンスはベースラインレベルのCPUパフォーマンスを提供し、そのベースラインレベルを上回る能力を提供します。ベースラインのパフォーマンスとバースト能力は、CPUクレジットによって管理されます。

実行中のマイグレーションは、CPUの100%を消費していても、この点では問題ありません。我々はさらに調査し、サーバ上で実行されているはずのcronsがあることを発見しました。

関連する問題