我正在探索按照https://github.com/libhugetlbfs/libhugetlbfs/blob/master/HOWTO中的指南使用大页支持文本和数据段的可能性。
我已按照建议重新链接应用程序,添加“-B/usr/share/libhugetlbfs -Wl,--hugetlbfs-align”,并使用“hugectl --text --data --heap --bss /path/ 启动应用程序到/我的/应用程序”。
但是我不太确定如何验证数据和文本段是否确实被复制到hugetlbfs文件系统上的文件中。
检查 /proc/{pid}/maps,可以看出,大页用于堆,但不用于文本和数据段,因为前两个地址范围映射到应用程序,而不是大页文件系统。
我的理解正确吗?实际上,我怀疑我的结论:大页用于 /proc/{pid}/maps 中的堆也是不正确的。
如何验证数据和文本段是否备份在大页中?我知道如果成功的话数据和文本段将被复制到hugetlbfs文件系统,但如何验证它?
谢谢!
/proc/{pid}/maps 的输出
00400000-00d2c000 r-xp 00000000 fd:02 46153351 /path/to/my/application
00f2b000-00fa3000 rw-p 0092b000 fd:02 46153351 /path/to/my/application
00fa3000-00fbb000 rw-p 00000000 00:00 0
02a0c000-02a2d000 rw-p 00000000 00:00 0 [heap]
40000000-80000000 rw-p 00000000 00:15 2476090 /dev/hugepages-1G/libhugetlbfs.tmp.nS7exn (deleted)
检查
/proc/$pid/numa_maps
包含有关给定进程使用的每个内存区域的信息,除其他信息外,还可以确定哪些节点用于页面。
如果你设置 HUGETLB_DEBUG=1 变量,它会告诉你很多有用的信息。其中之一是:
信息:段 2 的对齐 memsz 太小:0x864 < 0xffffffffffffffff
如果成功,看起来像:
libhugetlbfs [zupa:154297]:信息:段0(phdr 2):0x400000-0x400864(filesz = 0x864)(prot = 0x5)
libhugetlbfs [zupa:154297]:信息:段1(phdr 3):0x600868-0x600af8(filesz = 0x27c)(prot = 0x3)
libhugetlbfs [zupa:154297]:调试:总 memsz = 0xaf4,最大段的 memsz = 0x864
libhugetlbfs [zupa:154297]:信息:libhugetlbfs 版本:2.16(已修改)
libhugetlbfs [zupa:154951]:信息:映射的巨大段位于 0x2aaaaac00000。从 0x400000 复制 0x864 字节和 0 个额外字节...完成
libhugetlbfs [zupa:154297]:信息:准备成功
libhugetlbfs [zupa:154952]:信息:映射的巨大段位于 0x2aaaaac00000。从 0x600868 复制 0x27c 字节和 0 个额外字节...完成
libhugetlbfs [zupa:154297]:信息:准备成功
在当前 Linux 内核上获取大页支持的文本节的最简单方法是使用实验性
CONFIG_READ_ONLY_THP_FOR_FS=y
选项进行编译,并将 THP 策略设置为 always
。
一些发行版附带了该集的内核,您可以使用
zgrep THP_FOR_FS /proc/config.gz
检查