深入浅出读书笔记----性能调优
1 burst收发包
1.1 burst设计的初衷
dpdk收包是一个复杂的过程,复杂的问题简单说,主要涉及三个阶段,收包,应用层梳理,发包。收包又包含好多的细节什么时候初始化,如何知道网卡把包填充到发包队列,怎么告知网卡收包队列已经准备好等等,这是大流程,这其中还包含好多细节,比如结构体如何定义,变量如何使用。所以基于此想到一个提升性能的方法,批量处理,Burst收发包就是DPDK的优化模式,它把收发包复杂的处理过程进行分解,打散成不同的相对较小的处理阶段,把相邻的数据访问、相似的数据运算集中处理。用最少得次数取最多的数据
1.2 burst优化的依据
想必大家肯定还记得预取的原理,预取利用的是时间局部性原理和空间局部性原理。而burst处理用到的就是空间局部性原理进行预取。一个收发包描述符是16B或者32B,处理器缓存单位是64B,这样一个cache line可以缓存2到4个描述符。处理器每次可以预取多个cache line,这样burst可以更充分的从cache 中获取数据。如果每次仅仅发送一个包,那么缓存中的内容就会浪费。
还有一个原因就是减少内存读取的次数,包处理的过程如下图,如果处理一个包,由于内存加载都是cache加载,就会把其他包的数据加载上,由于中间流程需要占用比较大的空间,会把之前取到的缓存信息去掉,待处理下一个报文时,需要重新加载,这个时候可能需要从内存加载数据。如果是批量处理,相似的流程集中处理,加载的数据下一个报文有可能也能使用,这种情况就减少了访存的次数。
2 收包队列长度
收包队列的长度就是每个收包队列分配的收包描述符个数,每个收包描述符都会分配有对应的Mbuf缓存块。长度越长就会缓存更多的报文,长度越短缓存的报文也越少。但是也不是缓存的报文越长越好,因为缓存的报文越长,占用的资源越多,当要缓存的内容不足以保存下申请的报文时,就会将缓存的内容清掉,清掉的这些数据可能是当前需要的,造成性能的降低。太短了也不行,收到的报文还没放多少,就放不下,造成丢包。一般设置成1024或者512。
3 发包队列长度
发包队列的长度就是每个发包队列分配的发包描述符个数,每个发包描述符都会有对应的Mbuf缓存块,里面包含了需要发送包的所有信息和内容。队列越长缓存的报文信息越多,队列越短缓存的报文信息越少。如果将队列的信息设置的很长就会占用缓存资源,可能会导致性能的降低;如果将队列的信息设置很短,可能会增加网卡的等待时间,因为队列太短,缓存报文的个数降低,这个时候等待队列资源报文等待空闲队列,等待一段时间如果能等到,则将信息进行填充。如果等待一段时间还是没有资源就会丢包。一般将其设置成512或者1024。
原文地址:https://blog.csdn.net/huoyunfeng13579/article/details/140630720
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!