docker - 如何限制 k8s 中交换内存的使用?
问题描述
我知道k8s默认不支持swap。
但是由于我在 k8s 中有一个相当静态的 pod 部署(3 个节点,每个节点都有一个 solr + zookeeper pod),所以我决定无论如何在我的所有工作节点上设置 2G 交换,并通过启动kubelet来允许使用交换- -fail-swap-on=false
现在我已经启动并运行了集群,它似乎运行正常。
但是,我发现我的 java 进程使用了大量的交换,我担心这可能会影响性能。
- RSS: 317160 KB
- 交换:273232 KB
我的问题是有没有办法限制容器对交换内存的使用?
我正在考虑设置--memory-swap
Docker 的参数
目前,基于 Docker 检查我的容器对交换使用没有限制("MemorySwap": -1
)
sudo docker inspect 482d70f73c7c | grep Memory
"Memory": 671088640,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": -1,
"MemorySwappiness": null,
但是我只是找不到在 k8s 中暴露的这个参数。
我的 vm 相关设置
vm.overcommit_kbytes = 0
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
vm.swappiness = 20
vm.vfs_cache_pressure = 1000
ps对 pod 内存的限制是否也会限制 swap 的使用?
感谢大家阅读帖子!
笔记
这就是我获得 Java 进程的 RSS 和 SWAP 的方式
跑 top
27137 8983 20 0 3624720 317160 0 S 3.0 32.0 4:06.74 java
跑
find /proc -maxdepth 2 -path "/proc/[0-9]*/status" -readable -exec awk -v FS=":" '{process[$1]=$2;sub(/^[ \t]+/,"",process[$1]);} END {if(process["VmSwap"] && process["VmSwap"] != "0 kB") printf "%10s %-30s %20s\n",process["Pid"],process["Name"],process["VmSwap"]}' '{}' \; | awk '{print $(NF-1),$0}' | sort -h | cut -d " " -f2-
27137 java 273232 kB
解决方案
现在你知道为什么 kubelet 会在 swap 处于活动状态时默认拒绝启动。这不会在 CRI 的任何地方公开,也不会公开。
推荐阅读
- javascript - 如何在 jsx 中以内联样式循环数组?
- java - Spring JPA - 当我的数据库中有数据时,为什么我的 findAll 返回 null?
- python - 如何从列表中的每个项目中获取第一个字符并对其进行操作
- mysql - 无法创建表,因为它们都相互关联。外键约束格式不正确
- ruby-on-rails - Rails:如何将模型与多个父级关联
- c# - 从 C# 中的 DBF (Visual FoxPro) 文件中读取特定列
- python - 用于图像 + 元数据的 Azure 存储选项是什么?
- node.js - 如何将使用Sharp库的无服务器框架应用程序部署到AWS?
- php - PHP7.3:更新一个类中的数据,来自其他 2 个类
- ios - 在 Swift 中通过视图层次结构进行通信