近期在万兆网卡上測试,出现了之前千兆网卡没有出现的一个现象,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调度问题及网卡丢包的简单分析的更多相关文章

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

    Linux 网卡丢包严重 生产中有一台linux设备并发比较大,droped包比较多,尤其是在跑游戏数据包的时候,存在严重的丢包现象,怀疑网卡性能不足,在更换设备前想能不有通过软件方法解决,通过网上一 ...

  2. ethtool 解决网卡丢包严重和网卡原理【转】

    转自:https://blog.csdn.net/u011857683/article/details/83758869 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  3. 用ethtool 命令解决Linux 网卡丢包【转】

    转自:https://blog.csdn.net/chengxuyuanyonghu/article/details/73739516 生产中有一台Linux设备并发比较大,droped包比较多,尤其 ...

  4. ethtool 解决网卡丢包严重和网卡原理

      1 概述 最近业务上老有问题,查看发现overruns值不断增加,学习了一下相关的知识.发现数值也在不停的增加.发现这些 errors, dropped, overruns 表示的含义还不大一样. ...

  5. Linux 网卡丢包严重

    http://hi.baidu.com/scstwy/item/cad0fbef1fdc18d3eb34c9d9

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

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  7. UDP丢包原因总结

    丢包检查方法 给每个UDP包编号,对比收发端的接收到的包.对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进行判断. 抓包.发送端和接收端分别抓包.linux下可以使用tcpdum ...

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

    Linux 中模拟延时和丢包的实现 使用ifconfig命令查看网卡 Linux 中使用 tc 进行流量管理.具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命 ...

  9. 网卡做bond 导致丢包

    值班中发现一台服务器报到网关丢包,带宽200M. 用  ethtool bond0 查看网卡带宽信息,发现 Speed 为 3100M ,非 1000 的整数倍或10000的整数倍,感觉不对,因为是做 ...

随机推荐

  1. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

  2. 关于百度富文本编辑器UEdit的初始化内容失败问题

    百度富文本编辑器毫无疑问是强大的,但也会出问题.这个问题是在脚本中普遍存在的,由异步性导致的加载顺序问题. 我们使用 var ue = UE.getEditor('editor', {}); 创建实例 ...

  3. 【字符集及字符编码】UTF-8、UTF-16和UTF-32

    UTF-32 用 4 个字节存储每一个字符,以保证能把 UCS 完全表达出来.但实际上 UCS 的字符数量根本不需要用 32 位表示,UTF-32 极大地浪费了空间.另外,由于组合字符的存在,定长表示 ...

  4. LeetCode OJ-- Populating Next Right Pointers in Each Node II **@

    https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 接上一题目,输入的树不是perfect ...

  5. 【转载】NonEmpty和Non Empty的区别

    转载来源:http://www.ssas-info.com/analysis-services-articles/50-mdx/2196-mdx-non-empty-vs-nonempty One o ...

  6. 内存 : CL设置

    CL(CAS Latency):为CAS的延迟时间,这是纵向地址脉冲的反应时间,也是在一定频率下衡量支持不同规范的内存的重要标志之一. 内存负责向CPU提供运算所需的原始数据,而目前CPU运行速度超过 ...

  7. 洛谷 P4256 公主の#19准备月考

    题目背景 公主在玩完游戏后,也要月考了.(就算是公主也要月考啊QWQ) 题目描述 公主的文综太差了,全校排名1100+(全校就1100多人),她分析了好久,发现她如果把所有时间放在选择题上,得分会比较 ...

  8. noip2017集训测试赛(六)Problem A: 炮艇大赛之正式赛

    题目描述 给定一个长度为\(L \le 10^9\)的环形赛道, \(n \le 10^5\)个人在上面赛艇. 每个人的速度都不相同, 假如为正则顺时针走, 否则逆时针走. 当两个人相遇时, 他们就会 ...

  9. Blocks的申明调用与Queue当做锁的用法

    Blocks的申明与调用 话说Blocks在方法内使用还是挺方便的,之前都是把相同的代码封装成外部函数,然后在一个方法里需要的时候调用,这样挺麻烦的.使用Blocks之后,我们可以把相同代码在这个方法 ...

  10. windows上,python安装非官方包,提示error: Unable to find vcvarsall.bat

    在windows机器上安装python非官方包,如果环境只是用于开发,不作任何测试的话,最好的解决办法是: 在Linux上pip安装好之后,把python根目录lib/python3.6/site-p ...