/proc/net/softnet_stat包含了一个计数,表示每个softnet_data结构体接收IPI的次数(received_rps字段)。 因此,netif_receive_skb要么继续将网络数据发送到网络堆栈的上层,要么将其交给RPS以在不同的CPU上进行处理。 调整:启用RPS 要使RPS起作用,必须在内核配置中启用它(在Ubuntu的3.13.0内核中已启用),并设置一个位...
要调整此设置,首先确定积压是否需要增加。 / proc / net / softnet_stat文件在第2列中包含一个计数器,该值在netdev backlog队列溢出时递增。 如果此值随时间增加,则需要增加netdev_max_backlog。 softnet_stat文件的每一行代表一个从CPU0开始的CPU内核: 第一列是中断处理程序接收的帧数。 第2列是由于超过net...
/proc/net/softnet_stat前面看到,如果 budget 或者 time limit 到了而仍有包需要处理,那 net_rx_action 在退出 循环之前会更新统计信息。这个信息存储在该 CPU 的 struct softnet_data 变量中。 这些统计信息打到了/proc/net/softnet_stat,但不幸的是,关于这个的文档很少。每一 列代表什么并没有标题,而且列的...
通过查看/proc/net/softnet_stat可以确定是否发生了netdev backlog队列溢出: $ cat /proc/net/softnet_stat01a7b4640000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d71f000000000000000000000000000000000000000000000000000000000000000000000000000000000349e7980000000000000000000000000000000000000000000000000000000000000000000...
static int __net_init dev_proc_net_init(struct net *net) { int rc = -ENOMEM; if (!proc_create("dev", S_IRUGO, net->proc_net, &dev_seq_fops)) goto out; if (!proc_create("softnet_stat", S_IRUGO, net->proc_net, &softnet_seq_fops)) goto out_dev; if (!proc_create("pty...
通过查看/proc/net/softnet_stat可以确定是否存在网卡 IRQ频繁导致的丢包: 第三列一直在增加的话需要,表示 soft IRQ 获取的 CPU 时间太短,来不及处理足够多的网络包,那么需要增大 netdev_budget 值。 解决方案: budget 默认 300,可以调整 sysctl -w net.core.netdev_budget=600 ...
在这个函数里,会为每个CPU都申请一个softnet_data数据结构,在这个数据结构里的poll_list是等待驱动程序将其poll函数注册进来,稍后网卡驱动初始化的时候我们可以看到这一过程。 另外open_softirq注册了每一种软中断都注册一个处理函数。NET_TX_SOFTIRQ的处理函数为net_tx_action,NET_RX_SOFTIRQ的为net_rx_action。继续...
我们再来把精力集中到这个核心函数net_rx_action上来:static void net_rx_action(struct softirq_action *h){struct softnet_data *sd = &__get_cpu_var(softnet_data); unsigned long time_limit = jiffies + 2; int budget = netdev_budget; void *have; local_irq_disable(); while(!
在这个函数里,会为每个 CPU 都申请一个 softnet_data 数据结构,在这个数据结构里的 poll_list 是等待驱动程序将其 poll 函数注册进来,稍后网卡驱动初始化的时候我们可以看到这一过程。 另外open_softirq 注册了每一种软中断都注册一个处理函数。NET_TX_SOFTIRQ 的处理函数为 net_tx_action,NET_RX_SOFTIRQ 的为...
等下次网卡再有硬中断过来的时候再处理剩下的接收数据包。其中budget可以通过内核参数调整。这个函数中剩下的核心逻辑是获取到当前CPU变量softnet_data,对其poll_list进行遍历, 然后执行到网卡驱动注册到的poll函数。对于igb网卡来说,就是igb驱动力的igb_poll函数了。