我有一个进程在 lxc 中运行,它分配了一些大页面。然而,当 lxc 被杀死时,大页面仍然被分配,但没有进程拥有它们......
$ grep huge /proc/*/numa_maps
/proc/5801/numa_maps:7f7b00000000 prefer:0 file=/mnt/hugepages/rtemap_5 huge dirty=1 N0=1
$ virsh -c lxc:/// destroy <container>
$ grep huge /proc/*/numa_maps
$ cat /proc/meminfo | grep -i huge
HugePages_Total: 6
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
关于如何回收这些页面有什么建议吗?我尝试刷新缓存但没有帮助
$ sync; echo 3 > /proc/sys/vm/drop_caches
答案1
解决此问题的常见方法是在映射后立即删除应用程序内的支持文件。因此,该文件被标记为已删除,但一旦应用程序终止,该文件将被有效删除。换句话说,传统的制作方法是:
- 打开文件中的巨大的LBFS文件系统==>获取文件描述符(fd)
- 称呼ftruncate(fd...)将文件扩展到所需的大页数
- 使用 mmap(...fd...) 将文件映射到内存中
- 关闭文件:关闭(FD)
- 删除文件:取消链接(...)
- 映射在进程中可用,直到结束
- 一旦进程终止(在任何情况下),系统将删除在步骤 5 中标记为已删除的文件
提供了更多详细信息这里。
答案2
好吧,我认为这表明应用程序崩溃了,因为我发现删除以下文件可以恢复页面。发布此内容以防它可以帮助其他人作为有缺陷的应用程序的解决方法!
$ cd /dev/hugepages
$ ls
rtemap_0 rtemap_1 rtemap_2 rtemap_3 rtemap_4 rtemap_5
$ /bin/rm rte*
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 133120 kB
HugePages_Total: 6
HugePages_Free: 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB