DPDK性能优化技术汇总以及学习路线( 三 )


__sync_fetch_and_add(type* ptr, type value)__sync_compare_and_swap(type *ptr, type oldval,type newval)etc...这些操作虽然表面上没有了锁的痕迹 , 但实际上其汇编指令还是存在一个#lock锁总线的操作 。 所以也不必对其性能抱太高期望 。 对于所有关于锁的操作 , 需要强调的是 , 锁本身并不影响性能 , 只有对锁的争抢才影响性能 。
Local Cache如同之前介绍的那样 , 还有一种策略是将任务尽量划分为不相互依赖的各部分 , 分别交给不同的CPU Core去处理 , 仅仅在结果汇总的时候有少量的锁操作 。 在DPDK中大量应用了这种思想 。
Core Affinity将一个任务指定交给某个CPU Core处理 , 可以减少上下文切换和context switch的次数 , 以及提高缓存命中率 。 在Linux程序中可以通过
int sched_setaffinity(pid_tpid, size_t cpusetsize, const cpu_set_t *mask);来设定线程的CPU亲和性 。
False SharingFalse Sharing也是在多线程操作中需要避免的缓存失效的问题 。 如果两个变量分别被两个线程操作 , 但它们出现在同一条Cache Line中 , 则两个线程之间还是会互相影响 。 任何一个线程对该Cache Line的写操作 , 都会失整条Cache Line在另外一个线程处失效 。 如下图:
DPDK性能优化技术汇总以及学习路线文章插图
对此最简单的办法 , 是可以添加Cache Padding将两个变量分隔在不同的Cache Line之中 , 或者以Cache Line Size对齐的方式分配内存 。
作者:程序员小灰
出处: