首页 > 解决方案 > 如何限制 k8s 中交换内存的使用?

问题描述

我知道k8s默认不支持swap。

但是由于我在 k8s 中有一个相当静态的 pod 部署(3 个节点,每个节点都有一个 solr + zookeeper pod),所以我决定无论如何在我的所有工作节点上设置 2G 交换,并通过启动kubelet来允许使用交换- -fail-swap-on=false

现在我已经启动并运行了集群,它似乎运行正常。

但是,我发现我的 java 进程使用了​​大量的交换,我担心这可能会影响性能。

我的问题是有没有办法限制容器对交换内存的使用?

我正在考虑设置--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

标签: dockerkubernetes

解决方案


现在你知道为什么 kubelet 会在 swap 处于活动状态时默认拒绝启动。这不会在 CRI 的任何地方公开,也不会公开。


推荐阅读