背景
最近在公司收到了一条告警,K8S 集群中的 GPU 的节点一台接一台的变成了 NotReady 状态了。过了半个小时,业务找我说他们的服务起不来了,同时服务的所有的实例全都异常了。因为我们线上没有关闭 controller manager Node 异常的驱逐,如果业务代码会把宿主机节点跑死,节点上的异常业务就会触发迁移,迁移完接着把下一台节点跑死。如同葫芦娃救爷爷一般,全军覆没。最后 GPU 节点全部跪了。
复现
业务侧复现
业务侧给了一个jar包,pod 配置内存 limit 40g,宿主机62g内存。则会出现异常,宿主机节点会被跑死。
将 Pod 的内存 limit 改为 20g,Pod 则会运行一段时间后达到 cgroup 的限制大小,触发OOM。
模拟复现
如过你也想在自己的集群里模拟复现类似的场景可以使用如下方式。
下面尝试用 docker 复现需要在阿里云开一台 GPU 实例 ecs.gn6i-c16g1.4xlarge 16c64g 1*T4 GPU这个规格,大体上20块钱一个小时。驱动选择自动安装就好。都勾上。系统选择 alinux3.2
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo sudo yum install -y nvidia-container-toolkitsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo systemctl start docker[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64chmod +x ./kindsudo mv ./kind /usr/local/bin/kindkind create cluster --name k1sudo docker run --gpus=all -m 40g -it phantooom/hostboom-tiny
问题排查
节点已经关闭swap了。
为什么 Pod limit 40g 节点会处于半死不活的状态?
为什么同时 Pod 没有被 OOM 掉?
为什么 Pod limit 20g 则 Pod 会被正常 OOM 掉?
运行异常代码,一会你就会发现节点变成 NotReady(K8S节点状态) 了。然后机器的负载变得非常的诡异。不管是ssh 还是vnc。执行任何命令都变的非常的慢,可能十几秒钟可以输入一个字符。
资源占用大体上是这个样子的。
打满的IO
磁盘读 IOPS 4w的样子依然是打满状态,我们观察下到底是谁占了,如下图所示:
几乎所有程序都在疯狂的进行读操作,这是为什么?
被刷空的cache
观察到 IO 打到非常高。同时看了一下 top 如上图所示,这个大概猜到是cache全部被刷出去了造成。程序要运行,如果依赖了动态库则这部分需要加载到内存当中,这部分内容是用到的时候如果不存在则触发缺页中断从磁盘加载,平时也不会也不会释放,但是如果内存非常紧张的时候则这部分内存是允许释放的,如果程序再次执行的时候需要到动态库里面的代码则重新触发缺页中断,从磁盘读取。所以我们猜测大体上是内存紧张,动态库分配的内存被释放了。
进一步验证
+-------------------------------------------------------------------------------+----------------+------------+-----------+---------+| Name | Size (bytes) | Pages | Cached | Percent ||-------------------------------------------------------------------------------+----------------+------------+-----------+---------|| /usr/local/cloudmonitor/bin/argusagent | 114843023 | 28038 | 1069 | 003.813 || /usr/bin/kubelet | 188908296 | 46121 | 820 | 001.778 || /usr/bin/containerd-shim-runc-v2 | 10158080 | 2480 | 629 | 025.363 || /root/hcache | 2542252 | 621 | 540 | 086.957 || /usr/local/share/aliyun-assist/2.2.3.579/aliyun-service | 32559921 | 7950 | 322 | 004.050 || /usr/lib64/libc-2.32.so | 3299704 | 806 | 311 | 038.586 || /usr/bin/containerd | 53171440 | 12982 | 274 | 002.111 || /usr/local/share/assist-daemon/assist_daemon | 3819656 | 933 | 271 | 029.046 || /usr/local/aegis/aegis_client/aegis_11_37/libModuleMetadata.so | 2996336 | 732 | 269 | 036.749 || /usr/lib64/libsystemd.so.0.23.0 | 1398376 | 342 | 165 | 048.246 || /usr/local/aegis/aegis_client/aegis_11_37/libgrpc.so.10 | 4040312 | 987 | 80 | 008.105 || /usr/lib64/libpython3.6m.so.1.0 | 3164008 | 773 | 76 | 009.832 || /usr/local/aegis/aegis_client/aegis_11_37/AliYunDun | 3174360 | 775 | 59 | 007.613 || /usr/local/aegis/aegis_client/aegis_11_37/libaegisProcMng.so | 441632 | 108 | 53 | 049.074 || /usr/lib64/libstdc++.so.6.0.28 | 2034504 | 497 | 48 | 009.658 || /usr/lib64/libtinfo.so.6.1 | 187488 | 46 | 46 | 100.000 || /usr/lib/systemd/libsystemd-shared-239.so | 2767336 | 676 | 32 | 004.734 || /usr/local/aegis/aegis_client/aegis_11_37/libaegisMonitor.so | 348504 | 86 | 27 | 031.395 || /usr/lib64/ld-2.32.so | 268904 | 66 | 19 | 028.788 || /usr/local/aegis/aegis_client/aegis_11_37/libgpr.so.10 | 73440 | 18 | 16 | 088.889 || /var/db/nscd/passwd | 217032 | 53 | 16 | 030.189 || /usr/local/aegis/aegis_client/aegis_11_37/libaegisFileWatch.so | 387464 | 95 | 16 | 016.842 || /usr/lib64/libpthread-2.32.so | 304440 | 75 | 16 | 021.333 || /usr/local/aegis/aegis_client/aegis_11_37/libaegisNetWork.so | 583920 | 143 | 15 | 010.490 || /var/db/nscd/group | 217032 | 53 | 15 | 028.302 || /usr/local/aegis/aegis_client/aegis_11_37/libaqsUtil.so.1 | 573840 | 141 | 15 | 010.638 || /usr/local/aegis/aegis_client/aegis_11_37/libaegisIpc.so | 215080 | 53 | 12 | 022.642 || /usr/lib64/libglib-2.0.so.0.6800.4 | 1300472 | 318 | 10 | 003.145 || /usr/local/aegis/aegis_update/AliYunDunUpdate | 3724520 | 910 |