python - 多处理错误 - 死于
问题描述
我正在尝试使用具有多处理功能的 ghosctscript 进行 postscript 转换,以提高性能,因为我的 pdf 文件非常大,大约 650 mb。
我写了如下脚本。
def convert_ps(out_ps,input_pdf):
cmd = 'gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile={} -f {}'.format(out_ps,input_pdf)
check_output(cmd,shell=True)
out_ps_list = ["out1.ps","out2.ps","out3.ps","out4.ps"]
inp_pdf_list = ["input1.pdf","input2.pdf","input3.pdf","input4.pdf"]
print("Starting time:{}".format(datetime.now()))
with Pool(processes=4) as pool:
return_res = pool.starmap(convert_ps, zip(out_ps_list,inp_pdf_list))
pool.join()
print("End time:{}".format(datetime.now()))
当我为单个文件运行 ghostscript 命令时,将 pdf 转换为 ps 需要 40 分钟,因为它是 650mb 大小的文件。我有 4 核 linux 机器,操作系统:RHEL,所以我尝试通过使用 python 多处理来提高性能。当我在脚本之上运行时,我面临以下问题。
正如预期的那样,CPU 利用率为 100%。内存使用率接近 70-80%。
1.5-2 小时后,服务器本身关闭,没有关闭,但没有响应,尝试打开另一个会话时出现连接超时错误。在同一台服务器上运行的所有其他应用程序都出现故障,例如 Web 应用程序在同一台服务器上运行时出现 500 错误。
现在我在 AWS 控制台中检查了这个实例,它的显示服务器已启动并正在运行。CPU 利用率也低于 10%。但我仍然无法通过 SSH/putty 访问服务器。我不得不通过 AWS 控制台强制重启服务器,然后我才能访问服务器。
当我检查ghostscript posctscript转换过程时,它在没有完成所有4个工作人员的情况下停止了。有时,从 4 个文件中生成了 2 个文件,有时没有。
后来,我在 gs 命令中添加了 -dDEBUG 选项(删除了 -q)并再次尝试,在 2 小时后低于跟踪。
ps -f Loop_Five_Thousand4.pdf' 死于 <Signals.SIGKILL: 9>。"""
上述异常是以下异常的直接原因:
回溯(最近一次调用):文件“pdf2ps_gs_poc.py”,第 14 行,在 return_res = pool.starmap(convert_ps, zip(out_ps_list,inp_pdf_list)) 文件“/usr/lib64/python3.8/multiprocessing/pool.py ",第 372 行,在星图中返回 self._map_async(func, iterable, starmapstar, chunksize).get() 文件 "/usr/lib64/python3.8/multiprocessing/pool.py",第 768 行,在 get raise self 中。 _value subprocess.CalledProcessError:命令 'gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile=out4.ps -f Loop_Five_Thousand4.pdf' 死于 <Signals.SIGKILL: 9>。
我曾尝试使用 pool.apply_async,但没有运气。
为什么它被sginal kill 9杀死?有什么方法可以处理多处理?有人请帮助避免singal kill 9错误。
编辑:观察到,只要 RAM 内存利用率达到 97-98%,服务器就会在终止长时间运行的进程后停机。在 /var/log/message 中找不到任何与 OOM 问题相关的日志。减少运行进程数以解决问题。
解决方案
推荐阅读
- python - Gmail API 无法获取电子邮件数据
- swift - RealityKit 多人会话 - 对象同步问题
- spring-security - JWT 于 2020-05-13T07:50:39Z 到期。当前时间:2020-05-16T21:29:41Z。正如日志错误所说,我的 jwt 到期后出现此错误
- mysql - go-testfixtures fixtures.Load() 返回校验和错误
- oracle - 如何在内部联接中添加大小写
- c# - C#在excel单元格中查找和替换换行符
- laravel - LARAVEL - 提交表单时没有更新数据库
- xml - 更改命名空间 URI 但保持相同架构会使所有元素和属性无效
- matrix - 计算 Octave 中行组的列的平均值
- sql - 错误在第 13 行的 FROM 中缺少标识符 oracle