初始化struct softnet_data结构 net_dev_init为每个系统上的CPU创建了一组struct softnet_data结构。这些结构将包含处理网络数据所需的几个重要事项的指针: 用于注册到该CPU的NAPI结构的列表。 用于数据处理的backlog队列。 处理权重。 接收卸载(receive offload)结构列表。 RPS设置。 等等。
/proc/net/softnet_stat记录了一些内核网络栈的状态,是网络调优的重要参考依据,但是很神奇的是内核文档没有提到,各种地方都告诉你通过net/core/net-procfs.c阅读它到底是什么,第 1 列是 processed 网络帧的计数,第 2 列是 dropped 计数也就是因input_pkt_queue不能处理导致的丢包数(和 ring buffer 满导致的丢...
$ cat /proc/softirqs CPU0 CPU1 CPU2 CPU3 HI: 0 0 0 0 TIMER: 2831512516 1337085411 1103326083 1423923272 NET_TX: 15774435 779806 733217 749512 NET_RX: 1671622615 1257853535 2088429526 2674732223 BLOCK: 1800253852 1466177 1791366 634534 BLOCK_IOPOLL: 0 0 0 0 TASKLET: 25 0 0 0 SCHED: 2642...
/ proc / net / softnet_stat文件在第2列中包含一个计数器,该值在netdev backlog队列溢出时递增。 如果此值随时间增加,则需要增加netdev_max_backlog。 softnet_stat文件的每一行代表一个从CPU0开始的CPU内核: 第一列是中断处理程序接收的帧数。 第2列是由于超过netdev_max_backlog而丢弃的帧数。 第三列是...
通过查看/proc/net/softnet_stat可以确定是否存在网卡 IRQ频繁导致的丢包: 第三列一直在增加的话需要,表示 soft IRQ 获取的 CPU 时间太短,来不及处理足够多的网络包,那么需要增大 netdev_budget 值。 解决方案: budget 默认 300,可以调整 sysctl -w net.core.netdev_budget=600 ...
通过查看/proc/net/softnet_stat可以确定是否发生了netdev backlog队列溢出: $ cat /proc/net/softnet_stat 01a7b464 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01d4d71f 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ...
然后排队数据到每 CPU 接收网络积压中以进行处理。处理器间中断(IPI)被传送到拥有积压的 CPU。 如果当前没有处理积压工作中的数据,这有助于启动积压工作处理。/proc/net/softnet_stat包含每个softnet_data结构体接收 IPI(received_rps字段)的次数计数。
cat /proc/net/softnet_stat/ifconfig eth1查看网卡驱动情况; netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n查看连接状态分布; ss -ntp或者netstat -ntp查看连接队列; netstat -s查看协议栈情况; 4. 方法论 RED方法:监控服务的请求数(Rate)、错误数(Errors)、响应时间(Duration)。Weave Clou...
如果因为 CPU backlog 不够或者 flow limit 不够,被丢弃的报文会将丢包信息计入/proc/net/softnet_stat 接口 流控制功能默认会编译到内核中(CONFIG_NET_FLOW_LIMIT),但不会启用。它是为每个CPU独立实现的(以避免锁和缓存竞争),并通过在sysctl net.core.flow_limit_cpu_bitmap中设置相关位来切换CPU,它的CPU位...
我们再来把精力集中到这个核心函数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(!