linux内核bug修复方案:网络设备引用计数泄漏

问题描述

服务器安装Docker后,在进行服务重新部署后,出现 kernel:unregister_netdevice: waiting for veth2e632a2 to become free. Usage count = 1错误频繁输出,影响操作。
适用内核版本:3.10.* 关键词:kernel:unregister_netdevice: waiting for … to become free. Usage count = 1

  1. 问题现象

    节点不做任何操作,也会反复出现形如“kernel:unregister_netdevice: waiting for veth… to become free. Usage count = 1”的输出;

    节点pod网卡创建慢;

    通过重启服务器可以在一段时间内不再出现报错,但过一段时间又有了。

  2. 问题定位

定位为内核线程的引用计数泄漏问题,社区有较多相关 Issue:

  • https://github.com/kubernetes/kubernetes/issues/64743

  • https://github.com/projectcalico/calico/issues/1109

  • https://github.com/moby/moby/issues/5618

详见博客的第2个bug

  1. 临时处理方案

重启节点可以缓解该问题,但过一段时间(几天)后,又会重现。

  1. 彻底修复方案
    全新部署的场景:

在部署之前,如果可以选择机器的内核版本,建议使用>=4.18.*版本的内核。

如果一定要使用3.10.0的内核,请确保该内核版本>=3.10.0-1160(仅针对Redhat/CentOS)。
已经部署完成的环境:

对于已经部署集群的节点,可以根据实际情况进行内核升级:

  • 情况1,【ECS CentOS7.6/7.7/7.8请走此流程】机器的OS为RedHat or CentOS,且使用uname -r查看内核版本<3.10.0-1160,并且可以使用yum源,解决方案1:在线将CentOS内核升级到3.10.0-1160

  • 情况2,机器的OS为RedHat or CentOS,但是处于离线环境,没法使用yum源,请看解决方案2:离线将CentOS内核升级到4.19.1

说明

ADP并不提供操作系统及相关技术兜底,此处的升级方式仅供参考,因内核的升级而引发的意外问题不在ADP的责任边界内。

解决方案1:在线将CentOS内核升级到3.10.0-1160

yum update -y kernel kernel-devel
vim /etc/default/grub #修改成 GRUB_DEFAULT=0
grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启节点,查看内核版本是否>=3.10.0-1160
reboot
uname -a

解决方案2:离线将CentOS内核升级到4.19.1

  1. 准备阶段

拷贝安装包到进行升级服务器:https://acs-ecp.oss-cn-hangzhou.aliyuncs.com/rpm/kernel-4.19.1-rpm.tar

可选操作:到集群master节点,驱逐当前节点的服务kubectl drain ${nodename} --ignore-daemonsets=true。注:此步为可选操作,如果做了则会将节点上已有的应用先驱逐到其他节点上,这样就可以将升级内核过程中对应用的影响减小,如果您已经确认过应用处于可停服窗口期,则此操作也可以不做

  1. 升级当前内核节点
tar -xvf kernel-4.19.1-rpm.tar
rpm -ivh kernel-ml-devel-4.19.1-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-4.19.1-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-ml-headers-4.19.1-1.el7.elrepo.x86_64.rpm

若出现安装报错,使用rpm -ivh --force --nodeps安装

  1. 修改grub中默认的内核版本
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

查看新内核(4.19.1)的位置为x,例如0

vim /etc/default/grub

将GRUB_DEFAULT=saved 改为 GRUB_DEFAULT=0

执行grub2-mkconfig命令来重新创建内核配置

grub2-mkconfig -o /boot/grub2/grub.cfg
  1. 重启系统并查看系统内核
reboot
uname –a
  1. 回滚版本

awk -F’ ‘$1=="menuentry " {print $2}’ /etc/grub2.cfg

查看旧内核(xxxx)的位置为y,例如1

内核回滚操作流程:

vi /etc/default/grub

将GRUB_DEFAULT=saved 改为 GRUB_DEFAULT=1

执行grub2-mkconfig命令来重新创建内核配置

grub2-mkconfig -o /boot/grub2/grub.cfg

重启服务器,使内核版本回滚生效

reboot
uname –a

参考:内核bug修复方案:网络设备引用计数泄漏

你可能感兴趣的:(Linux,linux,bug,运维)