由一道淘宝面试题到False sharing问题
今天在看淘宝之前的一道面试题目,内容是
在高性能服务器的代码中经常会看到类似这样的代码:
解决方法很简单:
12345678
把每个项凑齐cache line的长度,实现隔离.typedef
union
{
erts_smp_rwmtx_t rwmtx;
byte cache_line_align__[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(
sizeof
(erts_smp_rwmtx_t))];
} erts_meta_main_tab_lock_t;
或者
_declspec (align(64))
int
thread1_global_variable;
__declspec
(align(64))
int
thread2_global_variable;
这就是为什么在高性能服务器中到处看到cache_line_align, 号称是避免cache的trash.
类似valgrind和intel vtune的工具可以做这个层次的性能微调.
(淘宝核心系统博客:http://rdc.taobao.com/blog/cs/?p=523)(英文文献资料网址:http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/ 或者http://software.intel.com/sites/default/files/m/d/4/1/d/8/3-4-MemMgt_-_Avoiding_and_Identifying_False_Sharing_Among_Threads.pdf)