前面介绍了一些cache的相关背景知识,这里单独写一篇博客,总结一下对于DPDK来说,为了提升性能,在cache方面有哪些需要注意的点。
①适时的使用cache预取技术。在处理网卡队列的时候,多数时候都是在处理连续的内存,此时应该主动调用预取函数,可以提升效率。
②为了解决cache一致性问题,数据结构尽量声明为cache line对齐。并且多核访问的数据,可以设计成每CPU变量。
③系统环境中开启大页
④使用支持DDIO技术的服务器。
⑤在NUMA系统中,为每个核分配内存,并且连接在某处理器上的PCI设备,让本地处理器来处理。
另外关注一个报文,从网卡收到,送到CPU,再到CPU送到网卡转发出去的全部过程:
①CPU把接收描述符写入内存。
②网卡收到报文后写入描述符。引入DDIO后直接写入cache,如果本身这块内存不在cache,也会在这时把这块内存放入cache。
③CPU从内存读更新后的描述符。确认收到报文再从内存读控制结构体指针,再根据指针从内存中读控制结构体。使用预取指令,直接把后续报文的内存也都拿到cache中。
④更新接收队列寄存器。
⑤CPU读到报文首地址,根据首地址读报文头,决定转发端口。引入DDIO时直接从cache读到。
⑥填入内存中的发送描述符,更新发送队列寄存器。引入DDIO后,此时描述符已经预取到cache了。
⑦CPU读内存看发送描述符,检查是否有报文被传出去了,有的话再读控制结构体,释放数据缓冲区。引入DDIO后可以直接读cache。