11

我有一个使用大页面的应用程序,由于某些错误,该应用程序突然崩溃。崩溃后,由于应用程序没有正确释放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

有没有办法强制释放大页面?

4

5 回答 5

8

有时需要检查所有已挂载hugetlbfs 的目录。所以,

  1. 通过命令查找挂载目录mount | grep huge

  2. 检查每个目录,特别是/dev/hugepages.

  3. 删除所有 2M 大小的文件。(2M是hugepage的大小)

于 2014-10-21T10:37:53.087 回答
2

用于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!

希望有帮助....

于 2013-12-04T04:06:00.240 回答
1

HugeTLB 既可以用于共享内存(Mark J. Bobak 的回答会处理这个问题),也可以用于在hugetlb 文件系统中创建的应用程序 mmaps 文件。如果应用程序在没有删除这些文件的情况下崩溃,它们会存活并保持相应的内存“分配”。

检查 hugeTLB 文件系统并查看应用程序中是否有任何剩余文件。删除它们将释放内存。

于 2013-12-04T04:55:37.403 回答
1

如果你按照下面的说明,你可以摆脱分配的大页:

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
...
于 2017-11-18T18:59:54.617 回答
-3

您的hugetlb 可能被共享内存或mmap 文件使用。尝试删除共享内存或卸载hugetlb fs

于 2016-05-04T22:41:29.403 回答