我编写了一个python脚本来转储数据库,gzip并将其移动到云存储。
本地一切工作顺利,基本上没有消耗内存(最大20mb内存,cpu是相当高的,i/o是在最大)。
当我在kubernetes集群中将它作为一个作业运行时,内存使用量累积到大约1.6gb。
这差不多是我的gzip转储文件的大小。
我的逻辑是:
mysqldump_command = ['mysqldump', f'--host={host}', f'--port={port}', f'--user={username}',
f'--password={password}', '--databases', '--compact',
'--routines', db_name, f'--log-error={self.errorfile}']
print(f'## Creating mysql dump')
with open(self.filename_gzip, 'wb', 0) as f:
p1 = subprocess.Popen(mysqldump_command, stdout=subprocess.PIPE)
p2 = subprocess.Popen('gzip', stdin=p1.stdout, stdout=f)
p1.stdout.close() # force write error (/SIGPIPE) if p2 dies
p2.wait()
p1.wait()
我试过:
设置 PYTHONUNBUFFERED=1
,没有效果。
我试过这个逻辑,但更糟
我试着先创建一个转储文件,然后gzip它,这是我所有实验中最糟糕的
还有什么想法吗?
谢谢!
2条答案
按热度按时间rta7y2nd1#
我复制了你的设置和转储仍然与更严格的限制工作。
我只是在my-job.yml中设置了ressource caps,它不再消耗太多内存:
8qgya5xd2#
你可以使用gurutux写的pydump。至于bufer limit,构造应该如下所示
subprocess.popen(args, bufsize=-1)
有关更详细的用法,请查看python子流程文档。你也可以做一个远程mysql转储,只需拉.gz文件就可以省去麻烦。