一种宿主机内核bug导致kvm虚拟机丢包的监控和处理方法

author author     2023-03-21     200

关键词:

近期公司一台kvm虚拟机丢包引发应用异常,经过分析宿主机内核bug导致,没有包转发到虚拟机,体现为虚拟机丢包引发应用异常。

原因分析和相关概念

如下是现象和分析过程

1、收集虚拟机内部的virtio0-input中断,执行如下命令,隔1分钟收集一次,发现有一个队列中断数一直没有变化,这个就是导致虚拟机丢包的直接原因。因为中断代表cpu收到了网卡的中断请求,这里没有中断,则是虚拟机并没有接收到网络请求。

一种宿主机内核bug导致kvm虚拟机丢包的监控和处理方法_虚拟化

2、虚拟机中断没有发生,可能原因有很多,这里涉及到kvm虚拟机网络实现的架构流程,kvm一般使用的是virtio是半虚拟化的解决方案,virtio分为前端和后端,vhost-net是后端,在host内核上运行,virtio-net是前端,在guest上运行。virtio架构大致如图所示,当虚拟机未发生中断时,问题原因为下图中步骤A或步骤B之一出了问题

一种宿主机内核bug导致kvm虚拟机丢包的监控和处理方法_virtio_02

3、如果步骤A出现问题,是tun设备和vhost_net传输阶段出现问题导致丢包,如果是步骤B出现问题,则是虚拟化中断注入异常导致中断注入失败,或者环形缓冲区(ring buffer)满了,vhost_net不对其传输数据。这里环形缓冲区是指具有固定的有限大小的缓冲区,如果缓冲区满了,就代表virtio处理数据不及时。

应用厂商通过crash工具和perf工具内核分析发现,环形缓冲区并没有满,并且期间有一个vhost队列是sleep状态,没有被tun唤醒,而其他队列都有被唤醒。即是步骤A出现的问题。

该问题属于宿主机的kernel中tun设备代码实现中有bug导致的问题。问题的原因在于tun设备内部的tx_array中数据错乱导致环形队列无法工作,进而导致虚拟机virio_net无法收包​。


临时处理办法

因为属于宿主机bug,暂时无彻底解决方法,而这个问题会体现到虚拟机队列中断没有发生,因此可以通过关注虚拟机中断是否持续发生,如果队列中断长时间没有发生,很可能就是发生丢包了。

监控方法

执行如下命令,将每个队列的virtio0-input中断采集下来,然后隔几分钟再次执行采集,对比前后两次,如果中断数量没变化的情况,很可能就发生这个丢包问题了。如下图11号队列,前后两次中断数量没有变化,可能出现问题了。

cat /proc/interrupts |tr -s |grep virtio0.input.|awk sum=0;for(i=2;i<=NF;i++)sum+=iprint NF" "sum

一种宿主机内核bug导致kvm虚拟机丢包的监控和处理方法_丢包_03

临时处理

因为这个问题是由于网卡多队列引起,其中一个队列没有发生中断导致,因此只需要在虚拟机内部重置网卡队列,重新释放后网卡队列后,再恢复网卡队列,即可恢复正常。

比如虚拟机网卡名为eth0,则先执行ethtool -l查看当前网卡队列数Current hardware settings的值为N,

N=ethtool -l eth0 |grep -wA4 "Current hardware settings" |grep -i Combined |awk print $2

先将网卡队列数设置为1,然后再恢复,这样可以快速恢复。

ethtool -L eth0 combined 1
ethtool -L eth0 combined $N

注意事项

1、 一般虚拟机的网卡队列数设置为小于或等于cpu核数,如果大于cpu核数,则多出的网卡队列则无意义。然后如果cpu核数大于网卡队列的话,注意前面监控方法,需要把没有绑定网卡队列的cpu核剔除比对,因为没有绑定网卡队列的cpu核,是不会发生中断的。

2、 如果虚拟机的流量很小(比如一些热备机器),同时网卡队列数比较大,这个前面的监控可能会误告警,可根据实际情况增加两次采集中断数的时间间隔。

kvm虚拟机使用perfstat提示cyclesnotsupported

...ions,branches,branch-misses均为notsupported原因分析由于该虚机与宿主机使用相同镜像,宿主机返回结果无异常。初步判断CPU虚拟化后,内核无法读取到部分CPU性能计数器数据导致。解决方案尝试将该虚机下电,将CPU类型改为host-model,... 查看详情

kvm虚拟化与容器的区别理解

1、KVM虚拟化是linux内核的虚拟化,提供了内核级别的虚拟进程管理,客户空间的程序QEMU-KVM可以提供资源清单和模拟设备,与KVM交互   QEMU-KVM--可以在宿主机器,建立网络(网桥交换机/NAT路由器【宿主机器作为路由】... 查看详情

虚拟化主机安装

...器时,我们先介绍以下几个重要组件:1.KVM:当LINUX加载KVM内核模块时(kvm.ko),那么它就会转换为一个虚拟化的服务器(hyervisor),它也提供了虚拟化的能力和指定的处理模块,kvm-inter.ko或kvm-amd.ko2.QEMU:是一个开源的主机仿真器,它... 查看详情

kvm虚拟化(代码片段)

...e(基于内核的虚拟机)前提:1.查看是否开启CPU虚拟化在宿主机下输入:dmesg|grepkvm,输出为:kvm:nohardwaresupport表示未开启CPU虚拟化,需要在物理机上打钩,即执行步骤22.在关机状态下,启用cpu虚拟化编辑虚拟机设置-->处理器--... 查看详情

kvm的vm如何迁移?

...主机的主机名为kvmhost1修改完后对系统进行重启生效。第一种:克隆1.克隆虚拟机:在克隆虚拟机时,需要关闭虚拟 查看详情

部署kvm虚拟化平台(代码片段)

...拟机系统实例挂起虚拟机恢复虚拟机配置虚拟机实例伴随宿主机自动启动导出虚拟机配置虚拟机的删除与添加-修改虚拟机配置信息部署实验环境第一步:插入一块新硬盘,并开启虚拟化功能第二步:格式化并挂载硬盘#查看硬盘信息f... 查看详情

kvm虚拟化技术

...Kernel-basedVirtualMachine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illum 查看详情

kvm虚拟化技术

...Kernel-basedVirtualMachine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illum 查看详情

centos7安装kvm

...KVM是开源软件,并且在Linux内核2.6.20之后就集成内核。0x01宿主机前提KVM的虚拟化需要来自硬件的支持,如IntelVT技术或者AMDV技术。首先通过以下命令检测CPU是否支持虚拟化:[[em 查看详情

linux学习总结(七十二)虚拟化之kvm(代码片段)

...内核模块Hyper-V商业,厂商微软Openvz开源基于linux虚拟机和宿主机共用一个内核VirtualBox开源Sun公司开发Oracl 查看详情

kvm(代码片段)

...的虚拟机(英语:Kernel-basedVirtualMachine,缩写为KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个虚拟机监视器(Hypervisor)。KVM在2007年2月被导入Linux2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD... 查看详情

kvm宿主机重启后虚拟机消失

现象一台kvm宿主机重启一次后,发现该虚拟机消失了,没法启动。virshlist--all没有找到这台虚拟机,但是镜像文件还存在。找到虚拟机的xml文件,重新virsh definexml后才恢复。分析原因是因为这台虚拟机的persistent参数为no,即... 查看详情

kvm虚拟化

虚拟化是云计算的一种具体实现方式,KVM是红帽内核集成的虚拟化技术。在用户态使用qemu来实现网卡、硬盘等设备的虚拟化.KVM是内核级别的虚拟机,需要CPU硬件的支持虚拟化。查看CPU是否支持虚拟化:grep -E ‘(vmx|svm)‘&... 查看详情

centos下安装kvm虚拟化模块(代码片段)

...rtualMachine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM内核模块在运行时按需加载进入内核空间ÿ 查看详情

kvm虚拟化存储管理

...StoragePool)和卷(Volume)来管理的。  StoragePool 是宿主机上可以看到的一片存储空间,可以是多种型;  Volume 是在StoragePool中划分出的一块空间,宿主机将Volume分配给虚拟机,Volume在虚拟机中看到的就是一块硬盘。 ... 查看详情

kernelhacker修炼之道之内核虚拟化kvm——overview

...的虚拟机。2006年10月,由以色列的Qumranet组织开发的一种新的“虚拟机”实现方案。2007年2月发布的Linux2.6.20内核第一次包含了KVM。下图是KVM,VMM,Guest通信的流程:在3者通信中,KVM主要做了 查看详情

kvm网络性能调优(代码片段)

...那张虚拟网卡,然后发到中间的虚拟化层,再然后是传到宿主机里的内核网桥中,最后传到物理网卡,这个过程很好理解。那么我们要做网络的优化,让虚拟机的网络运行得更加高效,我们要想的就是让虚拟机访问到物理网卡的... 查看详情

libvirt-java怎么获得kvm虚拟机内存使用率

...存分配上,KVM提供了ballooning机制,其本质就是可以根据宿主机系统内存使用的紧张程度来动态增加或回收客户机的内存占用。如果云计算环境准备实施oversell,那么这个机制是十分有用的,因为宿主机上的客户机不可能同时满载... 查看详情