netback的tasklet调度问题及网卡丢包的简单分析

最近在万兆网卡上测试,出现了之前千兆网卡没有出现的一个现象,tasklet版本的netback下,vm进行发包测试,发现vif的interrupt默认绑定在cpu0上,但是vm发包运行时发现host上面cpu1, cpu2的ksoftirqd很高。

从之前的理解上来说,包从netfront出来通过eventchannel notify触发vif的irq处理函数,然后tasklet_schedule调用tx_action,通过一系列处理流程把包发给网卡。所以vif的interrupt绑在哪个cpu上,发包的时候,那个cpu的si%高才对。

仔细查看tasklet的代码发现,除了interrupt处理函数里面会调用tasklet_schedule之外,还有一个地方会调用,就是netif_idx_release, 这个是配合grant map使用的一个回调函数。当skb从网卡发出之后,kfree_skb时候,会调用page注册的一个回调,告诉netback,这个skb发送完成了,你可以给netfront 发送response了,然后顺便tasklet_schedule一把。

所以从这里,就不难看出,cpu1, cpu2上softirq高,tasklet也高, 是因为网卡中断都在cpu1, cpu2上。

开始我有点犯傻,觉得tx的时候,怎么会触发网卡中断呢,不应该是rx的时候才有的。后来看了igb的驱动,才发现真的傻。

网卡发完包,得把skb回收啊,这个时候,就是通过触发之前request_irq的函数来完成的,收包发包都走这一个函数。

就拿线上万兆网卡ixgbe来说

中断处理函数是ixgbe_msix_clean_many,里面调用napi_schedule, 走到ixgbe_poll。这个函数就是我们上面提到的收包发包都在这个里面处理的。

它会先调用ixgbe_clean_tx_irq, 对之前tx发送的包进行回收处理(ixgbe_unmap_and_free_tx_resource),接着调用ixgbe_clean_rx_irq

这个里面会rx_ring里面的rx_buffer_info包括的skb,调用协议栈的收包函数,扔给上层处理,ixgbe_receive_skb->napi_gro_receive->netif_receive_skb

这个rx_ring的count在网卡驱动加载时默认是1024,我们设置了最大上限4096个,是驱动里面每次接收完一批包的时候,就会ixgbe_alloc_rx_buffers 分配一批新的skb和page

pci_dma映射好给硬件去收包

这里第一个tasklet调度到cpu1, cpu2的问题就能解释, vm发包触发了网卡的cpu1, cpu2上的中断,一直到软中断,kfree_skb,触发idx_release,接着tasklet_schedule, 然后tx_action就一直在这两个cpu上,然后vif发包下来触发中断的时候,调用maybe_schedule_tx_action,里面会判断当前pending是否小于max/2,如果小于才去调用tasklet_schedule,这样即使被调用,可能tasklet已经在运行了。为什么之前千兆网络没怎么出现,可能是因为idx_release被调用的变快了吧,没去确认,这已经不重要了。

刚好还有一个网卡丢包的问题,跟网卡驱动有点关系,有个测试发现物理口收了14w的包,丢了45w的包,ethtool -S 看到的话是rx_fifo_errors, 这大概就表明因为没有buffer导致的。刚刚上面也讲到rx_buffer,是在处理完一批请求之后再去分配一批新的buffer,总共就4096个。如果cpu处理变慢,那么外面大压力发过来的情况下,就会有很多丢包,跟cpu的处理能力有关。

netback的tasklet调度问题及网卡丢包的简单分析,布布扣,bubuko.com

时间: 2024-10-06 05:20:31

netback的tasklet调度问题及网卡丢包的简单分析的相关文章

修改网卡缓存,解决Linux 网卡丢包严重问题

修改网卡缓存,解决Linux 网卡丢包严重问题 Linux 网卡丢包严重 生产中有一台linux设备并发比较大,droped包比较多,尤其是在跑游戏数据包的时候,存在严重的丢包现象,怀疑网卡性能不足,在更换设备前想能不有通过软件方法解决,通过网上一些资料显示,出现这种现象,也有可能是网卡buffer size 太小的原因,遂尝试更改buffer 大小解决,下面的设备运行了64天,丢包超过20多亿 找了一些国外的文章,可以通过ethtool来修改网卡的buffer size ,首先要网卡支持,我的

服务器网卡丢包

有时会发生网络丢包现象,此处的丢包有两种,真正意义上的丢包和逻辑丢包(此处以tcp协议栈丢包为例).之前falcon-agent也上报了相应的指标,在此处对一些疑问给出尽量详细的解释. 二.linux系统pakcet接收的过程 过程简单概括为 网卡收到包以后通过DMA传至ring buffer 网卡触发硬件中断,中断处理函数调用包接受软中断(softirq) Softirq检测各cpu的网卡poll list,并轮询相应网卡的ring buffer 包从相应packet desciptor 中移

网卡丢包问题

关键词: 丢包  网卡  bond0 telnet tcpdump ifconfig 连接失败 一.故障表现: 2018年1月11日下午18点,适配平台 192.168.120.1/2报警  日志提示 redis连接上不. 在120.1 上执行 telnet 192.168.120.2 6379 发现执行5次,有1次连接上不.现象看上去像网络不稳定. 二.处理过程: A. telnet 其它端口,看是否redis问题.  ------ 可排除是否应用问题. 120.1 上telnet 120.2

关于ip_conntrack跟踪连接满导致网络丢包问题的分析

我们的线上web服务器在访问量很大时,就会出现网络连接丢包的问题,通过dmesg命令查看日志,发现如下信息: kernel: ip_conntrack: table full, dropping packet. kernel: printk: 1 messages suppressed. kernel: ip_conntrack: table full, dropping packet. kernel: printk: 2 messages suppressed. kernel: ip_conn

linux 系统 UDP 丢包问题分析思路

转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考. 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程. 首先网络报文通过物理网线发送到网卡 网络驱动程序会把网络中的报文读出来放到

一次由于网卡流量跑满引起的服务器丢包总结

最近收到线上一台DB服务器ping丢包,丢包率一直在30%左右.通过Zabbix监控查看了服务器CPU,内存都很正常,网卡流量也不高,基本在100M左右. 首先确认一下服务器硬件是否正常,由于没有收到硬件报警.登录服务器通过HP管理工具在此确认了硬件信息都正常(硬盘,缓存卡,内存等).  第二步在排查一下系统问题,通过top,ps等命令也没有发现什么异常,基本上排除系统问题.  第三步查看了一下该服务器上联监控机端口流量,也都很正常,由于收到只有这一台服务器报警,也排除了上联交换机故障问题. 

性能测试四十六:Linux 从网卡模拟延时和丢包的实现

Linux 中模拟延时和丢包的实现 使用ifconfig命令查看网卡 Linux 中使用 tc 进行流量管理.具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命令. ping出来的最小单位为1毫秒,在执行压测之前,最好用压力机ping一下服务器,如果延迟很高,就没必要测了,因为请求还没发出去都已经有一段时间的消耗了 1. 延时(1)设置延时:给 eth0 设备发包时添加 30ms 的延时(从网卡).tc qdisc add dev eth0 root ne

Linux 从网卡模拟延时和丢包的实现

Linux 中模拟延时和丢包的实现 使用ifconfig命令查看网卡 Linux 中使用 tc 进行流量管理.具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命令. ping出来的最小单位为1毫秒,在执行压测之前,最好用压力机ping一下服务器,如果延迟很高,就没必要测了,因为请求还没发出去都已经有一段时间的消耗了 1. 延时(1)设置延时:给 eth0 设备发包时添加 30ms 的延时(从网卡).tc qdisc add dev eth0 root ne

windows RT系统下解决网络丢包问题

windows RT为了保证最高的电池使用时间,电源选项只有节能模式,在节能模式下,无线网卡也处于低功耗状态,导致如果用windows RT系统做网络开发的同仁可能会遇到莫名其妙的丢包现象,要解决此问题,需要将无线网卡调整到高性能模式.但是windows RT系统禁止设置高性能,只能通过其他途径解决. 1.可以在命令行下使用powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c命令将系统设置为高性能模式. 2.方法1可以将网卡设置为高性能