2013-03-15 19 views
5

我試圖調試Django應用程序的罕見掛起。到目前爲止,我沒能找出問題,它發生大約每天一次的生產和Gunicorn重新啓動過程與消息:在Gunicorn超時轉儲Django堆棧跟蹤

[CRITICAL] WORKER TIMEOUT 

是否有配置的Django或Gunicorn轉儲程序的堆棧跟蹤的方式這是重新啓動?

回答

5

嘗試設置您的Gunicorn日誌更加冗長,可能將其設置爲INFODEBUG,這可能會在日誌中留下更多的光線。

你也可以看看Dog Slow,它會記錄緩慢的請求。 https://pypi.python.org/pypi/dogslow

對於一般日誌記錄勝利,請嘗試使用Sentry:https://www.getsentry.com/welcome/

隨機問題,在當時運行的服務器上的任何cron,備份,那種東西?

+0

狗慢看起來不錯,我可以設置它的超時時間比Gunicorn超時低一點,並得到一個鎖定過程的痕跡。謝謝!這在Heroku上運行,所以不應該有任何沉重的後臺進程。 – 2013-03-17 07:06:44

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的一個實例變量。

來源:

http://docs.gunicorn.org/en/stable/settings.htmlhttps://github.com/benoitc/gunicorn/issues/1493https://github.com/benoitc/gunicorn/blob/master/examples/example_config.py