首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux+分配大页内存

在 Linux 系统中,分配大页内存(Huge Pages)可以显著提高某些应用程序的性能,特别是那些对内存访问延迟敏感的应用,如数据库、高性能计算(HPC)应用等。以下是关于如何在 Linux 中分配和管理大页内存的详细指南。

1. 大页内存概述

  • 标准页大小:通常为 4KB。
  • 大页内存:常见的大小有 2MB 和 1GB,具体取决于硬件和内核配置。
  • 优势
    • 减少 TLB(Translation Lookaside Buffer)缺失,提高内存访问速度。
    • 降低内存管理的开销,提高缓存命中率。

2. 检查当前大页内存配置

查看系统支持的大页大小

代码语言:javascript
复制
cat /sys/kernel/mm/hugepages/

输出示例:

代码语言:javascript
复制
hugepages-2048kB/nr_overcommit_hugepages
hugepages-2048kB/nr_hugepages
hugepages-2048kB/memsize
hugepages-1048576kB/nr_overcommit_hugepages
hugepages-1048576kB/nr_hugepages
hugepages-1048576kB/memsize

查看当前已分配的大页数量

代码语言:javascript
复制
cat /sys/kernel/mm/hugepages-<size>/nr_hugepages

例如,查看 2MB 大页的数量:

代码语言:javascript
复制
cat /sys/kernel/mm/hugepages-2048kB/nr_hugepages

3. 配置大页内存

临时配置(重启后失效)

设置 2MB 大页数量为 1024

代码语言:javascript
复制
echo 1024 > /sys/kernel/mm/hugepages-2048kB/nr_hugepages

设置 1GB 大页数量为 1

代码语言:javascript
复制
echo 1 > /sys/kernel/mm/hugepages-1048576kB/nr_hugepages

永久配置(重启后生效)

  1. 编辑 /etc/default/grub 文件 找到 GRUB_CMDLINE_LINUX 行,添加大页配置参数。例如,设置 2MB 大页数量为 1024: GRUB_CMDLINE_LINUX="... hugepages=1024" 如果需要同时配置不同大小的大页,可以使用逗号分隔: GRUB_CMDLINE_LINUX="... hugepages=1024 hugepagesz=1G hugepages_1G=1"
  2. 更新 GRUB 配置 sudo grub2-mkconfig -o /boot/grub2/grub.cfg 或者对于使用 grub 的系统: sudo update-grub
  3. 重启系统 sudo reboot
  4. 验证配置 系统重启后,检查大页配置是否生效: grep Huge /proc/meminfo 输出示例: HugePages_Total: 1024 HugePages_Free: 1024 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB

4. 在应用程序中使用大页内存

使用 mmap 分配大页内存

代码语言:javascript
复制
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

#define HUGETLB_FLAG_LARGE | MAP_HUGETLB
#define PAGE_SIZE 2147483648UL // 2GB

int main() {
    int fd = open("/dev/hugepages/my_hugepage_file", O_RDWR | O_CREAT, 0755);
    if (fd < 0) {
        perror("open");
        return 1;
    }

    // 预留 2GB 大页内存
    ftruncate(fd, PAGE_SIZE);

    void *addr = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
                      MAP_SHARED | MAP_HUGETLB, fd, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return 1;
    }

    // 使用大页内存...

    munmap(addr, PAGE_SIZE);
    close(fd);
    return 0;
}

使用环境变量指定大页内存路径

代码语言:javascript
复制
export HUGETLB_PATH=/mnt/hugepages

然后在应用程序中使用 mmap 时,大页内存将自动从指定路径分配。

5. 常见问题排查

检查大页内存是否被正确分配

代码语言:javascript
复制
cat /proc/meminfo | grep Huge

查看大页内存使用情况

代码语言:javascript
复制
cat /sys/kernel/mm/hugepages-<size>/nr_overcommit_hugepages

权限问题

确保 /dev/hugepages 目录存在且具有适当的权限:

代码语言:javascript
复制
sudo mkdir -p /mnt/hugepages
sudo mount -t hugetlbfs nodev /mnt/hugepages
sudo chown root:root /mnt/hugepages
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux内存页分配策略

但有时候内核需要分配一些物理内存地址也连续的内存页, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存页....上一节说过, 内核使用 alloc_pages() 函数来分配内存页, 而 alloc_pages() 函数最后会调用 rmqueue() 函数来分配内存页, rmqueue() 函数原型如下: static...struct page * rmqueue(zone_t *zone, unsigned long order); 参数 zone 是内存管理区, 而 order 是要分配 2order 个内存页....所以, 使用伙伴系统算法只能分配 2order (order为0,1,2,3...)个页面. 那么order是不是无限大呢? 当然不是, 在Linux内核中, order的最大值是 10....如果申请到的内存块比要申请的大小大, 那么需要调用 expand() 函数来把内存块分裂成指定大小的内存块.

3.3K10

全网最硬核 JVM 内存解析 - 3.大页分配 UseLargePages

的内存与实际占用内存的差异 JVM commit 的内存与实际占用内存的差异 大页分配 UseLargePages(全网最硬核 JVM 内存解析 - 3.大页分配 UseLargePages...JVM 内存申请与使用流程 2.3. 大页分配 UseLargePages 前面提到了虚拟内存需要映射物理内存才能使用,这个映射关系被保存在内存中的页表(Page Table)。...我们要么缩小程序所需内存,要么增大页大小。我们一般会考虑增加页大小,这就大页分配的由来,JVM 对于堆内存分配也支持大页分配,用于优化大堆内存的分配。那么 Linux 环境中有哪些大页分配的方式呢?...如果读取 /proc/meminfo 获取默认大页大小读取不到或者为 0,则代表系统也不支大页分配,大页分配也不启用。...这里只是验证下这些大页内存的分配方式是否可用,只有可用后面真正分配内存的时候才会采用那种可用的大页内存分配方式。

1.1K10
  • 【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

    文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "..." 物理内存空间 “ 映射到 ” 虚拟内存空间 " , 其中的数据是随机值 ; 二、内存映射原理 ---- 1、分配虚拟内存页 分配 虚拟内存页 : 在 Linux 系统中 创建 " 内存映射 “ 时..., 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ; 3、分配物理内存页 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 "...缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射 与 共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用

    8.5K21

    Linux申请大页内存(mmap)

    ---- 1.为什么要使用大页内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...操作系统默认支持的大页是2MB,当使用1GB内存时,在页表中将占用 1GB / 2MB = 512个页表项,可以大大提升TLB命中率,进而提升应用性能。...---- 2.怎样使用大页内存 2.1 先预留一定量的大页内存 #先查看系统有多少已经预留的大页内存 # cat /proc/meminfo |grep -i huge #预留192个大页 # sysctl...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大页内存的好处不仅是减少TLB未命中次数,而且大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上...,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,大页内存在物理上是连续的,对于大内存访问也有一定的加速效果。

    11.9K110

    高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)

    1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块....分配到其中的页可能位于物理内存中的任何地方. 通过修改负责该区域的内核页表, 即可做到这一点. ? ?...v=4.7, line 1354 由于各个vmalloc子区域之间需要插入1页(警戒页)作为安全隙, 内核首先适当提高需要分配的内存长度. static struct vm_struct *__get_vm_area_node...接下来从物理内存分配各个页 最后将这些页连续地映射到vmalloc区域中, 分配虚拟内存的工作就完成了....unmap_vm_area使用找到的vm_area实例,从页表删除不再需要的项。与分配内存时类似,该函 数需要操作各级页表,但这一次需要删除涉及的项。它还会更新CPU高速缓存。

    3K10

    笔记 Lab5: Lazy Page Allocation | 内存页懒分配

    实现一个内存页懒分配机制,在调用 sbrk() 的时候,不立即分配内存,而是只作记录。在访问到这一部分内存的时候才进行实际的物理内存分配。...,就为其分配物理内存,并在页表建立映射: // kernel/trap.c // // handle an interrupt, exception, or system call from user...uvmlazytouch(va); // 分配物理内存,并在页表创建映射 } else { // 如果不是缺页异常,或者是在非懒加载地址上发生缺页异常,则抛出错误并杀死进程...懒分配的内存页在被 touch 后就可以被使用了。...懒分配不应该给这个地址分配物理页和建立映射,而应该直接抛出异常) (解决 usertests 中的 stacktest 失败的问题) 页表项不存在 // kernel/vm.c // touch a

    83720

    【Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元

    1.5K40

    Linux页框分配器之内存碎片化整理

    页框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下: static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned...什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...外部碎片化: 指系统中无法利用的小内存块。例如系统剩余内存为16K bytes,但是这16K bytes内存是由4个4K bytes的页面组成,即16K内存物理页帧号#1不连续。...在系统剩余16K bytes内存的情况下,系统却无法成功分配大于4K的连续物理内存,该情况就是内存外碎片导致。...蓝色表示空闲的页面,白色表示已经被分配的页面,可以看到如上内存域的空闲页面(蓝色)非常零散,无法分配大于两页的连续物理内存。

    2.7K20

    【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 )

    文章目录 一、伙伴分配器引入 二、页块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 页分配器 “ 管理 ” 物理页 " , " 伙伴分配器 “ 就是 ” 页分配器 " , 其特点是 算法简单 , 性能高效 ; 二、页块、阶 ---- 伙伴分配器 有如下概念...n 个 连续的 " 物理页 " ; 如 : 0 阶页块是 2^0 = 1 个 连续的 " 物理页 " ; 1 阶页块是 2^1 = 2 个 连续的 " 物理页 " ; 2 阶页块是 2...1 个物理页 页号 是 2^n 的整数倍 ; ③ 合并页块 : 如果需要合并这两个 n 阶页块为 n + 1 阶页块 , 则第 1 页的 物理页 页号必须是 2^{n + 1}...整数倍 ; 0 页 与 1 页是伙伴 ; 2 页 与 3 页是伙伴 ; 1 页 与 2 页不是伙伴 , 这两页如果合并成页块 , 其第一页的页号不是 2^{n + 1} 整数倍

    1K20

    Netty内存分配

    对于小的对象来说,直接由线程的局部缓存来完成,大对象那就由自旋锁来减少多线程下的竞争)的设计思路,但是 Jemalloc 设计的更复杂,虽然也有线程缓存的特性,但是 Jemalloc 将内存分配的粒度划分为...虽然有众多的内存分配器,但是它们的核心都是一致的: 高效大的内存分配和回收,提升单线程或者多线程场景下的性能; 减少内存碎片,包括内部碎片和外部碎片,提升内存的有效利用率。...这边有个内存碎片的概念,可以介绍下,Linux 中物理内存会被分成若干个 4k 大小的内存页 Page,物理内存的分配和回收都是基于 Page 完成的,内部碎片就是 Page 内部产生的碎片,外部碎片就是各个...执行内存分配,提高内存分配的使用效率。...内存的分配策略 分配内存大于 8k,PoolChunk 中采用的 Page 级别的内存分配策略 假设我们依次申请了 8k、16k、8k 的内存 首先根据分配内存大小计算二叉树所在节点的高度,然后查找对应高度中是否存在可用节点

    53120

    java内存分配

    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。...应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。...Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针...堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。...但缺点是,由于要在运行时动态分配内存,存取速度较慢。   栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    2.1K50

    连续内存分配

    为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。 在内存分配之前,我们需要知道内存保护的问题。首先,用户进程之间彼此不能影响,用户进程也不能影响操作系统。...连续内存分配是最简单的一种方法,它主要用于批处理系统。给内存分为固定大小的块。每个块只能容纳一个进程。这样一个个大小不同的内存分块就形成了,当新进程需要内存的时候,系统会为它找一块足够大的孔。...如果孔很大,那么剩余的部分还会作为一个孔,当进程退出的时候,它将释放内存。如果新的孔和旧的孔在一起,那么可以合并它们。但是新进程需要内存的时候,将哪个合适的孔分配给它?...不连续的小孔最终就会无法容纳一个进程,导致产生碎片化的内存。还有一种碎片是内部碎片,一般系统分配的内存是2的次方,而不是你需要多大分配的就刚好是这么大。...这样只要有物理内存就可以为进程分配。主要有两种实现方案分页和分段。它们还可以合并使用。

    1.8K20

    【Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )

    文章目录 一、获取首选内存区域 二、异步回收内存页 三、最低水线也分配 四、直接分配内存 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析...| __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 : 首先 , 根据 gfp_t gfp_mask..." 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 2 种物理页分配方式 ; 继续接着上一篇博客 【Linux 内核 内存管理】物理分配页 ⑦...慢速路径 内存分配 调用函数 的后续部分源码 ; 一、获取首选内存区域 ---- 获取 " 首选内存区域 " , 如果获取失败 , 则 goto 跳转到 nopage 标号位置运行后续代码 ; /*...wake_all_kswapds 函数 , 异步 回收 物理内存页 , 这里的异步 是通过 唤醒 " 回收线程 " 进行回收内存页的 ; if (gfp_mask & __GFP_KSWAPD_RECLAIM

    1.5K20

    数组大小分配(动态内存分配)

    这种分配固定大小内存分配的方法称为静态内存分配。...为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。...动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。...从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点: 不需要预先分配内存空间 分配的空间可以根据程序的需要扩大或缩小 1.如何实现动态内存分配及其管理 要实现根据程序的需要动态分配存储空间...free函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

    2.6K20

    Go 内存管理 -- 内存分配 二

    接上一篇,下面来看看内存分配的初始化、分配等。...初始化 首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。...内存分配 针对于不同大小的的对象,go的分配策略是不同的: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配...(32KB, -) : 大对象分配 Tiny分配和大对象分配都属于内存管理的优化范畴,这里就仅看正常分配。...go的内存分配非常复杂,中间还有很多GC的细节在里面,一言半语的也说不详细,大家可以对着简单的纲要直接看源码,注释也非常详细,一定要对照上一篇的图来理解go内存管理。

    1.7K30

    【Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )

    文章目录 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) 1、分配虚拟内存页 2、物理地址与虚拟地址进行映射 3、产生缺页异常并分配物理内存页...二、mmap 库函数与 mmap 内核系统调用函数 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 ) ---- 1、分配虚拟内存页...) 3、产生缺页异常并分配物理内存页 缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问 , 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常..." ; 分配 物理内存页 : 缺页异常后的 2 种处理策略 ; 文件映射 : 对于 " 文件映射 " , 遇到 " 缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的...部分数据 读取到 该 ” 物理内存页 " 中 ; 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “ , 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页

    2.3K10

    【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )

    文章目录 一、伙伴分配器分配内存流程 1、查询 n 阶页块 2、查询 n + 1 阶页块 3、查询 n + 2 阶页块 一、伙伴分配器分配内存流程 ---- 伙伴分配器 以 " 阶 " 为单位 , 分配.../ 释放 物理页 ; 阶 ( Order ) : 物理页 的 数量单位 , n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 页 / 阶 概念参考 【Linux 内核 内存管理...】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ; " 伙伴分配器 " 分配内存流程 : 假设要 分配 n 阶页块 ; 1、查询 n 阶页块 查询当前是否有 空闲的 n...阶页块 , 如果有则 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 1 阶页块 ; 2、查询 n + 1 阶页块 查询当前是否有 空闲的 n + 1 阶页块 , 如果有 , 将...n + 1 阶页块 分成 2 个 n 阶页块 , 一块插入 空闲 n 阶页块链表 ; 一块 直接分配 , 如果没有 , 则进入下一步 , 查询 n + 2 阶页块 ; 3、查询

    7.1K50

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券