大家好,我是二哥。首先祝大家元旦快乐。2022年心想事成,万事如意。
昨天的文章《看图写话:聊聊veth数据流》主要关注traffic从veth一端流出到流入另一端过程中所涉及到的数据流。在这个过程中内核线程ksoftirqd起到了至关重要的作用。
下面附上高清大图。
ksoftirqd在接收traffic时非常重要
其实不单从veth接收数据包会涉及到ksoftirqd,普通的物理网卡、loopback虚拟网卡的数据包接收都会涉及到这个内核线程。
它陪伴着skb(socket buffer)一路穿越内核中TCP/IP协议栈的链路层、IP层、传输层,最终将其送至socket queue之中。
在这个过程中还涉及到bridge-netfilter、netfilter的层层过(阻)滤(拦)。我在文章《deepdive: 关于虚拟化的小梳理和小思考》里做过一个比喻:如果我们将TCP/IP协议栈比作河道,skb比作水流的话,iptables rule条目的急速增加就像是在本是宽敞的河道里插入了一个又一个拦污网,它们在有效过滤网络包的时候,也显著降低了流水的速度。
借助这张图,我想应该可以比较形象地阐述这个观点:如果iptables设置得非常多的话,会导致ksoftirqd/4处理每一个skb的时间变长,进而使得它消费RingBuffer的速度变慢,对外的表现就是机器的吞吐量上不去。 ksoftirqd在发送数据时也非常重要
ksoftirqd在数据包发送的时候也非常的重要。发送过程二哥没有画图,我借助一张别人的图来给大家看一下ksoftirqd在数据包发送过程中所扮演的重要角色。图片来自公众号:开发内功修炼。
应用层需要发送的数据会在传输层被封装成skb。当skb从上而下穿越协议栈,最终到达网络设备子系统的时候,很有可能会先被放置到一个发送队列里面。这个过程是由线程trap进内核态后负责执行的。
当skb被放到队列后,这个线程触发了软中断,接下来就由ksoftirqd负责后续的数据发送过程。