性能之巅:洞悉系统、企业与云计算

目录

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,提高内存本地性。错误的绑定(比如和中断或其他进程冲突)也会显著 降低性能。