我在云计算提供商处同时启动大量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 ()
答案 0 :(得分:1)
您可能需要增加系统变量back_log
和thread_cache_size
的值。
back_log
是等待初始连接的未服务挂起连接请求数的限制(默认为50),thread_cache_size
是将放入池中的最大操作系统线程数为了重用,在客户端断开连接后,允许更快地接受后续连接,因为如果池中有一个(默认为0),操作系统不必为每个传入连接创建实际线程。 (每个客户端连接始终都有自己的线程)。
不要对那个问题感到困惑,因为线程运行先前查询所需的任何额外内存 当它被留出来重用时,可以保留分配给线程,而不是在线程被销毁时被释放...所以你不希望这个值太大以至于OS线程永远不会被破坏,诱人虽然这看起来像。只需少量,每个CPU核心可能有1或2个可能会有所帮助。
答案 1 :(得分:0)
Default number of connections in MySQL is 150,您可能需要提高一点,看看是否有帮助。