主要观点:探讨在性能方面,重新使用内存是否比释放内存更好,重点关注所谓的“TLB 关闭”现象及其影响。
关键信息:
- 现代硬件处理内存加载和存储的机制及多数当代 CPU 的物理设计,导致同一虚拟地址空间内的线程释放内存会相互影响。
- TLB 是虚拟到物理地址映射的缓存,分为数据(dTLB)和指令(iTLB),且有不同的访问级别和类型,如 PIPT、VIVT、VIPT、PIVT 等。
- Linux 中更新 TLB 可通过不同接口,如
void flush_tlb_all(void)
等,且 invalidating ranges 或单个 TLB 条目受 CPU 的 PCID 功能支持影响。 - 设计了一个测试程序来验证“TLB 关闭”现象,通过 Systemtap 工具监测到释放内存时会引发 IPI(处理器间中断),导致其他 CPU 中的线程 TLB 被刷新,从而造成执行停滞和性能下降。
重要细节:
- 一些内存分配可能使用
mmap()
而非sbrk()
,free()
与munmap()
相关联。 - 不同 CPU 缓存类型与 TLB 的交互方式不同,大多数一级缓存是虚拟索引,而二级及更大缓存是物理索引。
- 测试程序中通过固定线程到特定 CPU、分配和释放内存等操作来模拟“TLB 关闭”情况,并使用 HDR Histogram 库进行性能测量,同时需消除系统中的各种干扰因素。
- 在 bonus 内容中给出了罪魁祸首线程和受害者线程的 backtrace,展示了线程间交互的过程。
总结:通过对 TLB 相关概念、机制及“TLB 关闭”现象的研究和实验,揭示了在多线程环境下释放内存对系统性能的影响,强调了在程序设计中要注意避免不良的内存访问模式以减少 TLB 相关的性能问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。