如何让Python进程使用所有Docker容器内存而不被杀死?

如何让Python进程使用所有Docker容器内存而不被杀死?,python,docker,kubernetes,Python,Docker,Kubernetes,我有一个Python进程,它使用Pandas之类的工具进行了一些繁重的计算,而不是我的代码,所以我基本上对此不太了解 情况是,这段Python代码在8GB内存的服务器上运行得非常好,最大限度地利用了所有可用资源 我们将此代码移动到Kubernetes,但无法使其运行:即使将分配的资源增加到40GB,此过程也是贪婪的,并且不可避免地会尝试获取尽可能多的资源,直到超过容器限制并被Kubernetes杀死 我知道这段代码可能不太理想,需要自己修改 然而,我的问题是如何让Kubernetes上的Dock

我有一个Python进程,它使用Pandas之类的工具进行了一些繁重的计算,而不是我的代码,所以我基本上对此不太了解

情况是,这段Python代码在8GB内存的服务器上运行得非常好,最大限度地利用了所有可用资源

我们将此代码移动到Kubernetes,但无法使其运行:即使将分配的资源增加到40GB,此过程也是贪婪的,并且不可避免地会尝试获取尽可能多的资源,直到超过容器限制并被Kubernetes杀死

我知道这段代码可能不太理想,需要自己修改


然而,我的问题是如何让Kubernetes上的Docker模仿Linux在服务器上所做的工作:在不破坏进程的情况下提供进程所需的资源?

我发现运行这样的程序似乎是可行的:

导入资源
导入操作系统
如果os.path.isfile('/sys/fs/cgroup/memory/memory.limit_in_bytes'):
以open('/sys/fs/cgroup/memory/memory.limit_in_bytes')作为限制:
mem=int(limit.read())
resource.setrlimit(resource.RLIMIT_AS,(mem,mem))
这将从cgroup读取内存限制文件,并将其设置为进程最大区域地址空间的硬限制和软限制

您可以通过运行以下命令进行测试:

docker run --it --rm -m 1G --cpus 1 python:rc-alpine
然后在运行上述脚本之前和之后尝试分配1G的ram


有了脚本,您将得到一个
内存错误
,如果没有它,容器将被杀死。

您是否在部署中设置了限制。yaml?问题的描述不是很清楚。。。您在这两种情况下是否使用相同的输入?如果是这样,那么python脚本可能正在检查可用的ram并试图管理它。。。我想说的是,脚本检查RAM的方式不适用于k8s。如果您没有使用相同的输入。。。。好的,然后在两个系统上尝试相同的输入,检查它是否在一个系统中工作,而在另一个系统中不工作……是的,我在部署中设置了限制,以确保它不会吃掉100%的主机,并且限制被Kubernetes用来杀死容器。正如will指出的,这看起来像是Kubernetes在一个吊舱到达目标时杀死它的情况资源的最大限制。。里卡多的观点也很正确,日志里有什么东西吗?有类似的错误吗?我是否正确理解pod本身正在工作,但它需要越来越多的内存才能达到40GB,然后它就会被杀死?谢谢!我已经尝试过简单地将RLIMIT_设置为,但它终止终止容器的方式与进程达到容器内存限制的方式相同。我将尝试一下你所做的。它可能仍然会死,但它会随着Python
MemoryError
而不是OOMKilled而死。。。