我有一个使用大页面的应用程序,由于某些错误,该应用程序突然崩溃。崩溃后,由于应用程序没有正确释放hugepage,因此sys文件系统中的空闲hugepage数没有增加。
$ sudo cat /sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages
0
$ sudo cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
1024
有没有办法强制释放大页面?
我有一个使用大页面的应用程序,由于某些错误,该应用程序突然崩溃。崩溃后,由于应用程序没有正确释放hugepage,因此sys文件系统中的空闲hugepage数没有增加。
$ sudo cat /sys/kernel/mm/hugepages/hugepages-2048kB/free_hugepages
0
$ sudo cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
1024
有没有办法强制释放大页面?
有时需要检查所有已挂载hugetlbfs 的目录。所以,
通过命令查找挂载目录mount | grep huge
。
检查每个目录,特别是/dev/hugepages
.
删除所有 2M 大小的文件。(2M是hugepage的大小)
用于ipcs -m
列出共享内存段。用于ipcrm
删除剩余的共享内存段。
于 2019 年 6 月 24 日编辑:好的,所以,上面的答案虽然就目前而言是正确的,但有点简短。特别是,如果您的主机具有多个数据库实例,并且只有一个崩溃了,您如何确定应该清理哪些(如果有)内存段?
嗯,这也是可以做到的。对于每个正在运行的实例,连接 w/ / as sysdba
,然后执行oradebug setmypid
(任何 pid 都可以,因为所有 Oracle PID 都连接到 SGA)。然后做oradebug ipc
。那将(希望)返回IPC information written to the trace file
。因此,请转到 udump(或 diag_dest)目录,并查找您的跟踪文件。它将包含实例的所有 IPC 信息。这将包括ShmId
. 查看此实例正在使用的 ShmId(s) 的文件。现在看看输出ipcs -m
。
当您为所有正在运行的实例完成此操作后,由此输出的任何内存段ipcs -m
都显示非零内存分配,并且您无法在oradebug ipc
任何正在运行的实例的信息中考虑,必须是来自崩溃实例的剩余内存段。用于ipcrm
删除它/它们。
在具有多个运行实例的主机上执行此操作时,这可能有点令人担忧。请谨慎行事。您不想删除正在运行的实例的 SGA!
希望有帮助....
HugeTLB 既可以用于共享内存(Mark J. Bobak 的回答会处理这个问题),也可以用于在hugetlb 文件系统中创建的应用程序 mmaps 文件。如果应用程序在没有删除这些文件的情况下崩溃,它们会存活并保持相应的内存“分配”。
检查 hugeTLB 文件系统并查看应用程序中是否有任何剩余文件。删除它们将释放内存。
如果你按照下面的说明,你可以摆脱分配的大页:
1)让我们检查一下重启时免费的大页面
dpdk@dpdkvm:~$ ls /mnt/huge/
empty
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ cat /proc/meminfo
...
HugePages_Total: 256
HugePages_Free: 256
...
2) 使用错误的参数启动 dpdk 应用程序,产生错误
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ sudo ./build/kni -c 0x03 -n 2 -- -P -p 0x03 --config="(0,0,1),(1,0,1)"
...
EAL: Error - exiting with code: 1
Cause: No supported Ethernet device found
3)当我检查大页面时,没有任何免费的
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ cat /proc/meminfo
...
HugePages_Total: 256
HugePages_Free: 0
...
4)现在,当我检查挂载的hugepage目录时,我可以看到dpdk应用程序没有返回给操作系统的文件。
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ ls /mnt/huge/
...
rtemap_0 rtemap_137 rtemap_176 rtemap_214 rtemap_253 rtemap_62
...
5)最后,如果您删除以 rtemap 开头的文件,您可以将大页面归还
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ sudo rm /mnt/huge/*
[sudo] password for dpdk:
dpdk@dpdkvm:~/dpdk-1.8.0/examples/kni$ cat /proc/meminfo
...
HugePages_Total: 256
HugePages_Free: 256
...
您的hugetlb 可能被共享内存或mmap 文件使用。尝试删除共享内存或卸载hugetlb fs