自建ES集群CVM IO问题
1、问题描述
永辉自建ES集群CVM 出现IO Hang的情况,子机无法登陆,进程也无法kill掉,需要进行节点重启切换来恢复业务。
问题背景:2021-05-31日客户侧TKE三台子机的io Await很高,使用的都是本地nvme盘子机,这边登陆了一台机器上面检查发现cpu使用率和io的等待时间都很大,检查进程发现有一个java程序占用了大半(ES的程序),起初步定论就是因为这个ES,把磁盘写死了,cpu负载和io等待时间一直下不去,最终导致磁盘hang死。
问题难点:客户侧那边已经将其ES容器副本关闭,但事实上该容器依然在node节点上正常运行,并且无法正常删除退出,后续在宿主机上找到对应的容器任务kill -9 杀掉之后,但该进程又自动拉起,且成为了僵尸进程,这边最初给客户的建议是重启node节点,彻底关闭ES的容器进程,在观察该node节点还会不会io hang,但客户还是不同意重启,想要先查清楚原因,到底是客户侧自身pod程序问题,还是我方的母机nvme本地盘问题(形成了我方怀疑客户侧代码程序有问题,客户方怀疑是我方产品或机器硬件问题的形式~~)。
后面又检查了磁盘io的情况发现await也并不高,但就是会直接导致系统hang死,继续进一步的调查。
后面又和腾讯的TKE研发协助进行检查syslog是昨天 2021-05-3 07:48 的时候es落下的数据太大,引起xfs_buf崩掉,导致io hang死,所以这边觉得应该是文件系统的问题,这边是打算推荐让客户用ext4试试的,但后面据了解,客户这个集群有15个节点,配置和这三个节点都是一样的xfs,也都是nvme盘,但实际上却只有这三台节点io出了问题,另外12台机器现在也是正常的,所以客户不认同。而且现在的io 等待时间依然很大,es也停不掉。
由于业务一直受到影响,这边也不好再跟客户继续扯皮,直接更换排查思路:开启kdump,当节点hang 死之后让其重启生成 vmcore 内核事件进行分析。
1 | 1.安装相应依赖 sudo apt-get install linux-crashdump |
2、问题过程及原因分析
1) 宕机的原因:
1 | crash> bt |
2)通过分析Kdump日志,系统有大量 hung task,都集中在 xfs 文件系统(其它 hung task 是由 xfs hung task 引起的连锁反应),具体信息如下:
1 | #3911 进程尝试获取 mutex,产生 hungtask |
3)同时发现linux社区中也有类似的bug报告:
Kernel Bug 报告
blk-wbt: fix IO hang in wbt_wait() - Patchwork
https://marc.info/?l=linux-block&m=153221542021033&w=2
Ubuntu 报告
Bug #1805693 “User reports a hang on 18.04 LTS(4.15.18) under a …” : Bugs : linux package : Ubuntu
社区在 4.15 内核后续也修复了多个 wbt 的缺陷, 可通过 git log block/blk-wbt.c 查看。
4)与永辉团队确认,之前ucloud上面使用的是4.19版本,而当前容器化部署的使用的是4.15内核版本,其中4.19内核修复了wbt的bug:
3、问题原因
Linux 内核 bug 导致 IO 无法下发,引起 hung task
4、规避建议
建议使用之前业务已经大量使用的稳定版本内核,或最新的 ubuntu 内核
1 | 第一步:检查安装的内核版本 |