dpdk、kernel bypass
# dpdk
Intel Data Plane Development Kit, 网络数据包加速的库
通过uio直接接收数据包到用户态,在用户态实现网络协议栈,避免网络数据包从网卡到内核再到用户态的拷贝。
通过轮询模式,避免网络数据包到来时触发cpu中断引起的上下文切换开销。
绑核,大页内存,无锁队列等优化
需要使用智能网卡支持uio,支持的网卡列表可在官网查询:http://core.dpdk.org/supported/ (opens new window)
内核发送网络包的拷贝次数: https://baijiahao.baidu.com/s?id=1707608648230579710 (opens new window) 这里的内存拷贝,我们只特指待发送数据的内存拷贝。
第一次拷贝操作是内核申请完 skb 之后,这时候会将用户传递进来的 buffer 里的数据内容都拷贝到 skb 中。如果要发送的数据量比较大的话,这个拷贝操作开销还是不小的。
第二次拷贝操作是从传输层进入网络层的时候,每一个 skb 都会被克隆一个新的副本出来。网络层以及下面的驱动、软中断等组件在发送完成的时候会将这个副本删除。传输层保存着原始的 skb,在当网络对方没有 ack 的时候,还可以重新发送,以实现 TCP 中要求的可靠传输。
第三次拷贝不是必须的,只有当 IP 层发现 skb 大于 MTU 时才需要进行。会再申请额外的 skb,并将原来的 skb 拷贝为多个小的 skb。
编辑 (opens new window)
上次更新: 2022/06/13, 11:04:38