静态编译二进制的缓存效应:未出现预期的缓存缺失减少
问题解答
1. Page Cache的共享性与静态链接的关系
- Page Cache是跨进程共享的,由Linux内核统一管理,用于缓存磁盘文件数据,和程序是否为静态链接无关。
- 内核通过文件的inode和数据偏移索引Page Cache条目:只有当多个进程访问同一inode的文件(如原文件、硬链接)时,才能复用已缓存的页;如果是内容相同但inode不同的独立文件(如你编译生成的
hello1和hello2),内核不会共享它们的Page Cache。
2. 缓存缺失未减少的原因
核心原因是你生成了两个独立的二进制文件(hello1和hello2),它们的inode不同,因此hello1执行后缓存的页无法被hello2复用:
- 从perf结果的
major-faults字段可以看出,两次执行都出现了9次主缺页,说明hello2执行时仍需要从磁盘加载部分数据页,没有利用到hello1的Page Cache。 - Spectre/Meltdown的软硬件缓解措施(如KPTI)主要影响用户态与内核态的页表隔离、TLB管理,不会阻止跨进程共享同一文件的Page Cache,因此不是导致该现象的原因。
验证方法
如果将hello2改为hello1的硬链接:
ln hello1 hello2
再重复执行两次taskset -c 31 ./hello1和taskset -c 31 ./hello2,就能观察到第二次执行的缓存缺失率显著降低,major-faults也会大幅减少甚至变为0。
内容的提问来源于stack exchange,提问作者Khrn
相关产品推荐
相关产品推荐

