Python: 处理MySQL连接挂起问题
我正在一个云计算平台上同时启动很多个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 ()
2 个回答
0
MySQL默认的连接数是150个
,你可以试着把这个数字调高一点,看看是否能解决问题。
0
你可能需要增加系统变量 back_log
和 thread_cache_size
的值。
back_log
是指等待初始连接的未处理连接请求的数量上限(默认是50),而 thread_cache_size
是指在客户端断开连接后,操作系统可以放入一个池中以供重用的最大线程数量,这样可以更快地接受后续连接,因为如果池中有线程,操作系统就不需要为每个新连接创建一个新的线程了(默认是0)。不过,每个客户端连接总是会有自己的线程。
不过不要把这个值调得太高,因为线程在重用时可能会保留之前查询所需的额外内存,而不是在线程被销毁时释放掉……所以你不想让这个值大到操作系统的线程永远不被销毁,尽管这样看起来很诱人。一般来说,每个CPU核心设置1到2个就差不多了,可能会有所帮助。