You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

containerd无法将运行中容器内存调至低于当前使用值的问题求助

问题

在托管Kubernetes集群中使用crictl操作containerd runtime容器时,执行以下命令尝试将容器内存限制设为16MB:

crictl -r unix:///run/containerd/containerd.sock update --memory 16777216 c60df9ef3381e

出现如下错误:

E1219 11:10:11.616194    1241 remote_runtime.go:640] "UpdateContainerResources from runtime service failed" err=<
    rpc error: code = Unknown desc = failed to update resources: failed to update resources: /usr/bin/runc did not terminate successfully: exit status 1: unable to set memory limit to 16777216 (current usage: 97058816, peak usage: 126517248)
    : unknown
 > containerID="c60df9ef3381e"
FATA[0000] updating container resources for "c60df9ef3381e": rpc error: code = Unknown desc = failed to update resources: failed to update resources: /usr/bin/runc did not terminate successfully: exit status 1: unable to set memory limit to 16777216 (current usage: 97058816, peak usage: 126517248)
: unknown

该容器的Kubernetes资源配置为:

Requests:{"cpu":"100m","memory":"64Mi"} Limits:{"cpu":"200m","memory":"128Mi"}

最初误以为是不能设置低于K8s YAML中的值,但即使设置高于K8s请求值的内存限制(如65MB),仍会触发相同错误。而相同操作在Docker runtime中可执行(容器可能崩溃,但操作本身成功),且设置高于当前内存使用值的限制时,containerd下的操作也能成功。

疑问:

  • 该错误的原因是什么?
  • containerd是否存在无法将运行中容器内存限制设为低于当前使用值的限制?
  • 有无解决办法?

原因分析

  • runc的底层限制:错误核心来自runc执行失败,它不支持将内存硬限制下调到低于容器当前实际使用的内存值。containerd依赖runc处理容器资源修改,runc为避免强制触发容器OOM kill的不确定性,直接拒绝这类操作。
  • 与Docker的行为差异:Docker会强制执行内存限制调整,哪怕容器因此崩溃,操作本身返回成功;而containerd/runc设计更保守,优先避免容器异常终止,拒绝此类资源下调请求。
  • K8s配置无关性:尝试设置的65MB虽高于K8s的memory request,但容器实际内存使用已超过该值(当前约93MB),因此仍触发runc限制,和K8s配置没有直接关系。

解决办法

  • 先降低容器内存占用:通过应用层面操作减少内存使用(如重启应用、清理缓存),等实际内存使用低于目标限制值后,再执行crictl update命令。
  • 重建容器:若无法降低内存使用,可删除并重新创建容器——修改K8s Deployment的资源limits字段,让K8s重新调度创建符合目标内存限制的容器。
  • 优化应用内存行为:长期来看,优化应用的内存使用逻辑,避免内存占用持续高于预期,从根源减少资源调整需求。

内容的提问来源于stack exchange,提问作者Scorpicos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:30:13