一次虚拟内存排查经历

💡 原文中文,约10300字,阅读约需25分钟。
📝

内容提要

最近在给silly增加prometheus数据库支持时,发现在docker中,silly占用了将近110MiB虚拟内存,而在宿主机中只有48.32MiB。通过查看虚拟内存分配和系统调用,发现一些大的匿名内存段和jemalloc分配的内存大小非常接近。进一步分析发现,这是glibc的一个特性,用于提高性能。同时还发现了一个奇怪的现象,一块大内存包含了一个文件的内存映射,经过验证发现是因为jemalloc在mmap分配内存后立即使用munmap释放了这块地址空间。这提示我们在监控内存分配时需要同时监控mmap和munmap系统调用。

🎯

关键要点

  • 在docker中,silly占用了将近110MiB虚拟内存,而在宿主机中只有48.32MiB。
  • 通过查看虚拟内存分配,发现一些大的匿名内存段和jemalloc分配的内存大小接近。
  • glibc的特性用于提高性能,导致虚拟内存的预分配。
  • 在docker中发现一块大内存没有使用,怀疑是glibc的bug,结果发现是特性。
  • mmap分配的内存被jemalloc立即使用munmap释放,提示监控内存分配时需同时监控mmap和munmap。
➡️

继续阅读