在一个web应用程序的上下文中,我最近将一些耗时的处理(latex渲染)从“主程序”切换到了celery。在
在开发期间,虽然它在我的笔记本电脑上运行得非常好,但在我的生产服务器上,进行此处理所需的时间增加了两倍多。在
我把问题缩小到核心处理本身,我已经对它进行了分析,但我完全不知道是什么会导致这种差异。在
核心处理
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
描述“外部”芹菜
^{pr2}$芹菜简介
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}
附带事实
我在我的服务器上运行Debian7.8和Python2.7.3。在
编辑01/4/2015
修改了代码和配置文件,以突出(我认为)问题所在。在
我回答(并结束)这个问题是为了避免https://xkcd.com/979/。在
问题似乎来自于我用来管理芹菜过程的流程经理(circus)。马戏团可能在某种程度上减少了流程资源。在
切换到另一个流程管理器解决了这个问题。在
相关问题 更多 >
编程相关推荐