2014-06-04 71 views
0

我在雲計算提供商(大約320個作業)上同時啓動大量python作業。每個python作業在啓動時都會連接到MySQL服務器。連接成功完成大多數作業,但連接時總會有一些掛起。使用gdb檢查掛起作業的回溯顯示了下面的回溯,這似乎表明該進程已掛起等待MySQL的響應。Python:處理MySQL連接掛起

有什麼辦法可以修復掛在MySQL端或Python端?

(gdb) bt 
#0 0x00007f64612d14cc in recv() from /lib/x86_64-linux-gnu/libpthread.so.0 
#1 0x00000000004fb139 in ??() 
#2 0x0000000000510b4b in ??() 
#3 0x00000000004cbb0a in PyObject_CallMethodObjArgs() 
#4 0x00007f645e2ee69c in API_recvSocket (sock=0x4f03d00, buffer=0x7f644774b010 "",  [email protected]=65536) at ./python/io_cpython.c:229 
#5 0x00007f645e2ef1c0 in Connection::readSocket ([email protected]=0x5301720) at  ./lib/Connection.cpp:153 
#6 0x00007f645e2ef264 in Connection::recvPacket ([email protected]=0x5301720) at  ./lib/Connection.cpp:354 
#7 0x00007f645e2efd84 in Connection::connect (this=0x5301720, _host=<optimized out>,  _port=<optimized out>, _username=<optimized out>, 
    _password=<optimized out>, _database=<optimized out>, _autoCommit=0x0,  _charset=MCS_utf8_general_ci) at ./lib/Connection.cpp:487 
#8 0x00007f645e2ee8aa in UMConnection_Connect (conn=<optimized out>, _host=<optimized  out>, _port=<optimized out>, _username=<optimized out>, 
    _password=<optimized out>, _database=<optimized out>, _autoCommit=0x0, _charset=33)  at ./lib/capi.cpp:84 
#9 0x00007f645e2ed74e in Connection_connect (self=0x510fcd8, args=<optimized out>) at  ./python/umysql.c:860 
#10 0x00000000004ac5ce in PyEval_EvalFrameEx() 
#11 0x00000000004b3fd8 in PyEval_EvalCodeEx() 
#12 0x00000000004b4b4c in ??() 
#13 0x0000000000481cc4 in ??() 
#14 0x00000000004613b4 in ??() 
#15 0x0000000000463cc2 in ??() 
#16 0x00000000004acc66 in PyEval_EvalFrameEx() 
#17 0x00000000004acde0 in PyEval_EvalFrameEx() 
#18 0x00000000004b3fd8 in PyEval_EvalCodeEx() 
#19 0x00000000004acb98 in PyEval_EvalFrameEx() 
#20 0x00000000004b3fd8 in PyEval_EvalCodeEx() 
#21 0x0000000000536723 in ??() 
#22 0x0000000000446bf2 in PyRun_FileExFlags() 
#23 0x00000000004470ec in PyRun_SimpleFileExFlags() 
#24 0x0000000000447cdc in Py_Main() 
#25 0x00007f64606b6ead in __libc_start_main() from /lib/x86_64-linux-gnu/libc.so.6` 
#26 0x00000000004c7f39 in _start() 

回答

1

您可能需要增加系統變量back_logthread_cache_size的值。

back_log是等待初始連接的非服務等待連接請求數的限制(默認值爲50),thread_cache_size是客戶端斷開連接後將放入池以供重用的操作系統線程的最大數量,這樣可以更快地接受後續連接,因爲如果池中有一個連接(默認爲0),操作系統不必爲每個傳入連接創建實際的線程。 (每個客戶端連接總是有它自己的線程)。

不要爲這個問題瘋狂,因爲線程 運行的先前查詢所需的任何額外內存可能保留分配給線程,當它被留出以供重用時,而不是在線程被銷燬時被釋放。 。所以你不希望這個值太大以至於操作系統線程永遠不會被破壞,儘管看起來似乎很誘人。只有少數,每個CPU核心可能有1或2個可能會有所幫助。

+0

這很有道理,特別是back_log。我會嘗試增加它 –

+0

當我編寫[這個問題的答案](http://stackoverflow.com/a/17895136/1695906)時,我發現我的腳本展示了你描述的行爲(除python之外),當我嘗試以同時啓動大量的連接.. IIRC,我去了thread_cache_size,因爲它允許來自基準代碼的連接建立更快,因爲線程創建確實需要時間,我懷疑全局互斥可能是涉及,強加一個有限的限制,但我在猜測。在你的情況下,肯定會嘗試back_log,但另一個可能有助於讓事情的速度更快。 –