首页 云原生应用交付平台 服务支持 常见问题 内核bug修复方案:网络设备引用计数泄漏

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

更新时间: 2023-08-07 15:41:21

适用内核版本:3.10.* 关键词:kernel:unregister_netdevice: waiting for ... to become free. Usage count = 1 更新日期:2021.08.11

1. 问题现象

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

  2. 节点pod网卡创建慢;

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

2. 问题定位

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

详见博客的第2个bug

3. 临时处理方案

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

4. 彻底修复方案

全新部署的场景:

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

如果一定要使用3.10.0的内核,请确保该内核版本>=3.10.0-1160(仅针对Redhat/CentOS)。

已经部署完成的环境:

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

  1. 情况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. 情况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。注:此步为可选操作,如果做了则会将节点上已有的应用先驱逐到其他节点上,这样就可以将升级内核过程中对应用的影响减小,如果您已经确认过应用处于可停服窗口期,则此操作也可以不做

2. 升级当前内核节点

# 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安装

3. 修改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

4. 重启系统并查看系统内核

# reboot
# uname –a

5. 回滚版本

# 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

6. 异常处理

1. 若出现报错:Found 7 pre-existing rpmdb problem(s), 'yum check' output follows:

gssproxy-0.7.0-4.el7.x86_64 is a duplicate with gssproxy-0.4.1-13.el7.x86_64

libnfsidmap-0.25-17.el7.x86_64 is a duplicate with libnfsidmap-0.25-15.el7.x86_64

libtalloc-2.1.9-1.el7.x86_64 is a duplicate with libtalloc-2.1.6-1.el7.x86_64

libtevent-0.9.31-1.el7.x86_64 is a duplicate with libtevent-0.9.28-1.el7.x86_64

libtirpc-0.2.4-0.10.el7.x86_64 is a duplicate with libtirpc-0.2.4-0.8.el7.x86_64

1:nfs-utils-1.3.0-0.48.el7.x86_64 is a duplicate with 1:nfs-utils-1.3.0-0.33.el7_3.x86_64

rpcbind-0.2.0-42.el7.x86_64 is a duplicate with rpcbind-0.2.0-38.el7.x86_64

执行命令:rpm -e #old version

2. 若出现报错: warning:PRMDB altered outside of yum.

执行命令:rm -rf /var/lib/yum/history/*.sqlite

阿里云首页 云原生应用交付平台 相关技术圈