一文读懂Linux内核内存映射与页表
内容提要
本文介绍了内存映射和页表的工作原理,进程通过内存映射将虚拟内存地址映射到物理内存地址,通过页表记录映射关系。大页可以减少页表大小和遍历次数,避免swap和减少内存开销。建议关闭透明大页。
延伸解读
页表内存开销的实际影响
文章以Oracle数据库为例,说明页表大小与进程访问的内存范围直接相关。在64位系统中,页表项占用空间比32位系统增加一倍。如果大量进程都访问大块共享内存,页表总开销可能非常可观。读者可以通过/proc/meminfo中的PageTables字段监控当前页表占用的物理内存,评估是否需要优化。
大页的适用场景与权衡
大页主要适合Oracle SGA这类共享内存,能减少页表大小和遍历开销,并避免swap。但大页需要预先分配、重启生效,且调整内存或SGA时需同步调整大页设置。分配不当可能导致内存浪费、性能下降甚至实例无法启动。因此,是否使用大页需结合具体负载和运维能力权衡。
透明大页的风险与关闭建议
透明大页允许动态分配大页,但根据Oracle MOS文档,它导致了许多问题,因此建议关闭。文章给出了Redhat/CentOS和SUSE Linux下的关闭方法,通过修改rc.local或boot.local文件,在启动时将transparent_hugepage的enabled和defrag设置为never。对于运行Oracle等关键数据库的系统,关闭透明大页是常见的优化步骤。
Q&A
内存映射的作用是什么?
内存映射将虚拟内存地址映射到物理内存地址,使得进程能够间接访问物理内存。
页表的主要功能是什么?
页表记录虚拟地址与物理地址的映射关系,帮助操作系统管理内存。
大页的优点有哪些?
大页可以减少页表大小、降低遍历次数、避免swap,并减少内存开销。
使用大页时需要注意哪些缺点?
大页需要预先分配,可能导致内存浪费,并且在调整内存时需要重新配置。
如何检查系统是否支持大页?
可以通过查看/proc/meminfo中的HugePages部分来确认系统支持情况。
透明大页的默认设置是什么?
在某些Linux系统中,透明大页默认开启,但可能导致性能问题,建议关闭。