大页面用于文本和数据段
usage of hugepages for text and data segments
我正在按照 https://github.com/libhugetlbfs/libhugetlbfs/blob/master/HOWTO 中的指南探索使用大页面支持文本和数据段的可能性。
我已按照建议通过添加“-B/usr/share/libhugetlbfs -Wl,--hugetlbfs-align”重新链接应用程序并使用 "hugectl --text --data --heap --bss /path/to/my/application" 启动应用程序。
但是我不太确定如何验证数据和文本段是否确实被复制到 hugetlbfs 文件系统上的文件中。
检查/proc/{pid}/maps,可以看出hugepages用于堆而不是文本和数据段,因为前两个地址范围映射到应用程序而不是hugepage文件系统。
我的理解对吗?实际上我怀疑我的结论,即大页面用于来自 /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个变量,它会告诉你很多有用的信息。其中之一是:
INFO: Segment 2's aligned memsz is too small: 0x864 < 0xffffffffffffffff
如果成功,它看起来像:
libhugetlbfs [zupa:154297]: INFO: Segment 0 (phdr 2): 0x400000-0x400864 (filesz=0x864) (prot = 0x5)
libhugetlbfs [zupa:154297]: INFO: Segment 1 (phdr 3): 0x600868-0x600af8 (filesz=0x27c) (prot = 0x3)
libhugetlbfs [zupa:154297]: DEBUG: Total memsz = 0xaf4, memsz of largest segment = 0x864
libhugetlbfs [zupa:154297]: INFO: libhugetlbfs version: 2.16 (modified)
libhugetlbfs [zupa:154951]: INFO: Mapped hugeseg at 0x2aaaaac00000. Copying 0x864 bytes and 0 extra bytes from 0x400000...done
libhugetlbfs [zupa:154297]: INFO: Prepare succeeded
libhugetlbfs [zupa:154952]: INFO: Mapped hugeseg at 0x2aaaaac00000. Copying 0x27c bytes and 0 extra bytes from 0x600868...done
libhugetlbfs [zupa:154297]: INFO: Prepare succeeded
我正在按照 https://github.com/libhugetlbfs/libhugetlbfs/blob/master/HOWTO 中的指南探索使用大页面支持文本和数据段的可能性。
我已按照建议通过添加“-B/usr/share/libhugetlbfs -Wl,--hugetlbfs-align”重新链接应用程序并使用 "hugectl --text --data --heap --bss /path/to/my/application" 启动应用程序。
但是我不太确定如何验证数据和文本段是否确实被复制到 hugetlbfs 文件系统上的文件中。
检查/proc/{pid}/maps,可以看出hugepages用于堆而不是文本和数据段,因为前两个地址范围映射到应用程序而不是hugepage文件系统。
我的理解对吗?实际上我怀疑我的结论,即大页面用于来自 /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个变量,它会告诉你很多有用的信息。其中之一是:
INFO: Segment 2's aligned memsz is too small: 0x864 < 0xffffffffffffffff
如果成功,它看起来像:
libhugetlbfs [zupa:154297]: INFO: Segment 0 (phdr 2): 0x400000-0x400864 (filesz=0x864) (prot = 0x5)
libhugetlbfs [zupa:154297]: INFO: Segment 1 (phdr 3): 0x600868-0x600af8 (filesz=0x27c) (prot = 0x3)
libhugetlbfs [zupa:154297]: DEBUG: Total memsz = 0xaf4, memsz of largest segment = 0x864
libhugetlbfs [zupa:154297]: INFO: libhugetlbfs version: 2.16 (modified)
libhugetlbfs [zupa:154951]: INFO: Mapped hugeseg at 0x2aaaaac00000. Copying 0x864 bytes and 0 extra bytes from 0x400000...done
libhugetlbfs [zupa:154297]: INFO: Prepare succeeded
libhugetlbfs [zupa:154952]: INFO: Mapped hugeseg at 0x2aaaaac00000. Copying 0x27c bytes and 0 extra bytes from 0x600868...done
libhugetlbfs [zupa:154297]: INFO: Prepare succeeded