Valens
网易游戏运维与基础架构部 产品软件设计师 专注于智能监控、性能优化等领域
背景
在一次更新中,我们的 Python Agent 增加了一个新的子进程。上线后发现,主进程中,监控该子进程的插件线程小概率会被阻塞,阻塞点的调用函数为subprocess.Popen,逻辑为跑一个ss命令采集本地连接情况。
现场
拿到一个保留现场后,简单查看下,父进程子进程状态都比较正常。二话不说先用 Pylane Shell 打进去,看看阻塞的线程在干嘛:
1In [25]: tools.print_threads(["pusher_keep_alive"])
2Out[25]:
3
4Thread: pusher_keep_alive
5Stack:
6......
7 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/libase/multirun/common.py", line 237, in run_cmdline_with_file
8 env=env,
9 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 825, in __init__
10 restore_signals, start_new_session)
11 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 1537, in _execute_child
12 part = _eintr_retry_call(os.read, errpipe_read, 50000)
13 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 546, in _eintr_retry_call
14 return func(*args)
15
16Locals:
17 {'args': (18, 50000), 'func': }
18
卡在了 subprocess32 库调用 os.read 的地方,关键代码:
11330 def _execute_child(self, args, executable, preexec_fn, close_fds,
2..