1、什么是Cache?
CPU芯片内部的高速缓存;
Cache类型 | 说明 | 容量 | 多核处理器内部存在形式 |
一级Cache | 分为数据Cache和指令Cache; 处理器只需3~5个指令周期 | 几十KB | 每个处理器独享 |
二级Cache | 数据和指令都无差别地存放在一起; | 几百KB到几MB不等 | 每个处理器独享 |
三级Cache | 处理器需要几十个指令周期才能访问到 | 几MB到几十MB不等 | 所有核心共享 |
TLB-Cache | 专门用于缓存内存中的页表项;(又称为快表) |
2、Cache预取原理
Cache之所以能够t提高系统性能,主要是程序执行存在局部性现象,即时间局部性和空间局部性。
Cache预取就是预测数据并取到Cache中,是根据空间局部性和时间局部性,以及当前执行状态、历史执行状态、软件提示等信息,然后以一定的合理方法,在数据/指令被使用前取入Cache。这样当数据/指令需要被使用时,就能快速从Cache中加载到处理器内部进行运算和执行。
3、软件预取
DPDK处理一个报文基本流程:
1)写接收描述符到内存,填充数据缓冲区指针,网卡收到报文后就会根据这个地址把报文内容填充进去;
2)从内存中读取接收描述符,(当收到报文时,网卡会更新该结构)从而确认是否收到报文;
3)从接收描述符确认收到报文时,从内存中读取控制结构体指针,再从内存中读取控制结构体,把从接收描述符读取的信息填充到该控制结构体;
4)更新接收队列寄存器,表示软件接收到了新的报文;
5)内存中读取报文头部,决定转发端口;
6)从控制结构体把报文信息填入到发送队列发送描述符,更新发送队列寄存器;
7)从内存中读取发送描述符,检查是否有包被硬件传送出去;
8)如果有的话,从内存中读取相应控制结构体,释放数据缓冲区;
上述过程需要6次读取内存,而每次访存需要几百个时钟周期。
因此DPDK必须保证所有需要读取的数据都在Cache中,否则一旦出现Cache不命中,性能将会严重下降。预取是DPDK中多种优化技术的一种。
rte_ixgbe_prefetch(char *p);
rte_packet_prefetch(char *p);