hugepage

hugepage

故事开始于很久之前, 我发现了一个问题. 我大概同时 shmget 了 12 个 4g 的内存块, 在程序退出的时候,
发现 exit 了很久之后, 父进程才收到了退出事件. 后来发现主要由于这些内存块的释放导致的. 都卡在 shmdt 操作上了.
大概会卡住 1-3s 的样子. 当时研究了一断时间, 也查了很多资源没有找到相关的信息. 这个事情也就只能先放下了.

今天在查看 intel cpu 的那个 bug 的相关文档的时候, 这些 bug 所在的层面也就是内存层面的, 看到了 page
table 的相关的信息, 突然间想到了上面的那个问题. 我猜想是不是由于大内存的 page table 太大的关系,
shmdt 必然会做的事情就是对于当前在使用的内存解开映射, 而这必然要做的就是想去查 page table 当前在使用哪些内存了.

我做了一些测试, 使用 shmget 申请了大概 8g 的内存(当前机器的 shmmax 就是 8g). 然后两次 memset 整个内存空间.
分别纪录了 shmget, shmat, shmdt 所消耗的时候.

使用 hugepage

没有使用 hugepage

  • 如果 shmget 的申请的内存大于 shmmax, 会返回 Invalid argument.
  • 如果 HugePages_Total 的值是 0, 或者总的内存量小于申请的内存量, 在 shmat 的时候会失败.

这个机器上的 huagepage size 是 2M. 看到了在使用 huage page 的情况下, 第一次调用内存的情况下可以提升 40% 的性能.
而对于 shmdt 的优化就是巨大的了. 大概从 700ms 降到了 2ms.


发表评论

邮箱地址不会被公开。 必填项已用*标注