tornado服務死鎖問題排查

python的tornado框架用到了io多路復用和協(xié)程的技術捞稿。由于tornado是單線程的異步框架点把,如果運行過程中產生了阻塞粉捻,后續(xù)的其它任務也就需要等待。在生產過程中雪侥,如果tornado進程產生了假死問題該如何排查呢碗殷?

問題描述

運營在使用后臺的時候,偶爾會反饋后臺報錯速缨,而且是大部分時候是好的锌妻,只是有時會出問題,刷新之后可能不會報錯旬牲,可能還會報錯从祝。

問題排查

1.nginx

我們在后端服務之前加了nginx代理,所以先查看nginx日志引谜,發(fā)現upstream到特定的進程時就會報錯,如果其它進程處理則不會報錯擎浴,而且報錯的錯誤是timeout

2.tornado

后端服務底層框架是tornado员咽。使用curl http://127.0.0.1:port 時超時。查看該進程對應的日志贮预,發(fā)現有一段時間沒有輸出日志了贝室。利用ls -l查看日志最后的更新時間,發(fā)現停留在1個小時之前仿吞。

3.strace

使用strace -p pid命令查看tornado進程當時的系統(tǒng)調用滑频,輸出fcntl(0x...,),并且一直停留在該系統(tǒng)調用唤冈。利用fcntl系統(tǒng)調用可以實現文件鎖的功能峡迷,所以大致可以確定該tornado進程產生了死鎖。

4.pyrasite

pyrasite是python進程注入的工具你虹。pip install pyrasite安裝之后绘搞,pyrasite-shell pid注入到tornado進程,這時進入到python shell的環(huán)境

5.sys與traceback

sys._current_frames()返回一個字典傅物,將每個線程的標識符映射到調用該函數時該線程中當前活動的最頂層堆棧幀夯辖。
這對于調試死鎖是最有用的:這個函數不需要死鎖線程的協(xié)作,只要這些線程的調用堆棧保持死鎖董饰,它們就會被凍結蒿褂。對于非死鎖線程返回的幀在調用代碼檢查幀時可能與該線程的當前活動沒有關系圆米。
traceback.extract_stack(stack)提取棧代碼,以及相關的文件路徑和行號等

def stacktraces(exclude=()):
    code = []
    current_frames = [(key, value) for key, value in sys._current_frames().items() if key not in exclude]
    for threadId, stack in current_frames:
        code.append("\n# ThreadID: %s" % threadId)
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
        print threadId
        print code

可執(zhí)行stacktraces打印tornado線程棧代碼

6.tornado log_stack

對5中打印的日志進行分析啄栓,確定是由于項目代碼在打印日志的時候娄帖,tornado進程接到到了打印block log的信號,由于python的logging日志模塊是通過thread lock保證線程安全的谴供,在項目代碼acquire了tread lock之后但是還未釋放時块茁,block log又嘗試去acquire thread lock,該調用是阻塞調用桂肌,由此產生了死鎖数焊。由此也可知在linux平臺python的thread lock是通過fcntl系統(tǒng)調用實現的。

后續(xù)

知道了問題產生的根本原因崎场,那么這個問題也就解決了一大半了佩耳。上述的問題該如何解決呢?可以留個言探討一下谭跨!

追加

之前用到的pyrasite-shell需要注入到python進程中并且還需要執(zhí)行代碼非常不友好干厚,在后續(xù)的工作中發(fā)現了另一個工具:pystack-debugger,安裝之后使用命令pystack pid即可打印出當時的堆棧信息螃宙,類似于java的jstack蛮瞄,對于排查python進程死鎖問題有非常好的效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谆扎,一起剝皮案震驚了整個濱河市挂捅,隨后出現的幾起案子,更是在濱河造成了極大的恐慌堂湖,老刑警劉巖闲先,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異无蜂,居然都是意外死亡伺糠,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門斥季,熙熙樓的掌柜王于貴愁眉苦臉地迎上來训桶,“玉大人,你說我怎么就攤上這事泻肯≡ㄇǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵灶挟,是天一觀的道長琉朽。 經常有香客問我,道長稚铣,這世上最難降的妖魔是什么箱叁? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任墅垮,我火速辦了婚禮,結果婚禮上耕漱,老公的妹妹穿的比我還像新娘算色。我一直安慰自己,他們只是感情好螟够,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布灾梦。 她就那樣靜靜地躺著,像睡著了一般妓笙。 火紅的嫁衣襯著肌膚如雪若河。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天寞宫,我揣著相機與錄音萧福,去河邊找鬼。 笑死辈赋,一個胖子當著我的面吹牛鲫忍,可吹牛的內容都是我干的。 我是一名探鬼主播钥屈,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼悟民,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篷就?” 一聲冷哼從身側響起逾雄,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腻脏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體银锻,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡永品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了击纬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼎姐。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖更振,靈堂內的尸體忽然破棺而出炕桨,到底是詐尸還是另有隱情,我是刑警寧澤肯腕,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布献宫,位于F島的核電站,受9級特大地震影響实撒,放射性物質發(fā)生泄漏姊途。R本人自食惡果不足惜涉瘾,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捷兰。 院中可真熱鬧立叛,春花似錦、人聲如沸贡茅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顶考。三九已至赁还,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間村怪,已是汗流浹背秽浇。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甚负,地道東北人柬焕。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像梭域,于是被迫代替她去往敵國和親斑举。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 一病涨、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,720評論 0 10
  • 引言 以Django為代表的python web應用部署時采用wsgi協(xié)議與服務器對接(被服務器托管)富玷,而這類服務...
    大熊_7d48閱讀 2,027評論 0 3
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進行...
    月亮是我踢彎得閱讀 5,952評論 3 28
  • 必備的理論基礎 1.操作系統(tǒng)作用: 隱藏丑陋復雜的硬件接口,提供良好的抽象接口既穆。 管理調度進程赎懦,并將多個進程對硬件...
    drfung閱讀 3,525評論 0 5
  • 我所在的單位因為很多甘肅人励两,大家看到有些家庭出現老公打老婆的情況,大家就一傳十十傳百囊颅,單位所有的人都知道了:甘肅人...
    五月蓮閱讀 232評論 0 0