【问题标题】:Kubernetes Pod with python script consuming too much memory带有 python 脚本的 Kubernetes Pod 消耗了太多内存
【发布时间】:2018-12-13 00:11:11
【问题描述】:

我编写了一个 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,无效。
  • 我试过this logic,但更糟
  • 我尝试先将转储创建为文件,然后再对其进行 gzip,这是我所有实验中最糟糕的一次

还有什么想法吗?

谢谢!

【问题讨论】:

    标签: python mysql memory kubernetes


    【解决方案1】:

    我复制了您的设置,转储仍然可以在更严格的限制下工作。

    我只是在 my-job.yml 中设置了资源上限,它不再消耗太多内存:

    resources:
      limits:
        memory: "100Mi"
      requests:
        memory: "50Mi"
    

    【讨论】:

      【解决方案2】:

      您可以使用GuruTux 编写的pydump。 至于缓冲区限制,该构造应如下所示subprocess.popen(args, bufsize=-1),更详细的使用请查看Python subprocess 文档。

      您还可以进行远程 mysql 转储,只需拉取 .gz 文件即可省去麻烦。

      【讨论】:

        猜你喜欢
        • 2020-04-16
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 2016-06-29
        相关资源
        最近更新 更多