linux 的内存管理是以页为单位进行管理的,标准的页大小是4kb,也就是4096字节。而linux允许配置定义更大大小的页。例如2M,1G,这就是大内存页。
大内存页就是页的大小更大,例如可以配置 2M,1G大小的页。
这里要注意,大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上,这部分内存相当于是被预留
也就是大页内存类似专用内存,会从系统中抠出一块大内存(pagesize*nr_pages),而想要使用这块内存,应用程序必须修改程序,使用上述几种方式来使用大页。 其次,如果程序内存使用较少,却申请了大页,也会造成内存浪费。
使用大页可以减少访问页表条目所需的系统资源量来提高系统性能。
linux中,每个进程都有一个完整的虚拟内存地址,进程访问虚拟内存地址,内核通过页表(映射虚拟内存地址到物理内存地址)访问真正的物理内存地址。
所以,对于每个页的访问,都需要内核加载相关的映射,而这个动作是有一定消耗的。
当一个进程需要大量内存的时候,例如1G,那么就会有262144页,也会在页表中占用262144个页表项,而TBL无法缓存这么多页表项,于是会出现大量未命中的情况,就只能去加载页表,导致性能下降。
如果使用2M的大内存页,那么就只需要512页,也只需要512个页表项,可以大大增加TBL的命中率,提高进程性能。
(注释:
TLB是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。
TLB的大小是4KB)
memlock是最大锁定内存地址空间(kb) 。
memlock参数指定用户可以锁定其地址空间的内存量。而打野内存就是已锁定在物理内存中。
编辑/etc/security/limits.conf配置memlock,配置的值比你服务器的内存稍微小一点
例如服务器内存是2G,我这里配置的是1900000
* soft memlock 1900000
* hard memlock 1900000
然后重新登录服务器,用 ulimit -l 命令就可以看memlock的值已经生效
cat /proc/meminfo |grep -i HugePage 查看大页配置情况
对应参数的意义:
HugePages_Total: 0 总共大页数目
HugePages_Free: 0 空闲数目
HugePages_Rsvd: 0 预留数目
HugePages_Surp: 0
Hugepagesize: 2048 kB
修改配置文件 /etc/sysctl.conf 添加如下参数
vm.nr_hugepages = 10
然后sysctl -p生效配置,这个时候再查看大页配置,会发现已经生效
cat /proc/meminfo |grep -i HugePage
1、一般oracle会使用到
2、我所在的公司,宿主机分配kvm的场景中,给宿主机也配置使用了大页内存
欢迎关注我的公众号:龙叔运维
持续分享运维经验