我正在云计算提供商上同时启动大量python作业(大约320个作业)。每个python作业在启动时都会与MySQL服务器建立一些连接。大多数作业的连接都能成功完成,但总有一些作业在连接时挂起。使用gdb检查挂起作业的回溯记录,可以看到下面的回溯记录,这似乎表明该进程挂起等待来自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 "", cbBuffer=cbBuffer@entry=65536) at ./python/io_cpython.c:229
#5 0x00007f645e2ef1c0 in Connection::readSocket (this=this@entry=0x5301720) at ./lib/Connection.cpp:153
#6 0x00007f645e2ef264 in Connection::recvPacket (this=this@entry=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 ()
MySQL默认的连接数是150,你可能想把它提高一点,看看是否有帮助。
您可能需要增加系统变量back_log
和thread_cache_size
的值。
back_log
是对未服务的数量的限制,等待初始连接的等待连接请求(默认50)和thread_cache_size
是操作系统线程的最大数量,将被放置到一个池中重用,在客户端断开连接后,允许更快地接受后续连接,因为操作系统不需要为每个传入连接创建一个实际的线程,如果池中有一个(默认0)。(每个客户端连接总是有自己的线程)。
不要太疯狂,因为线程运行之前的查询需要额外的内存可以保留分配给线程,当它被设置为重用,而不是被释放时,线程被销毁…因此,您不希望这个值太大,以至于操作系统线程永远不会被破坏,尽管这看起来很诱人。只有少数,也许每个CPU核心1或2可能会有所帮助。