python故障查詢:超時未設定

海鳥發表於2014-06-18

最近一臺基於python的應用服務總是出現問題。需求是使用者可以在頁面上提交批量處理任務,後臺把這些任務入到一個Queue裡排隊處理,然後通過一個執行緒專門處理。現在總是偶爾出現假死狀態,任務處理中斷執行。開始總是以為是哪裡出錯了,導致程式中斷。可以檢查程式,任務處理過程全部try了,並列印日誌。但是查詢日誌沒有任何出錯。首先要排查的執行緒到底有沒有活著,如果活著,是在哪裡阻塞了,所以想對任務處理執行緒執行dump,然後分析。本以為是python中有像jvm中的jstack的工具,但是上網查詢沒有結果,並提問了相關問題求救別人:http://segmentfault.com/q/1010000000506442 . 所以只能分析除錯程式執行時的執行緒狀態:

查詢出python執行的程式id是3125, 執行:

gdb -p 3125
...
gdb info threads

發現一個很明顯的問題,recv阻塞了。而且fd=9. 所以懷疑是讀流在哪裡卡住了,因為我的應用主要是抓取網際網路上其它網站的資訊,所以先檢視是否有連線沒有釋放。

ls -l  /proc/3125/fd

果然是一個socket連線沒有釋放, 然後想檢視下這個fd=9的詳細資訊:

lsof -p 3125
python  23243 tony    9u  IPv4             912004       0t0     TCP XXXXXX.linode.com:59047->205.204.96.104:http

然後這個ip就是抓取網站的ip。所以基本可以肯定是卡在這裡了。因為我用的requests元件,本以為其預設會有一個讀超時時間,但是檢視文件沒有發現, 所以手動加上:

requests.get('http://github.com', timeout=0.001)

 

相關文章