hugePage的简要说明

本篇文档的主旨给linux内核支持的大页内存做一个简要的概述.
大页内存的实现是建立在大多数现代架构所都支持的多级页大小的特性之上的.
举例: x86架构下大部署CPU 的页面大小是4KB 或者是 2MB. 部分新的CPU支持1GB的页面大小.
IA64的架构支持 4K, 8K, 64K, 256K, 1M, 4M, 16M, 256M
PPC64的架构支持: 4K 16MB
TLB是一个很小又很珍贵的资源, 主要用于快速实现虚拟内存到物理内存的专用工作.
现代操作系统很关键的一个优化项目就在于随着内存的越来越大, 要更好的利用TLB以提高性能 用户可以使用mmap或者是shmget, shmat 这种基于标准的SYSV共享内存机制来使用大页内存. 首先: linux的内核需要增加CONFIG_HUGETLBFS和CONFIG_HUGETLB_PAGE的配置项目.
(其中CONFIG_HUGETLB_PAGE会因为CONFIG_HUGETLBFS的设置而自动生效)
/proc/meminfo 文件提供了系统内核里面大页内存池的详细信息.
并且还会实时显示系统内核里面的大页的大小,以及空闲,占用了的,以及过量申请的的大页数量.
大页内存的使用是需要使用带合适参数的系统调用以便映射到大页区域的. 一般情况下/proc/meminfo 的战事信息主要如下:
HugePages_Total: uuu
HugePages_Free: vvv
HugePages_Rsvd: www
HugePages_Surp: xxx
Hugepagesize: yyy kB
Hugetlb: zzz kB 其中:
HugePages_Total 大页内存的总量
HugePages_Free 没有被分配的大页内存数量.
HugePages_Rsvd 系统当前总共保留的大页数目,具体点是指程序已经向系统申请,但是还没有具体执行写入
表示为尚未实际分配给程序的HugePages数目。
HugePages_Surp 超过设定的大页内存的数量.
Hugepagesize 大页内存的单独每个页面的大小.
Hugetlb 大页内存的总计大小,单位为KB 可以理解为 Hugepagesize*HugePages_Total /proc/filesystems 也会描述一个在内核中进行配置了的大页内存文件系统.
/proc/sys/vm/nr_hugepages 指代Linux内核里面持久化大页内存页面多少
只有root用户权限才可以增加或者是改参数值的大小. 只要是内存已经保留了大页内存的页面就不会因为内存压力还进入swap内存区域.
并且大页内存不会用于非大页内存的使用场景, 是专用的.
设置了大页内存后,用户可以使用合适的权限通过mmap后者是shmget等方式进行申请大页内存的使用 建议在系统启动时就直接修改好hugepages=N 的参数, 避免如果长时间使用导致内存随便无法申请足够打的大页内存.
很多平台支持多种大小的内存页大小. 如果想使用其他大小的大页内存页大小, 需要在启动的参数中增加:
default_hugepagesz=<size> 的参数才可以, 这个参数需要使用精确的字节大小, 可以使用[kKmMgG] 作为后缀 /proc/sys/vm/nr_hugepages 里面其实使用的是默认的页大小. 并且是支持动态修改的, 可以使用如下命令来动态修改:
echo 20 > /proc/sys/vm/nr_hugepages
该命令会尽力在系统中申请20个大页内存. 用于进行分配和使用. 需要注意在NUMA系统的情况时: 内核会尝试在所有的numa节点都平均分布大页的设置.
这一块可能在单一numa节点内存不足时出现很多问题. 文章后面有一些详细的讨论
(看不太懂 -- 这句不是我说的 不是原文. ) 是否能够成功申请到大页内存取决于系统上在申请大页内存的时刻是否有连续的并且可用的空闲内存.
如果内核无法在一个numa节点上面申请到一个足够的内存. 会尝试从其他节点进行内存申请. 系统管理员一般都喜欢在启动启动时就可以自动执行内存申请的命令.
可以设置为 local rc init files 实现自动加载.
并且可以通过如下命令来查看不同numa节点的内存大页使用情况
cat /sys/devices/system/node/node*/meminfo | fgrep Huge /proc/sys/vm/nr_overcommit_hugepages
该参数会尝试再使用了nr_hugepages 以上的内存
如果设置了非零数值, 系统耗尽了 nr_hugepages 的内存之后 会尝试继续申请 非零数值的内存
但是需要注意, 如果这些内存被释放了, 也会反馈给内核,将大页内存的限制取消, 会继续正常分配内存.
如果的确有需求申请大约持久的大页内存的数值, 建议直接修改nr_hugepages 的大小.对性能会更好一些. 管理员也可以通过减少nr_hugepages 的数值来减少冻结的大页内存数量. 并且设置完之后内核会自动在
不同的numa节点上的空闲内存释放出来便于其他非大页内存使用. 另外 /proc的文件系统与/sys下面是有一些对应的.
比如 :/sys/kernel/mm/hugepages
hugepages-${size}kB
其实还有一些其他参数也在统计目录下面, 比如:
nr_hugepages
nr_hugepages_mempolicy
nr_overcommit_hugepages
free_hugepages
resv_hugepages
surplus_hugepages
这些参数会展示很多内核关于大页内存的默认值信息.

任务内存管理侧率与大页内存申请和冻结的交互

申请或者是冻结内存的策略可以通过修改/proc虚拟文件系统和/sysfs文件系统的 nr_hugepages_mempolicy 参数来实现
但是需要注意如果启用了 nr_hugepages 的参数 nr_hugepages_mempolicy 的参数就会被忽略 我不想翻译这一段了, 自己看原文吧. 我不想用这个参数..网上都木有, 感觉容易掉坑里.

每个numa节点的大页内存属性

/sysfs下面有一个基于大页内存控制上, 针对每一个numa节点的子节点内容
他具体体现在如下的设备内存信息中
/sys/devices/system/node/node[0-9]*/hugepages/ 并且与系统级的大页内存设置相仿,也有如下的配置属性信息 nr_hugepages
free_hugepages
surplus_hugepages nr 和 free 与系统级的参数含义相仿.
但是surplus 时当前节点没有可用的连续内存时, 系统会尝试从其他numa节点申请内存.

使用大页内存

如果应用程序希望使用mmap的系统调用来申请大页内存
需要系统管理员 mount 一个 hugetlbfs 的文件类型.
mount -t hugetlbfs \
-o uid=<value>,gid=<value>,mode=<value>,pagesize=<value>,size=<value>,\
min_size=<value>,nr_inodes=<value> none /mnt/huge 这个命令会在/mnt/huge 目录下挂载一个虚拟的hugetlbfs类型的文件系统
任何在这个目录上创建的文件 文件权限默认值是 01777
mmap的使用比较高深. 单词我都明白, 但是我尝试翻译了好几次,翻译不好, 请看原文吧.. This command mounts a (pseudo) filesystem of type hugetlbfs on the directory
/mnt/huge. Any files created on /mnt/huge uses huge pages. The uid and gid
options sets the owner and group of the root of the file system. By default
the uid and gid of the current process are taken. The mode option sets the
mode of root of file system to value & 01777. This value is given in octal.
By default the value 0755 is picked. If the platform supports multiple huge
page sizes, the pagesize option can be used to specify the huge page size and
associated pool. pagesize is specified in bytes. If pagesize is not specified
the platform's default huge page size and associated pool will be used. The
size option sets the maximum value of memory (huge pages) allowed for that
filesystem (/mnt/huge). The size option can be specified in bytes, or as a
percentage of the specified huge page pool (nr_hugepages). The size is
rounded down to HPAGE_SIZE boundary. The min_size option sets the minimum
value of memory (huge pages) allowed for the filesystem. min_size can be
specified in the same way as size, either bytes or a percentage of the
huge page pool. At mount time, the number of huge pages specified by
min_size are reserved for use by the filesystem. If there are not enough
free huge pages available, the mount will fail. As huge pages are allocated
to the filesystem and freed, the reserve count is adjusted so that the sum
of allocated and reserved huge pages is always at least min_size. The option
nr_inodes sets the maximum number of inodes that /mnt/huge can use. If the
size, min_size or nr_inodes option is not provided on command line then
no limits are set. For pagesize, size, min_size and nr_inodes options, you
can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For example, size=2K
has the same meaning as size=2048. While read system calls are supported on files that reside on hugetlb
file systems, write system calls are not. Regular chown, chgrp, and chmod commands (with right permissions) could be
used to change the file attributes on hugetlbfs. Also, it is important to note that no such mount command is required if
applications are going to use only shmat/shmget system calls or mmap with
MAP_HUGETLB. For an example of how to use mmap with MAP_HUGETLB see map_hugetlb
below. Users who wish to use hugetlb memory via shared memory segment should be a
member of a supplementary group and system admin needs to configure that gid
into /proc/sys/vm/hugetlb_shm_group. It is possible for same or different
applications to use any combination of mmaps and shm* calls, though the mount of
filesystem will be required for using mmap calls without MAP_HUGETLB. Syscalls that operate on memory backed by hugetlb pages only have their lengths
aligned to the native page size of the processor; they will normally fail with
errno set to EINVAL or exclude hugetlb pages that extend beyond the length if
not hugepage aligned. For example, munmap(2) will fail if memory is backed by
a hugetlb page and the length is smaller than the hugepage size.

参考资料

1) map_hugetlb: see tools/testing/selftests/vm/map_hugetlb.c

2) hugepage-shm:  see tools/testing/selftests/vm/hugepage-shm.c

3) hugepage-mmap:  see tools/testing/selftests/vm/hugepage-mmap.c

4) The libhugetlbfs (https://github.com/libhugetlbfs/libhugetlbfs) library
provides a wide range of userspace too

[翻译]-hugePage的简要说明--部分内容的更多相关文章

  1. 你应该在开始API开发之前知道的事(上)(翻译)

    这篇文章的源地址:http://dev.dota2.com/showthread.php?t=58317 由于文章内容较多,英语水平有限,准备尝试着以中英混搭的形式翻译,免得曲解一些不懂内容的意思.以 ...

  2. 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(三)

    (目前发现一些文章被盗用的情况,我们将在每篇文章前面添加原文地址,本文源地址:http://www.cnblogs.com/idealer3d/p/Instant_RaphaelJS_Starter3 ...

  3. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  4. Python 调用百度翻译API

    由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...

  5. 为Linux版本Oracle 11gR2配置HugePage

    HugePage是Oracle在Linux版本下一种性能优化手段.对于共享内存区域(SGA)的数据库系统,Oracle通常都推荐在操作系统层面配置上HugePage,为Oracle实例准备更大的可用共 ...

  6. 原生js简单调用百度翻译API实现的翻译工具

    先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...

  7. Web开发——HTML基础(图像、音频和视频内容)

    参考: 参考:HTML中的图像 参考:视频和音频内容 目录: 1.HTML中的图像 1.1 我们如何在网页上放置图像? (1)替代文字(alt) (2)宽度和高度 (3)图片标题 1.2 用图形和图形 ...

  8. CS231n官方笔记授权翻译总集篇发布

    CS231n简介 CS231n的全称是CS231n: Convolutional Neural Networks for Visual Recognition,即面向视觉识别的卷积神经网络.该课程是斯 ...

  9. JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用

    Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...

  10. openerp 中文乱码及界面翻译不全

    openerp中文报表乱码问题,即是字体问题,环境是ubuntu 12.04 openerp 6.1, deb all in one安装方式 一.cd usr/share/fonts/truetype ...

随机推荐

  1. 技术驱动,数据赋能,华为云GaussDB给世界一个更优选择

    摘要:5月16日,"数智深耕 让美好发生 2023华为云城市峰会广州站"成功举行. 5月16日,"数智深耕 让美好发生 2023华为云城市峰会广州站"成功举行. ...

  2. ModelArts黑科技揭秘|弹性训练,让训练资源张弛有度

    摘要:AI进入产业的门槛变高,开发者想要做出优秀的AI模型就不得不在算力和成本之间折中,怎么办? 为帮助企业在AI落地过程中进一步实现降本增效,华为云推出AI黑科技--弹性训练. 今年,AI界最被热议 ...

  3. 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”

    摘要:本文带领大家一起剖析鸿蒙轻内核的互斥锁模块的源代码,包含互斥锁的结构体.互斥锁池初始化.互斥锁创建删除.申请释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十 互斥锁Mutex& ...

  4. COG云原生优化遥感影像,瓦片切分的最佳实践

    摘要:云上遥感影像文件Cloud optimized GeoTIFF(COG)格式的详细介绍,大量数据上云面临的挑战,并分享了获得云原生影像最佳性能的实践经验. 本文分享自华为云社区<COG云原 ...

  5. 开心档之Java 测验

    目录 Java 测验 Java 测验 Java 测验技术文档 Java测验是一种衡量Java编程水平的测试,可以通过一系列问题和编程任务来测试Java开发人员的技能水平和理解程度.Java测验可以用于 ...

  6. 在Linux(CentOS7)服务器上安装Java的JDK

    一.介绍 最近,我在做有关CI/CD的测试,真是一步一个坑啊,碰得我头破血流,这么难得的经验,必须记录下来,以防以后想找却找不到.说道CI/CD最好的工具,大家肯定是一致推荐Jenkins,对了,我现 ...

  7. 火山引擎ByteHouse:云原生数据库如何提升MySQL兼容性?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当前各类软件层出不穷,单独某一款软件往往难以满足企业应用需求,一般都需要与各类软件组合使用,这时软件生态兼容性就显 ...

  8. 火山引擎数智平台协助洞察美图类APP新增长,付费用户转化超过 124%

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 美图类 APP 的下一个增长点在哪里? 目前,国内市场上的美图类 APP 大多都遵循着基础功能免费使用.个性化热门 ...

  9. 十分钟读懂火山引擎 DataLeap 数据治理实践

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前,火山引擎数智平台 VeDI 直播活动「超话数据」在线举办,来自火山引擎 DataLeap 数据产品专家从数据 ...

  10. PPT 如何将大段WORD制作成PPT

    PPT 如何将大段WORD制作成PPT 标记等级 发送到PPT 图片.表格,无法发送