【发布时间】:2019-01-23 14:26:31
【问题描述】:
我正在为这个问题撞墙。我们正在并行运行许多容器,它们正在运行简单的文件系统操作或简单的 linux 命令,其中一些在某些情况下会因内存分配问题而失败,Docker 容器会 OOMKiled。
我相信它与具体的命令无关。 tail 不是唯一失败的命令,我们也遇到过cp 或gzip。
我们已经缩小了问题范围并创建了一个脚本,当参数根据底层系统进行相应调整时,该脚本几乎肯定会失败。
https://github.com/keboola/processor-oom-test
使用默认设置的脚本会生成一个包含 1 亿行 (~2.5GB) 的随机 CSV,将其复制 20 次,然后运行 20 个运行 tail -n +2 ... 的容器。在具有 1TB SSD 的 m5.2xlarge AWS EC2 实例上,一些容器被 OOMKilled(并且一些以不同的错误结束)。进程因各种错误而终止:
/code/tail.sh: line 2: 10 Killed tail -n +2 '/data/source.csv' > '/data/destination.csv'
tail: error reading '/data/source.csv': Cannot allocate memory
tail: write error
(最后一个没有OOMKilled)
我不知道tail 应该消耗任何内存。如果并发工作的容器数量足够少,它可以轻松地在 64MB 内存下生存。对于大量容器,即使 256MB 也不够内存。我一直在看 htop 和 docker stats 并没有看到任何内存消耗高峰。
我们已经尝试过的事情
- 不同的 Docker 镜像(alpine、centos、ubuntu)
- 不同的文件系统(ext3、xfs)
- 不同的操作系统发行版(centos、ubuntu)
- 不同的实例提供商(Digital Ocean、AWS)
- 不同类型的实例和块设备
- 文件系统交换/swappiness
- Docker 内存交换和交换
其中一些只是部分帮助。调整内存限制或容器数量使其每次都再次崩溃。我们有一个 1GB 内存的容器在 OOMKilled 的大文件崩溃时运行简单的tail。
进一步了解我几个月前的尝试 - https://500.keboola.com/cp-in-docker-cannot-allocate-memory-1a5f57113dc4。而--memory-swap 原来只是部分帮助。
有什么建议吗?我不是 Linux 专家,所以我可能遗漏了一些重要的东西。非常感谢任何帮助或建议。
【问题讨论】:
-
您接受的答案是否成功?
-
@antoine-sac 是的,这是后续行动 - 500.keboola.com/…
-
您写一篇关于它的完整博客文章的可能性有多大?太好了,谢谢反馈!