getconf PAGESIZE 返回当前进程默认内存页大小(单位字节),通常为4096(即4KB),它代表POSIX定义的最小可映射内存单位,用于对齐配置和避免TLB miss,兼容所有POSIX系统且无需root权限。

直接用 getconf PAGESIZE 就行,返回值就是当前进程默认的内存页大小(单位字节),绝大多数情况下是 4096 —— 也就是 4KB。
为什么不是所有命令都可靠
有些命令查到的“页大小”其实不是内核分配物理内存的基本单位:
-
sysctl -a | grep 'vm.page-size'在多数发行版里根本不存在这个参数,vm.page-size不是标准 sysctl 项,搜出来往往是误匹配或自定义配置 -
ulimit -a | grep 'page size'显示的是逻辑块大小(block size),单位是 512 字节扇区的倍数,比如输出2048表示 2048 × 512 = 1MB —— 这和内存页完全无关 -
cat /proc/cpuinfo | grep 'page size'查的是 CPU 支持的最小地址映射粒度(如 x86_64 下通常写 4K/2M/1G),但不反映当前内核实际使用的 base page size -
cat /proc/meminfo | grep 'page size'在主流内核中根本不会输出这一行,属于无效尝试
getconf PAGESIZE 的行为和适用场景
它读取的是 POSIX 定义的 _SC_PAGESIZE 系统配置值,由内核在进程启动时注入,代表该进程能拿到的最小可映射内存单位。这是 nginx、redis、nginx proxy_* 配置里真正要对齐的值。
- 对齐用途:比如
proxy_busy_buffer_size建议设为页大小整数倍,避免跨页访问带来 TLB miss - 兼容性:所有 POSIX 兼容系统(Linux、macOS、BSD)都支持,无需 root 权限
- 注意:它不反映大页(HugePage)设置,
Hugepagesize要单独查grep Hugepagesize /proc/meminfo
容易被忽略的细节
同一个系统上,不同进程看到的 getconf PAGESIZE 结果可能不同 —— 如果进程启用了 MAP_HUGETLB 或运行在容器里且被 mlock 限制过,实际分配行为会绕过 base page。但 getconf 始终返回编译时/启动时确定的默认值,不会动态变化。
真要确认某段内存实际用了多大页,得看 /proc/[pid]/smaps 里的 MMUPageSize 和 MMUPFPageSize 字段,而不是依赖 getconf。


















