【问题标题】:kernel memory grows creating files in ubuntu in a docker container内核内存增长在 docker 容器中的 ubuntu 中创建文件
【发布时间】:2019-05-18 11:14:59
【问题描述】:

在 ubuntu 容器(也包括其他发行版)中创建文件会导致内核内存增长。除非文件被删除,否则内存不会减少。 这是预期的行为吗?创建文件的进程停止时内存不会减少。

很容易复制。

  • 使用来自最新 ubuntu 映像的卷创建 docker 实例
  • 使用以下命令登录实例并在该卷内创建文件:for i in {1..100000}; do dd if=/dev/urandom bs=4096 count=1 of=file$i; done
  • 查看文件/sys/fs/cgroup/memory/memory.kmem.usage_in_bytes

kmem 将会增长。 我需要了解为什么,在程序执行相同操作的情况下避免或减轻这种行为:创建一组文件

【问题讨论】:

  • 似乎它可能正在缓存 - unix.stackexchange.com/questions/82820/…
  • 我再次测试了缓存和没有缓存,内核内存在这两种情况下都会增长。查看 /sys/fs/cgroup/memory/memory.kmem.slabinfo ,增长的值是 fuse_inode 和 dentry。这些值在创建文件时会增长,这听起来很符合逻辑
  • 但我希望在这些文件关闭后释放这些对象

标签: linux docker memory-leaks linux-kernel


【解决方案1】:

我们发现问题在于 dentryinode 缓存。 可以使用 sysctl 设置参数 vfs_cache_pressure。

文档在这里:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

vfs_cache_pressure

这个百分比值控制内核回收的趋势 用于缓存目录和inode对象的内存。

在默认值 vfs_cache_pressure=100 时,内核将尝试 以相对于 pagecache 的“公平”速率回收 dentry 和 inode 交换缓存回收。减小 vfs_cache_pressure 会导致内核优先 保留 dentry 和 inode 缓存。当 vfs_cache_pressure=0 时,内核将 由于内存压力,永远不要回收 dentry 和 inode,这很容易 导致内存不足的情况。增加 vfs_cache_pressure 超过 100 导致内核更喜欢回收dentries和inode。

显着增加 vfs_cache_pressure 超过 100 可能会产生负面影响 性能影响。回收代码需要采取各种锁才能找到可释放的 目录和 inode 对象。 vfs_cache_pressure=1000,它会寻找 可释放对象的数量是现有对象的十倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多