一文看懂Linux 页表、大页与透明大页

news2024/10/2 10:32:03

一、 内存映射与页表

1. 内存映射

我们通常所说的内存容量,指的是物理内存,只有内核才可以直接访问物理内存,进程并不可以。

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。

虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(单个 CPU 指令可以处理数据的最大长度)的处理器,地址空间的范围也不同。比如最常见的 32 位和64 位系统:

既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。内存映射,其实就是将虚拟内存地址映射到物理内存地址。

2. 页表

为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,如下图所示:

页的大小只有 4 KB ,导致的另一个问题就是,当物理内存很大时,页表会变得非常大,占用大量物理内存。

【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份 价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

 学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

3. 页表的简单工作原理

下图是比较简单情况下的示意图,用于描述在32位系统下,页大小为4K时,操作系统如何为进程的虚拟地址和实际物理地址进行转换:

  • 目录表,是用于索引页表的数据结构,其中存储着目录项(共1024个、每个4B,因此目录表共4B*1024=4K ),每个目录项指向一个页表,即可以存储1024个页表。
  • 页表,用来存放物理地址页的起始地址,即页表项(也是共1024个、每个4B,因此一个页表的大小也是4K),由于目录表最多可存1024个页表,因此页表的最大大小是1024*4K=4M。
  • 页表项,每个页表项指向4K的物理内存页,因此页表一共可以指向的物理内存大小为:1024(页表数)*1024(每个页表的页表项数)*4K(一个页表项指向的物理内存大小)=4G

假如一个进程,访问的物理内存有1GB,即262144个内存页,在32位系统中,页表需要262144*4/1024/1024=1MB,而在64位系统下,页表占用的空间增加1倍,即2MB。

对于Linux系统中运行的Oracle数据库,假如数据库的SGA大小12GB,如果一个Oracle Process访问到了所有的SGA内存,其页表大小会是24MB,如果有300个左右的会话,那么这300个连接的页表会达到7200MB,只不过并不是每个进程都会访问到SGA中所有的内存。

页表大小可以通过 /proc/meminfo 的 PageTables部分查看。

为了解决页表项过多的问题,Linux 提供了两种机制,也就是多级页表和大页(HugePage),后面我们以大页为重点。

二、 大页

大页顾名思义,就是比较大的页,通常是2MB。由于页变大了,需要的页表项也就小了,占用物理内存也减少了。

1. 大页的优点

  • 减少页表大小:默认页面大小为 4K,而大页为 2048K,意味着系统需要处理的页面减少了 512 倍。大页的页表在各进程之间可以共享,也降低了页表的大小。
  • 减少页表遍历:大页覆盖更大的连续虚拟地址范围,使得CPU中的TLB(可理解为CPU对页表的CACHE)命中率大大提高,减少了遍历页表以从虚拟地址获取物理地址的次数。
  • 减少页表查找开销:
  • 避免swap:大页内存只能锁定在物理内存中,不可swap,因此没有page-in/page-out机制开销,避免了swap引起的性能影响。
  • 减少了内存开销:由于要处理的页面数量较少,明显减少了页表访问可能出现的瓶颈。

2. 大页的缺点

  • 要预先分配
  • 需要重启主机生效
  • 当服务器内存或SGA调整时,需要对应调整大页设置
  • 如果分配不当(过多、过少、os参数配置错误),反而可能引起严重问题

严重问题可能包括:

  • (绝)大部分大页内存未能使用,严重浪费内存
  • 数据库性能差
  • 系统内存不足或交换过多
  • 数据库实例无法启动
  • 关键系统服务失败
  • 极高的sys cpu使用率

3. 大页的分配方法

  • 检查/proc/meminfo,确认系统支持HugePage

  • HugePages Total:系统中配置的大页数。
  • HugePages Free:没有访问过的大页数。
  • HugePages Rsvd:已经分配但是还未使用的页面数。
  • Hugepagesize:大页size,这里为2MB,有的内核配置中可能为4MB。

设置memlock

设定oracle用户可以锁定内存的大小。这个参数在/etc/security/limits.conf文件,单位是KB。开启大页时,这个参数很重要,如果设置过小,可能导致大页无法被用到,白白浪费内存。

根据 What is Memlock and How to Calculate the Values for Memlock? (Doc ID 2511230.1) 文档建议:

  • 未启用大页:至少为3G
  • 启用为大页:至少设置为服务器内存的90%
  • 建议大小:内存大小 > memlock大小 >= 大页总内存 > SGA

例如:

oracle soft memlock 18878464
oracle hard memlock 18878464

重新以oracle用户连接到数据库服务器,使用ulimit -a命令便可看到对应设置

  • 改为AUTO方式管理SGA

对于11g,由于HugePage只能用于共享内存,不能用于PGA,所以不能使用AMM,只能分别设置SGA和PGA。SGA同样只能是AUTO方式管理,需要将SGA_TARGET_SIZE设为大于0的合适值。

  • 查看建议的大页数量

到目前为止,大页只能用于共享内存段等少量类型的内存。一旦将物理内存用作大页,那么这些物理内存就不能作其他用途,比如作为进程的私有内存。因此不能将过多的内存设置为大页,通常将大页用作Oracle数据库的SGA。

Oracle Linux: Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration (Doc ID 401749.1) 提供了计算建议值的脚本。需要先设置好SGA等参数、启动Oracle、并以Oracle用户执行该脚本

  • 修改/etc/sysctl.conf文件,设置vm.nr_hugepages=建议值,执行sysctl –p命令

vm.nr_hugepages这个参数值为上步计算出的建议值。然后检查/proc/meminfo,如果HugePages_Total小于设置的数量,表明没有足够的连续物理内存用于这些大内存页,需要重启服务器。

  • 重启服务器和数据库,检查大页使用情况

大页是惰性分配的,用到才会分配。随着数据库的使用,可以在/proc/meminfo中查看HugePages_Free是否已经减少。如果已经减少,表明已经使用到HugePage Memory。

三、 透明大页

在一些Linux系统中,transparent hugepage被默认开启,它允许大页做动态的分配,而不是系统启动后就分配好,根据Oracle MOS DOC:1557478.1,transparent hugepage导致了很多的问题,建议将其关闭。

1. 查看是否启用

#未启用应该看到[never]
cat /sys/kernel/mm/transparent_hugepage/enabled

如果这个文件不存在,则检查

#未启用应该看到[never]
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

如果2个文件都不存在,说明系统内核中移除了THP,例如OEL 7。

2. 关闭透明大页

  • Redhat & Centos
# 重启后失效
echo never > /sys/kernel/mm/transparent_hugepage/enabled 
echo never > /sys/kernel/mm/transparent_hugepage/defrag
 
# 开机时设置never到以上文件中
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
 
chmod +x /etc/rc.d/rc.local
  • SUSE Linux(区别在于开机设置never需要配置到的文件不同)
# 重启后失效
echo never > /sys/kernel/mm/transparent_hugepage/enabled 
echo never > /sys/kernel/mm/transparent_hugepage/defrag
 
# 开机时设置never到以上文件中
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/init.d/boot.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/init.d/boot.local
 
chmod +x /etc/init.d/boot.local

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用Python 快速搭建HTTP服务器

Python具有语法简单、语句清晰的特点,而且Python的兼容性比较好,可以将其他语言制作的模块联结起来,具有强大且丰富的库,封装后可以轻松调用,因此成为编程语言中的“网红“,甚至被称为非计算机从业者的第一语言。 Python在IT就业市场也是最受欢迎、最热门的技术技能…

SpringBoot整合Redis

SpringBoot整合Redis 文章目录SpringBoot整合Redis一 .简介1. redie是什么?2. redie的使用场景?二 . 使用1. 引入依赖2. 配置文件3. 启动redis4. 创建Redis工具类5. 创建测试类6. 查看效果一 .简介 1. redie是什么? Redis是现在最受欢迎的N…

图解计算机的存储器金字塔

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 在计算机组成原理中的众多概念中,开发者接触得最…

LeetCode-剑指43-1-n整数中出现1的次数

1、逐位统计 我们统计每一位k上面可能出现1的次数:1、对于每一位k上面的出现的1,我们首先统计其出现(n/10k)10k−1(n/10^k)\times10^{k-1}(n/10k)10k−1次的1;2、考虑到存在余数的情况,我们还需要比较剩余余数中出现1的次数&…

浅谈HTTP缓存与CDN缓存的那点事

HTTP缓存与CDN缓存一直是提升web性能的两大利器,合理的缓存配置可以降低带宽成本、减轻服务器压力、提升用户的体验。而不合理的缓存配置会导致资源界面无法及时更新,从而引发一系列的衍生问题。本文将分别将从HTTP缓存与cdn缓存的规则、流程、配置入手&…

XSS挑战之旅1-10关

文章目录前言第1关第2关第3关第4关第5关第6关第7关第8关第9关第10关前言 漏洞介绍:XSS漏洞 参考文章:XSS挑战之旅 游戏规则:触发alert()弹窗,进入下一关 第1关 进入第一关 随便输入一下,观测输出,看源代…

还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7

数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别。主要原因是:一方面,数据库开发者对各个级别的理解有细微差异;另一方面,实现层面没有达到理论上的要求。 用户在使用或开发者在交…

147. SAP UI5 SmartTable 控件的使用介绍

本文来自笔者 SAP 开发技术交流知识星球内一位朋友的提问: smartfilter bar 有个输入框Cost Element绑定了cds实现value help 请问其对应的suggestion功能是通过cds的注解实现的嘛? 要回答这个问题,我们必须首先掌握 SAP UI5 SmartTable 控件的使用方式,然后才能深入探究 …

【Tensorflow】使用Tensorflow自定义模型和训练

Tensorflow的核心与NumPy非常相似,但具有GPU支持;Tensorflow支持分布式计算(跨多个设备和服务器)。 像NumPy一样使用TensorFlow 运算符是在Python 3.5 中添加的,用于矩阵乘法,等效于 tf.matmul() 函数。…

C++数据结构迷宫哈希表二叉树

C数据结构迷宫哈希表二叉树 《数据结构》应用系统设计——迷宫问题 问题描述:设计算法求出并显示从入口点到出口点可沿八个方向前进的一条通路,或显示没有通路 难度:易 基本要求: (1)键盘(或文件)输入迷宫行数m和列数n,计算机随机生成迷宫(或从文件读入…

robots (攻防世界)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 进入网址 啥也没有 解题工具: 额...浏览器? (可能还需要百度) 问题解析: 科普时间到 robots协议也称爬虫协议、爬虫规则等, 是指网站建立一个robots.txt文件来告诉搜索引擎哪些…

安卓 手机硬改 工具下载 一键新机 改串 抹机 root隐藏 改串号MEID imei SN信息 工具教程分享

一键新机、模拟机型、一键备份、还原APP数据、ROOT隐藏、修改数据、保护隐私 一键新机 超过3000机型一键模拟、无束缚轻松做注册、激活、留存 安卓/IOS(进行中) 支持目前最流行的机型,安卓全机型兼容,我们坚持领先一步 操作简单 适合脚本作者 群控…

为了验证某些事,我实现了一个toy微前端框架【万字长文,请君一览】

众所周知微前端是企业中前端发展的必经之路。 我司搭建了自己的微前端脚手架工具,它将项目变成了“多页应用”,跳转方式由 location.href 这类api进行。所以笔者之前在想:这种方式跳转能不能有动画效果呢? 在“上层建筑”中进行“…

【文件同步和备份软件】上海道宁为您带来GoodSync软件,让您轻松备份和同步您的文件

GoodSync发布于2006年 是一种简单可靠的文件同步和 备份解决方案 使用GoodSync可以轻松备份和 同步您的文件 确保您的文件绝对不会丢失 GoodSync企业版是 为商用设计的 数据备份、同步和恢复软件 适用于所有平台、项目或业务环境 保护我们的商业数据 开发商介绍 Siber…

golang开发相关面试题

目录 go有哪些数据类型? 方法与函数有什么区别? 方法中值接收者与指针接收者的区别是什么? 函数返回局部变量的指针是否安全? 函数参数传递值是值传递还是引用传递? defer关键字的实现原理? 内置函数make和new的区别? slice底层实现原理? array与slice的区别是…

GICv3和GICv4虚拟化

本文档翻译自文档Arm Generic Interrupt Controller v3 and v4 - Virtualization 1 虚拟化 Armv8-A选择性的支持虚拟化。为了完成该功能,GICv3也支持虚拟化。GICv3中对虚拟化的支持包括如下功能: CPU Interface寄存器的硬件虚拟化产生和发送虚拟中断的…

pytorch深度学习实战lesson14

第十四课 丢弃法(Dropout) 目录 理论部分 实践部分 从零开始实现: 简洁实现: 理论部分 这节课很重要,因为沐神说这个丢弃法比上节课的权重衰退效果更好! 为什么期望没变? 如上图所示&#…

java main方法控制日志级别

背景: 今天想用main方法去调用http请求,结果已经没什么问题了,但是打印了一大堆Http业务内部的日志信息,特别挡路,导致想看到的业务输出看不到,所以经过多方求证,进行了日志等级处理。 默认情…

【Pytorch with fastai】第 5 章 :图像分类

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

电商项目缓存问题的解决方案(初步)

内容分类 容量规化 架构设计 数据库设计 缓存设计 框架选型 数据迁移方案 性能压测 监控报警 领域模型 回滚方案 高并发 分库分表 优化策略 负载均衡 软件负载 nginx:它自身的高可用是用lvs去保证。 下单需要登录 > 需要Session > 分布式Ses…