性能之巅:洞悉系统、企业与云计算
1 笔记
1.1 chapter 5 应用程序
1.1.1 伪共享
期望锁的竞争降低时,使用多个锁(锁hash)是比较好的方案。为了最大程度并行,哈希表 桶的数目应该大于等于CPU数目。哈希冲突时,可开链解决。
放置于相邻内存中的锁列表,当多个锁落在同一个缓存行时会产生性能问题。因为两个CPU 更新同一缓存行的锁,会引起缓存一致性开销。这称为伪共享(false sharing)。一般通过 填充无效字节对齐解决。也可使用编译器特性。例如内核代码:
#ifndef SMP_CACHE_BYTES #define SMP_CACHE_BYTES L1_CACHE_BYTES #endif #ifndef ____cacheline_aligned #define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES))) #endif #ifndef ____cacheline_aligned_in_smp #ifdef CONFIG_SMP #define ____cacheline_aligned_in_smp ____cacheline_aligned #else #define ____cacheline_aligned_in_smp #endif /* CONFIG_SMP */ #endif
1.1.2 CPU绑定(CPU affinity)
绑定到特定CPU,提高内存本地性。错误的绑定(比如和中断或其他进程冲突)也会显著 降低性能。