我最近将一个新的容器映像推送到我的一个GKE部署中,并注意到API延迟上升,请求开始返回502。
查看日志,我发现容器由于OOM而开始崩溃:
Memory cgroup out of memory: Killed process 2774370 (main) total-vm:1801348kB, anon-rss:1043688kB, file-rss:12884kB, shmem-rss:0kB, UID:0 pgtables:2236kB oom_score_adj:980
从内存使用情况图来看,Pod 使用的内存加起来并不超过 50MB。我最初的资源请求是:
...
spec:
...
template:
...
spec:
...
containers:
- name: api-server
...
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "150m"
memory: "80Mi"
limits:
cpu: "1"
memory: "1024Mi"
- name: cloud-sql-proxy
# It is recommended to use the latest version of the Cloud SQL proxy
# Make sure to update on a regular schedule!
image: gcr.io/cloudsql-docker/gce-proxy:1.17
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "100m"
...
然后我尝试将API服务器的请求提高到1GB,但没有帮助。最后,帮助将容器映像还原到以前的版本:
通过查看golang二进制文件中的更改,没有明显的内存泄漏。当我在本地运行它时,它最多使用80MB的内存,即使在来自与生产中相同的请求的负载下也是如此。
我从GKE控制台获得的上图也显示了Pod使用远远低于1GB内存限制的Pod。
所以我的问题是:当GKE监控和本地运行它仅使用1GB限制中的80MB时,什么可能导致GKE终止我的OOM进程?
海绵宝宝撒
有只小跳蛙
阿波罗的战车
相关分类