GitHub - bitcharmer/tlb_shootdowns

主要观点:探讨在性能方面,重新使用内存是否比释放内存更好,重点关注所谓的“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 相关的性能问题。

阅读 15
0 条评论