python - 带有 python 脚本的 Kubernetes Pod 消耗了太多内存
问题描述
我编写了一个 python 脚本来转储我的数据库,对其进行 gzip 压缩并将其移动到云存储中。
本地一切工作顺利,基本上不消耗内存(最大 20MB RAM,CPU 相当高,I/O 最大)。
当我在我的 kubernetes 集群中将其作为作业运行时,内存使用量堆积到大约 1.6 GB。
这或多或少是我压缩后的转储文件的大小。
这是我的倾销逻辑:
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,这是我所有实验中最糟糕的
还有什么想法吗?
谢谢!
解决方案
我复制了您的设置,并且转储仍然可以在更严格的限制下工作。
我只是在 my-job.yml 中设置了资源上限,它不再消耗太多内存:
resources:
limits:
memory: "100Mi"
requests:
memory: "50Mi"
推荐阅读
- javascript - 如何编写测试,而不用在 nestjs 中模拟存储库
- typescript - 使用 async/await 链接两个 Promise
- reactjs - 如何仅在条件下处理 useEffect
- python - 通过过滤渲染 jinja2 模板时包含和排除字符串输出
- javascript - 如何在传播运算符 Javascript 中避免 If 和 else
- python - 如何让 Altair 根据指定字段对 y 轴进行排序?
- plot - Julia plots:用反事实值替换真实的刻度值
- r - 在没有信息时为日期和国家添加新行
- python - 如何创建一个可选参数,它是具有特定值的另一个参数的别名?
- javascript - 我需要多个按钮来执行相同的功能 - 在 JavaScript 中连接 URL