在DPDK中,对cache的主要优化,除了利用时间局部性和空间局部性以外,更重要的是,要避免多核对缓存的ping-pong式读写。
昨天提到,如果理发店的tony老师上一次让小姐姐非常满意,那么,下一次小姐姐访问tony老师的概率将大大增加。这就是cache加速指令执行的秘籍。
但是,如果有多个小姐姐同时看上了tony老师,则会导致大家在tony老师身后排队。更加雪上加霜的是,tony老师刚刚为前一个小姐姐做完发型的时候,手是脏的,需要清洗后才可以为下一个小姐姐服务。
是的,我们在说多核同时写入一条高速缓存行的情况。
对于多核同时写入一条高速缓存行的情景,由于缓存一致性的要求,当核A写入高速缓存后,需要确保高速缓存的内容与RAM一致。高速缓存管理单元会将这块RAM在其他处理器核维护的高速缓存行标记为dirty,需要做清洁(flush)才可以让下一个core使用。
这段时间的开销是多少呢?我们知道,cache是用来解决RAM读写延迟和CPU运行速度之间的差异的。对于cache命中的情况,CPU里面的ALU可以立即从cache读取,但未命中则需要从DRAM读取,经历MMU地址转换-DRAM控制器写入行地址-写入列地址-读写的过程。这大约会损失100个CPU指令周期。
为了避免前面提到的小姐姐排队等待tony老师洗手造成的弊端,方法是很好解决的:给每一个小姐姐分配一个喜欢的老师就行了,可以是小P老师,kevin老师,加藤鹰老师,东尼大木老师…
因此,我们可以为不同的core分配不同的缓存。
除了在前面提到的,对于计数器等多个核可能并发访问的数据结构,小姐姐们还喜欢争抢的一位老师是,网卡的收发队列。
一般地,每个网卡的MAC芯片至少有8个队列。
但是,我们知道,对于Intel的至强处理器,每颗CPU的核数可能多达28核,以超线程论则可能达到56个线程。2路的服务器会有112个线程。显然,8个tony老师无法满足112个小姐姐的需求。
怎么办呢?
且听下回分解。