![禁用 Docker 容器的交换内存后,我仍然可以看到我的进程中使用了大量的交换内存,为什么?](https://linux22.com/image/749721/%E7%A6%81%E7%94%A8%20Docker%20%E5%AE%B9%E5%99%A8%E7%9A%84%E4%BA%A4%E6%8D%A2%E5%86%85%E5%AD%98%E5%90%8E%EF%BC%8C%E6%88%91%E4%BB%8D%E7%84%B6%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E6%88%91%E7%9A%84%E8%BF%9B%E7%A8%8B%E4%B8%AD%E4%BD%BF%E7%94%A8%E4%BA%86%E5%A4%A7%E9%87%8F%E7%9A%84%E4%BA%A4%E6%8D%A2%E5%86%85%E5%AD%98%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我在 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
应该提供有关究竟发生了什么的更多详细信息。