getconf pagesize 是最可靠的方法,返回当前进程默认内存页大小(单位字节),通常为4096(即4kb),代表posix定义的最小可映射内存单位,无需root权限且兼容所有posix系统。

Linux 没有“页表大小”这个可直接查询的系统参数——你真正想查的,是 page size(内存页大小),不是页表(page table)本身占多少内存。页表结构随虚拟地址宽度、页大小、进程地址空间动态变化,没法用一个固定数值概括。
getconf PAGESIZE 是最可靠的方法
它返回当前进程能使用的最小可映射内存单位(单位字节),也就是内核分配物理页时的 base page 大小:
-
getconf PAGESIZE和getconf PAGE_SIZE效果完全一样,输出通常是4096 - 该值由内核在进程启动时注入,POSIX 标准定义,所有主流发行版都支持,无需 root 权限
- 它不随运行时大页启用状态变化——即使启用了
HugePages,getconf仍返回4096 - 注意:这不是 TLB 缓存条目数,也不是页表占用的内存字节数,只是内存分配粒度
/proc/meminfo 只显示 Hugepagesize,不显示 base page
执行 grep -i huge /proc/meminfo 可能看到类似:
HugePages_Total: 0 HugePages_Free: 0 Hugepagesize: 2048 kB
这仅说明系统支持 2MB 大页,且当前未分配;它不告诉你默认页大小。很多新手误以为 Hugepagesize 就是“页大小”,其实它只反映大页配置,和 getconf PAGESIZE 完全无关。
别被这些命令误导
以下命令看似相关,但实际查的都不是内存页大小:
-
sysctl vm.page-size:内核没有这个 sysctl 参数,多数情况下会报错或无输出 -
ulimit -a | grep "page size":显示的是文件系统逻辑块大小(如2048表示 2048 × 512 字节 = 1MB),和内存管理无关 -
cat /proc/cpuinfo | grep "page size":列出 CPU 支持的多种页大小(如4K/2M/1G),但不表示当前内核正在用哪个 -
cat /proc/meminfo | grep -i "page":只含大页统计字段,没有 base page 字段
真要确认某段内存实际用了多大页?看 /proc/[pid]/smaps
如果你在调优 mmap 分配或排查 TLB miss,需要知道某块内存**实际映射用了什么页**,就得查具体进程的 /proc/[pid]/smaps:
- 找
MMUPageSize字段:表示该内存区域当前使用的页大小(如MMUPageSize: 4 kB) - 找
MMUPFPageSize字段:表示该区域的页表项粒度(如MMUPFPageSize: 2 MB) - 这两个值可能不同——比如用
mmap显式申请大页,MMUPageSize就会变成2097152 - 普通进程的堆/栈/代码段基本都是
MMUPageSize: 4 kB,除非明确启用MAP_HUGETLB或透明大页生效
真正容易被忽略的是:同一个系统上,不同进程看到的 getconf PAGESIZE 值恒定,但它不代表该进程所有内存都按这个大小分配——大页、透明巨页、设备 DMA 区域等都会绕过 base page。查 smaps 才算落地到真实行为。











