《Linux从小白到高手》综合应用篇:详解Linux系统调优之深入理解Huge Pages和Transparent Huge Pages

news2024/10/12 2:57:49

本篇深入介绍Linux Huge Pages和Transparent Huge Pages.
我在前一篇博文(《Linux从小白到高手》综合应用篇:详解Linux系统调优之内存优化)中说过,很多人可能对大页内存(Huge Pages)和透明大页(Transparent Huge Pages)存在很多迷糊。本篇就来详细深入讨论下。

大页内存(Huge Pages)

1. 大页内存(Huge Pages)概述及配置

大页内存是Linux内核提供的一种内存管理机制,允许分配连续的物理内存页面,每个页面大小通常为2MB(在x86_64架构上)。这种机制可以减少大内存访问时的页面表条目数量,从而减少TLB(Translation Lookaside Buffer)缺失,提升性能。

  1. 配置方法
    检查系统是否支持:
cat /proc/meminfo | grep HugePages

在这里插入图片描述
e2aff2644a2ba212774787fb895.png)

–如果输出结果中包含“HugePages_Total”和“HugePages_Free”字段,(如上图演示)则表示系统支持HugePages。
确定所需数量:
–根据应用需求和大页大小来确定所需的HugePages数量。例如,如果需要分配2GB的内存,并且大页大小为2MB,则所需的HugePages数量为1024。
配置HugePages:
–通过修改内核参数来配置HugePages。
–编辑/etc/sysctl.conf文件,并添加如下行(其中“1024”是所需的HugePages数量):vm.nr_hugepages=1024;
–然后执行sysctl -p命令来加载新的内核参数配置。
为应用程序分配:
–在应用程序启动脚本中设置HUGETLB_MORECORE=yes环境变量来启用HugePages支持。

2.Linux设置大页的目的

  1. 提高内存访问效率:
    减少页表大小:
    –大页内存使用更大的内存页面,相比传统的 4KB 小页,页表项数量大大减少。这降低了内存管理单元(MMU)在进行地址转换时查找页表的开销,提高了内存访问的速度。
    –降低 TLB(Translation Lookaside Buffer)未命中次数:TLB 是一种缓存,用于存储最近使用的虚拟地址到物理地址的映射。大页内存可以增加 TLB 的覆盖范围,减少 TLB 未命中的概率,从而加快内存地址转换速度。
    –对于内存密集型应用,如数据库服务器、高性能计算等,大页内存可以显著提高内存访问性能,减少 CPU 等待时间,提高系统的整体吞吐量。
  2. 优化内存管理:
    –减少内存碎片:大页内存的分配通常需要连续的物理内存区域。通过使用大页内存,可以减少内存碎片的产生,提高内存分配的成功率。这对于长期运行的服务器系统尤为重要,因为内存碎片可能会导致系统在运行一段时间后无法分配足够的连续内存,从而影响系统的稳定性和性能。
  3. 简化内存管理:
    –大页内存的管理相对简单,减少了内核在内存分配和回收过程中的复杂性。可以降低内核的开销,提高系统的响应速度。
  4. 提高应用程序性能:
    –一些应用程序,特别是那些对内存访问性能要求极高的应用,如数据库系统、科学计算软件等,可以通过显式地使用大页内存来提高性能。这些应用程序可以在启动时指定使用大页内存,或者通过特定的 API 来分配大页内存。
    –大页内存可以提高应用程序的缓存命中率,减少内存访问延迟,从而提高应用程序的执行速度。
    HugePages需要手动配置,且对应用程序透明度较低,适用于对内存布局敏感或需要严格控制内存分配的应用。

3. 大页内存的优缺点

  1. 优点:
    性能提升显著:
    –减少页表大小,降低内存管理开销。由于大页使用更大的页面尺寸,页表中的条目数量大幅减少,这使得内存管理单元(MMU)在进行地址转换时的查找速度更快,从而提高了内存访问效率。
    –降低 TLB(Translation Lookaside Buffer)未命中次数。TLB 是一种高速缓存,用于存储最近使用的虚拟地址到物理地址的映射。大页能够增加 TLB 的覆盖范围,减少 TLB 未命中的概率,进而加快内存地址转换速度,提高系统性能。
    –对于内存密集型应用,如数据库服务器、科学计算等,大页内存可以显著提高应用程序的执行速度和响应时间。
    减少内存碎片:
    –大页内存的分配通常需要连续的物理内存区域。这有助于减少内存碎片的产生,提高内存分配的成功率。在长期运行的服务器系统中,内存碎片可能会导致系统无法分配足够的连续内存,从而影响系统的稳定性和性能。大页内存可以降低这种风险,提高系统的可靠性。
  2. 缺点:
    管理复杂性:
    –需要手动配置。管理员需要明确指定系统中使用的大页数量,这需要对系统的内存需求有较为准确的了解。如果配置不当,可能会导致内存浪费或不足的情况。
    –应用程序兼容性问题。一些应用程序可能需要特殊的配置才能使用大页内存,否则可能会出现性能下降或错误。与某些内存管理特性(如Oracle的AMM)可能存在冲突。
    资源占用:
    –大页内存一旦分配,通常会一直占用物理内存,即使应用程序暂时不需要使用全部的大页内存。这可能会导致在某些情况下内存资源的浪费,特别是当系统中有多个应用程序同时运行时,可能会出现大页内存分配不均的情况。

透明大页(Transparent HugePages,THP)

1. 透明大页概述及配置

透明大页是Linux内核的一个更高级的特性,旨在自动且透明地为大内存分配提供大页支持,无需应用程序做特殊改动。它在运行时自动将小页聚合为大页,或者将大页拆分为小页,以满足不同场景的需求。

  1. 配置方法
    全局配置:在Linux系统中,透明大页的配置文件通常位于/sys/kernel/mm/transparent_hugepage/enabled:
    在这里插入图片描述
    可以通过echo命令来启用、禁用或按需启用透明大页。例如:
    启用透明大页:
echo always > /sys/kernel/mm/transparent_hugepage/enabled

禁用透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

按需启用透明大页:

echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
  1. 碎片整理配置:透明大页的碎片整理可以合并系统中分散的小页面以创建更大的页面,减少内存碎片化并提高性能。可以通过/sys/kernel/mm/transparent_hugepage/defrag文件来配置碎片整理行为。

2.Linux设置透明大页的目的

  1. 自动优化内存使用:
    –透明大页允许内核自动管理大页的分配和使用,无需管理员手动配置大页内存的数量。这使得系统可以根据实际的内存需求动态地调整大页的使用,提高内存的利用率。
    –对于那些无法或不方便显式使用大页内存的应用程序,透明大页可以在不修改应用程序代码的情况下潜在地提高性能。
  2. 简化系统管理:
    –透明大页减少了管理员手动配置大页内存的工作量。管理员无需预先确定大页的数量,也无需为每个应用程序进行特殊的配置。这降低了系统管理的复杂性,提高了管理效率。
  3. 适应不同的应用场景:
    –透明大页可以根据系统的负载和内存使用情况自动调整大页的分配策略。在不同的应用场景下,系统可以自动优化内存使用,提高性能。例如,在内存密集型应用运行时,透明大页可以自动分配更多的大页内存,以满足应用程序的需求;而在内存需求较低时,系统可以回收大页内存,以释放资源。

3. 透明大页内存的优缺点

  1. 优点:
    自动管理:
    –透明大页由内核自动管理,无需管理员手动配置大页数量。这大大降低了系统管理的复杂性,提高了管理效率。内核会根据系统的内存使用情况动态地分配和回收大页内存,以优化系统性能。
    应用程序兼容性好:
    –对应用程序透明,无需应用程序进行特殊的配置即可潜在地受益于大页内存。这使得透明大页在各种应用场景下都能发挥作用,而不会对应用程序的开发和部署造成额外的负担。
  2. 缺点:
    性能不确定性:
    –由于透明大页是自动管理的,其性能可能会受到系统负载和内存使用情况的影响。在某些情况下,透明大页的分配可能会导致延迟,特别是当系统内存紧张时,内核可能需要进行内存整理来分配大页,这可能会影响应用程序的响应时间。
    –兼容性问题:
    尽管透明大页对大多数应用程序是透明的,但在一些特殊情况下,某些应用程序可能与透明大页的机制不完全兼容。例如,一些对内存访问模式有严格要求的应用程序可能会受到透明大页的影响,导致性能下降或出现错误。在某些特定环境下(如RAC环境)可能导致异常节点重启或性能问题。
    管理难度:
    –虽然透明大页自动管理,但在某些情况下,管理员可能需要对透明大页的行为进行监控和调整。例如,如果发现透明大页导致性能问题,管理员可能需要禁用透明大页或调整相关的内核参数。然而,由于透明大页的自动管理特性,这种调整可能会比较复杂。

优化调整建议

对于对内存布局敏感或需要严格控制内存分配的应用,可能更适合使用HugePages;而对于希望减少配置复杂度并能接受一定性能波动的应用,则THP更为合适。

本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。

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

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

相关文章

[spring]spring事务和事务传播机制

文章目录 一. 事务Spring中的事务实现编程式事务声明式事务TransactionalTransactional作用 Transactional详解1. rollbackFor2. 事务隔离级别mysql事务隔离级别Spring事务隔离级别 3. 事务传播机制什么是事务传播机制事务传播机制有哪些Spring事务传播机制使用REQUIRED(加入事…

【翻译】自定义 Qt Designer 窗体

原文地址:Customizing Qt Widgets Designer Forms 【翻译】Qt Designer 最新中文手册文档(Qt6) Qt Designer设计窗体保存为一个UI文件时,一些窗体设定参数,比如栅格、默认布局的边距(margin)和间…

【cpp】模板函数 模板类 特化 书写格式备忘

outline 收集的关于使用 模板函数 模板类 特化 偏特化的笔记 用以快速回忆 模板类 普通使用 类内定义成员函数 #include <iostream> using namespace std;template <typename T> class MyContainer { private:T element;public:MyContainer(T elem) : element(…

低代码可视化-uniapp商城首页小程序-代码生成器

在设计一个小程序的首页时&#xff0c;包含轮播图、通知栏和商品列表这三个元素是非常常见且有效的布局方式。这样的设计既能够吸引用户的注意力&#xff0c;又能够高效地展示信息和商品。 轮播组件 小程序首页幻灯片通常位于小程序的顶部或显著位置&#xff0c;通过滑动屏幕可…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

看镭速如何解决半导体行业跨国传输大文件效率低的难题

随着全球经济的融合&#xff0c;半导体行业迎来了迅猛的发展&#xff0c;跨国合作变得司空见惯。相应地&#xff0c;跨国大文件传输的需求也在持续增长。不过&#xff0c;半导体行业在跨国传输大文件时&#xff0c;常常遇到效率不高和安全难以保障的问题。因此&#xff0c;半导…

H3C IPsec+IKE 野蛮模式配置实验

H3C IPsecIKE 野蛮模式配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;R3出接口自动获取公网IP地址在 R1 上配置默认路由连通公网在 R1 和 R3 上配置 IPsec VPN&#xff0c;使两端私网可以互相访问 实验步骤 按照图示配置 IP 地址&#xff0c;R3出接口…

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题)

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题) 在GitHub上从操作 创建一个 GitHub 仓库: 登录 GitHub,创建一个新的仓库来存储图片。 生成 GitHub 令牌: 在 GitHub 中,前往“Settings” > “Developer settings” > “Pers…

Rpc框架开发——客户端框架设计

目录 一、Requestor 二、RpcCaller 三、Publish_Subscribe 四、Registry-Discovery 五、Client 在客户端的模块划分中&#xff0c;基于以上理解的功能&#xff0c;可以划分出这么几个模块 Protocol&#xff1a;应用层通信协议模块 Network&#xff1a;网络通信模块 Disp…

前端vue部署网站

这里讲解一下前端vue框架部署网站&#xff0c;使用工具是 xshell 和 xftp &#xff08;大家去官网安装免费版的就行了&#xff09; 服务器 我使用的阿里云服务器&#xff0c;买的是 99 一年的&#xff0c;淘宝有新手9.9 一个月服务器。可以去用&#xff0c;学生的话是有免费三…

进程状态|进程优先级

目录 一、进程状态 1.什么是进程状态 2.进程状态都包含什么&#xff1f; 3.进程状态的查看 4.进程退出 &#xff08;1&#xff09;进程退出的步骤 &#xff08;2&#xff09;僵尸进程 &#xff08;3&#xff09;孤儿进程 二、进程优先级 1.进程优先级是什么&#xff…

二分查找一>0~n-1中缺失的数字(点名)

1.题目&#xff1a; 2.解析&#xff1a;方法一&#xff1a;用哈希表&#xff1a;记录存在的数字&#xff0c;找到哈希表为空的数字输出 Set<Integer> set new HashSet<>();for(int x : records) set.add(x);for(int i 0; i < set.size(); i){if(!set.contain…

重新学习Mysql数据库3:Mysql存储引擎与数据存储原理

本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客&#xff1a; www.how2playlife.com 本文是微信公众号【Java技术江湖…

STM32与QT实现串口传输结构体含源码

文章目录 一. 关于数据传输的方式1.1 基本数据类型传输1.2 结构体传输 二. STM32与QT实现串口传输结构体实例2.1 下位机的实现2.2 上位机的实现2.3 演示Demo 三. 注意事项3.1 关于字节对齐问题3.2 关于大小端问题 一. 关于数据传输的方式 在日常开发过程中&#xff0c;我们时常…

使用aloam跑hesai Pandar-XT32激光雷达数据

参考自利用aloam跑数据集_aloam数据集-CSDN博客 第一步&#xff1a;查看bag的信息 输入rosbag info来查看bag包的信息&#xff1a; joeyjoey-Legion-Y7000P-IRX9:~$ rosbag info /home/joey/Downloads/data2022/indoor/LiDAR_IMU.bag path: /home/joey/Downloads/da…

Java_EE 多线程技术(Thread)

多线程与并发编程 多线程介绍什么是程序&#xff1f;程序&#xff08;Program&#xff09;是一个静态的概念&#xff0c;一般对应于操作系统中的一个可执行文件。什么是进程?执行中的程序叫做进程(Process)&#xff0c;是一个动态的概念。其实进程就是一个在内存中独立运行的程…

2025秋招倒计时---招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

股市期市内外盘高频分钟tick及均线策略分享

【数据库】银河金融数据库&#xff08;yinhedata.com&#xff09;可以获取大量历史行情数据&#xff0c;包含分钟&#xff0c;tick&#xff0c;日。不限于国内外&#xff0c;股票期货基金&#xff0c;ETF、期权等 【策略分享】一、引言均线策略作为技术分析的重要工具&#xff…

Kubesphere4.1插件网关、devops控制页面白页面问题解决

在使用Kubesphere4.1版本时&#xff0c;安装完成devops插件后‘DevOps项目’管理页面出现白页面&#xff0c;无法进行配置。包括网关等控制页面都会出现白页面。 经过查看版本信息发现是4.1版本存在问题&#xff0c;目前不支持。 处理问题&#xff1a; 目前 Kubesphere发布了4…

【软件测试】最佳软件测试基础入门教程

目录 前言一、顺序式开发模型二、 瀑布模型三 、V型模型四、迭代和增量开发模型五、 项目和产品背景下的软件开发 前言 软件开发生命周期的测试 本章简要介绍了软件开发项目中常用的生命周期模型&#xff0c;并解释了测试在每个模型中扮演的角色。它讨论了各种测试级别和测试…