禁用 Docker 容器的交换内存后,我仍然可以看到我的进程中使用了大量的交换内存,为什么?

禁用 Docker 容器的交换内存后,我仍然可以看到我的进程中使用了大量的交换内存,为什么?

我在 AWS EC2 上运行一些 pod(Solr 和 Zookeeper)。

虽然 k8s 默认不推广 swap,但我仍然通过设置来启用它14.2.1. 失败交换为 false,因为我希望我的系统能够使用交换空间。然后我发现交换空间使用方面存在一些奇怪的行为,希望您能帮助解释一下 :)

根据 Docker文档,我们可以通过执行以下操作来限制Docker容器使用交换内存。

如果 --memory-swap 设置为与 --memory 相同的值,并且 --memory 设置为正整数,则容器无权访问交换。请参阅防止容器使用交换。

通过docker inspect,我可以看到:

  • MemorySwappiness设置为空,因此它只使用操作系统上设置的参数。

    Memory等于MemorySwap,因此无法使用交换内存。

    $ sudo docker inspect 30309d07aa95 | grep Mem
        "Memory": 1073741824,
        "CpusetMems": "",
        "KernelMemory": 0,
        "MemoryReservation": 0,
        "MemorySwap": 1073741824,
        "MemorySwappiness": null,
    

然而,运行容器一段时间后,我发现我的 Solr 使用了大量交换空间。

$ grep --color VmSwap /proc/9549/status
VmSwap:   261812 kB

同时使用了约517820 kB的物理内存。

有人知道为什么这不起作用如 Docker 文档中所述吗?

其他信息

  • 操作系统:Amazon Linux 2 AMI (HVM),SSD 卷类型 - ami-0cbc6aae997c6538a (64 位 x86) / ami-09172771b47695ce2

  • Docker 版本

    客户端:版本:18.06.3-ce API 版本:1.38 Go 版本:go1.10.3 Git 提交:d7080c1 构建时间:2019 年 2 月 20 日星期三 02:26:51 OS/Arch:linux/amd64 实验:false

    服务器:引擎:版本:18.06.3-ce API 版本:1.38(最低版本 1.12)Go 版本:go1.10.3 Git 提交:d7080c1 构建时间:2019 年 2 月 20 日星期三 02:28:17 OS/Arch:linux/amd64 实验性:false

  • 关于内存的一些系统设置

    vm.overcommit_kbytes = 0

    vm.overcommit_memory = 1

    vm.overcommit_ratio = 50

    vm.swappiness = 60

    vm.vfs_cache_压力 = 100

答案1

因为并非所有交换都是平等创建的。 VmSwap除了您可能认为的“交换”之外的其他内容,还包括来自内存映射文件的脏页 - 并且IIRC,Solr 确实喜欢一些 mmap'd 文件。 /proc/<pid>/smaps应该提供有关究竟发生了什么的更多详细信息。

相关内容