Pab*_*siu 6 out-of-memory linux-kernel docker kubernetes
我正在开发一个java服务,它基本上在网络文件系统中创建文件来存储数据.它运行在Ubuntu 18.04 LTS中的k8s集群中.当我们开始限制kubernetes(限制:内存:3Gi)的内存时,pod开始被kubernetes OOMKILL.
一开始我们认为这是java进程中的内存泄漏,但更深入地分析我们注意到问题是内核的内存.我们验证了查看文件/sys/fs/cgroup/memory/memory.kmem.usage_in_bytes
我们将案例分离为仅使用DD命令创建文件(不带java),如下所示:
for i in {1..50000}; do dd if=/dev/urandom bs=4096 count=1 of=file$i; done
Run Code Online (Sandbox Code Playgroud)
使用dd命令我们看到同样的事情发生了(内核内存增长到OOM).在k8s重新启动pod后,我做了一个describe pod:
创建文件会导致内核内存增长,删除这些文件会导致内存减少.但我们的服务存储数据,因此它会不断创建大量文件,直到因为OOMKilled而终止pod并重新启动.
我们测试了使用带有-kernel-memory参数的独立docker来限制内核内存,并且它按预期工作.内核内存增长到极限并且不再上升.但我们没有找到任何方法在kubernetes集群中这样做.有没有办法限制K8S环境中的内核内存?为什么文件的创建会导致内核内存增长并且不会被释放?
感谢所有这些信息,它非常有用!
在我的应用程序上,我通过创建一个新的侧容器来解决这个问题,该容器使用以下命令每 5 分钟运行一次 cron 作业:
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
(请注意,您需要侧容器才能在特权模式下运行)
它工作得很好,并且具有可预测的优点:每 5 分钟,您的内存缓存就会被清除。
| 归档时间: |
|
| 查看次数: |
1267 次 |
| 最近记录: |