在网络应用程序的上下文中,我最近从我的主程序"中切换了一些耗时的处理(乳胶渲染)。去芹菜。
虽然它在开发期间我的笔记本电脑上工作得非常好,但在我的生产服务器上,执行此处理所需的时间增加了两倍以上。
我将问题缩小到核心处理本身,并且我已经对它进行了描述,但我完全迷失了可能导致这种差异的原因。
核心处理
def process(content, passes=2):
tmp_dir = tempfile.mkdtemp()
with open(os.path.join(tmp_dir, 'content.tex'), 'wb') as f:
f.write(content.encode('utf-8'))
pr = cProfile.Profile()
pr.enable()
for _ in range(passes):
process = subprocess32.Popen(
[
'/path/to/lualatex',
'--interaction',
'nonstopmode',
'--output-directory',
tmp_dir,
'--jobname',
'output',
'content.tex',
],
cwd=tmp_dir,
stdout=FNULL,
stderr=FNULL,
bufsize=0,
)
process.wait()
if process.returncode != 0:
with open(os.path.join(tmp_dir, 'output.log'), 'rb') as f:
raise LatexError(f.read())
pr.disable()
pr.dump_stats('/path/to/profile')
with open(os.path.join(tmp_dir, 'output.pdf'), 'rb') as pdf:
pdf_bytes = pdf.read()
shutil.rmtree(tmp_dir)
return pdf_bytes
个人资料"外部"芹菜
80 function calls in 1.973 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
2 1.969 0.985 1.969 0.985 {posix.waitpid}
2 0.002 0.001 0.002 0.001 {_posixsubprocess.fork_exec}
2 0.001 0.001 0.001 0.001 {posix.read}
2 0.000 0.000 0.003 0.002 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1323(_execute_child)
2 0.000 0.000 1.969 0.985 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1644(wait)
2 0.000 0.000 0.003 0.002 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:713(__init__)
4 0.000 0.000 1.970 0.493 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:540(_eintr_retry_call)
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1578(_handle_exitstatus)
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/posixpath.py:127(dirname)
2 0.000 0.000 1.969 0.985 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1629(_try_wait)
4 0.000 0.000 0.000 0.000 {posix.close}
2 0.000 0.000 0.000 0.000 {_posixsubprocess.cloexec_pipe}
1 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:872(__del__)
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1245(_get_handles)
10 0.000 0.000 0.000 0.000 {isinstance}
2 0.000 0.000 0.000 0.000 {sorted}
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:525(_cleanup)
2 0.000 0.000 0.000 0.000 {posix.WIFSIGNALED}
3 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}
2 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock' objects}
2 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}
1 0.000 0.000 0.000 0.000 {getattr}
2 0.000 0.000 0.000 0.000 {thread.allocate_lock}
4 0.000 0.000 0.000 0.000 {method 'fileno' of 'file' objects}
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1355(fs_encode)
2 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}
2 0.000 0.000 0.000 0.000 {method 'acquire' of 'thread.lock' objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1593(_internal_poll)
2 0.000 0.000 0.000 0.000 {posix.WEXITSTATUS}
2 0.000 0.000 0.000 0.000 {sys.getfilesystemencoding}
2 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {posix.WIFEXITED}
2 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}
芹菜概况
80 function calls in 6.260 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
2 6.256 3.128 6.256 3.128 {posix.waitpid}
2 0.002 0.001 0.002 0.001 {_posixsubprocess.fork_exec}
2 0.001 0.001 0.001 0.001 {posix.read}
2 0.000 0.000 0.003 0.002 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1323(_execute_child)
2 0.000 0.000 0.003 0.002 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:713(__init__)
2 0.000 0.000 6.256 3.128 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1644(wait)
4 0.000 0.000 6.258 1.564 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:540(_eintr_retry_call)
4 0.000 0.000 0.000 0.000 {posix.close}
2 0.000 0.000 6.256 3.128 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1629(_try_wait)
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1578(_handle_exitstatus)
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/posixpath.py:127(dirname)
2 0.000 0.000 0.000 0.000 {_posixsubprocess.cloexec_pipe}
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1245(_get_handles)
1 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:872(__del__)
2 0.000 0.000 0.000 0.000 {sorted}
10 0.000 0.000 0.000 0.000 {isinstance}
2 0.000 0.000 0.000 0.000 {posix.WIFSIGNALED}
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:525(_cleanup)
3 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}
2 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1355(fs_encode)
2 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock' objects}
2 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}
4 0.000 0.000 0.000 0.000 {method 'fileno' of 'file' objects}
1 0.000 0.000 0.000 0.000 {getattr}
2 0.000 0.000 0.000 0.000 {thread.allocate_lock}
2 0.000 0.000 0.000 0.000 {method 'acquire' of 'thread.lock' objects}
2 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}
2 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.000 0.000 0.000 0.000 /home/admin/.envs/sydpnl/lib/python2.7/site-packages/subprocess32.py:1593(_internal_poll)
2 0.000 0.000 0.000 0.000 {posix.WEXITSTATUS}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {len}
2 0.000 0.000 0.000 0.000 {posix.WIFEXITED}
2 0.000 0.000 0.000 0.000 {sys.getfilesystemencoding}
附带事实
我在我的服务器上运行Debian 7.8和Python 2.7.3。
编辑01/4/2015
更改了代码和配置文件,以突出显示问题所在的位置。
答案 0 :(得分:0)
我回答(并关闭)此问题以避免https://xkcd.com/979/。
似乎问题来自我过去管理芹菜过程的流程经理(马戏团)。马戏团可能会以某种方式减少过程资源。
切换到另一个流程管理器解决了这个问题。