2013-03-15 37 views
5

私はDjangoアプリケーションのまれなハングをデバッグしようとしています。これまでのところ、私は問題を特定することができなかった、それが生産の一日に一回程度起こるとGunicornはメッセージでプロセスを再起動します。GunicornタイムアウトでDjangoスタックトレースをダンプします

[CRITICAL] WORKER TIMEOUT 

プロセスのスタックトレースをダンプするためにはDjangoやGunicornを設定する方法はありますそれは再開されますか?

答えて

5

Gunicornログをより冗長に設定してください。おそらくログに多くの光を当てるかもしれないINFOまたはDEBUGに設定してください。

また、遅い要求を記録するDog Slowもご覧ください。 https://pypi.python.org/pypi/dogslow

一般的なロギングには、Sentry:https://www.getsentry.com/welcome/を使用してください。

ランダム質問、その時点で実行しているサーバー上の任意のcron、バックアップ、そのようなもの?

+0

遅い犬は偉大に見えますが、私はGunicornタイムアウトより少し低いようにそのタイムアウトを設定し、ロックされたプロセスのトレースを取得することができます。ありがとう!これはHeroku上で実行されるので、重いバックグラウンドプロセスはありません。 –

0

タイムアウトは要求タイムアウトではありません。それは労働者の生活チェックとしての意味です。同期ワーカーの場合、ワーカーはリクエストを処理する以外に何もできないため、リクエストタイムアウトとして機能します。非同期ワーカーは、長時間実行されているリクエストを処理している最中でもハートビートするので、ワーカーがブロック/フリーズしない限り、殺されません。

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.htmlhttps://github.com/benoitc/gunicorn/issues/1493https://github.com/benoitc/gunicorn/blob/master/examples/example_config.py

関連する問題