私はDjangoアプリケーションのまれなハングをデバッグしようとしています。これまでのところ、私は問題を特定することができなかった、それが生産の一日に一回程度起こるとGunicornはメッセージでプロセスを再起動します。GunicornタイムアウトでDjangoスタックトレースをダンプします
[CRITICAL] WORKER TIMEOUT
プロセスのスタックトレースをダンプするためにはDjangoやGunicornを設定する方法はありますそれは再開されますか?
私はDjangoアプリケーションのまれなハングをデバッグしようとしています。これまでのところ、私は問題を特定することができなかった、それが生産の一日に一回程度起こるとGunicornはメッセージでプロセスを再起動します。GunicornタイムアウトでDjangoスタックトレースをダンプします
[CRITICAL] WORKER TIMEOUT
プロセスのスタックトレースをダンプするためにはDjangoやGunicornを設定する方法はありますそれは再開されますか?
Gunicornログをより冗長に設定してください。おそらくログに多くの光を当てるかもしれないINFO
またはDEBUG
に設定してください。
また、遅い要求を記録するDog Slowもご覧ください。 https://pypi.python.org/pypi/dogslow。
一般的なロギングには、Sentry:https://www.getsentry.com/welcome/を使用してください。
ランダム質問、その時点で実行しているサーバー上の任意のcron、バックアップ、そのようなもの?
タイムアウトは要求タイムアウトではありません。それは労働者の生活チェックとしての意味です。同期ワーカーの場合、ワーカーはリクエストを処理する以外に何もできないため、リクエストタイムアウトとして機能します。非同期ワーカーは、長時間実行されているリクエストを処理している最中でもハートビートするので、ワーカーがブロック/フリーズしない限り、殺されません。
Gunicornにはworker_abortという機能があります(以下のgunicornのドキュメントを参照)。
def worker_abort(worker):
worker.log.info("worker received abort signal")
import threading, sys, traceback
id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), threadId))
stack = traceback.extract_stack(stack)
for filename, lineno, name, line in stack:
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
worker.log.debug("\n".join(code))
従業員がSIGABRT信号を受信したときに呼び出されます。この呼び出しは通常、タイムアウト時に発生します。呼び出し可能オブジェクトは、初期化されたWorkerに対して1つのインスタンス変数を受け入れる必要があります。
出典:
http://docs.gunicorn.org/en/stable/settings.html、https://github.com/benoitc/gunicorn/issues/1493、https://github.com/benoitc/gunicorn/blob/master/examples/example_config.py
遅い犬は偉大に見えますが、私はGunicornタイムアウトより少し低いようにそのタイムアウトを設定し、ロックされたプロセスのトレースを取得することができます。ありがとう!これはHeroku上で実行されるので、重いバックグラウンドプロセスはありません。 –