[翻译]-hugePage的简要说明--部分内容
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的简要说明--部分内容的更多相关文章
- 你应该在开始API开发之前知道的事(上)(翻译)
这篇文章的源地址:http://dev.dota2.com/showthread.php?t=58317 由于文章内容较多,英语水平有限,准备尝试着以中英混搭的形式翻译,免得曲解一些不懂内容的意思.以 ...
- 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(三)
(目前发现一些文章被盗用的情况,我们将在每篇文章前面添加原文地址,本文源地址:http://www.cnblogs.com/idealer3d/p/Instant_RaphaelJS_Starter3 ...
- 翻译qmake文档(一) qmake指南和概述
翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...
- Python 调用百度翻译API
由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...
- 为Linux版本Oracle 11gR2配置HugePage
HugePage是Oracle在Linux版本下一种性能优化手段.对于共享内存区域(SGA)的数据库系统,Oracle通常都推荐在操作系统层面配置上HugePage,为Oracle实例准备更大的可用共 ...
- 原生js简单调用百度翻译API实现的翻译工具
先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...
- Web开发——HTML基础(图像、音频和视频内容)
参考: 参考:HTML中的图像 参考:视频和音频内容 目录: 1.HTML中的图像 1.1 我们如何在网页上放置图像? (1)替代文字(alt) (2)宽度和高度 (3)图片标题 1.2 用图形和图形 ...
- CS231n官方笔记授权翻译总集篇发布
CS231n简介 CS231n的全称是CS231n: Convolutional Neural Networks for Visual Recognition,即面向视觉识别的卷积神经网络.该课程是斯 ...
- JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用
Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...
- openerp 中文乱码及界面翻译不全
openerp中文报表乱码问题,即是字体问题,环境是ubuntu 12.04 openerp 6.1, deb all in one安装方式 一.cd usr/share/fonts/truetype ...
随机推荐
- 一种DWS迁移Oracle的CONNECT BY语法的方案
摘要:本文提供一种GaussDB DWS迁移CONNECT BY语法方案. 本文分享自华为云社区<GaussDB(DWS)迁移 - oracle兼容 -- CONNECT BY迁移>,作者 ...
- C++多线程强制终止
摘要:实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们. 本文分享自华为云社区<如何编写高效.优雅.可信代码系列(1)--C++多线程强制终止>, ...
- openGauss内核分析:查询重写
摘要:查询重写优化既可以基于关系代数的理论进行优化,也可以基于启发式规则进行优化. 本文分享自华为云社区<openGauss内核分析(四):查询重写>,作者:酷哥. 查询重写 SQL语言是 ...
- grpc双向流究竟是什么情况?2段代码告诉你
摘要:为什么需要grpc双向流? 本文分享自华为云社区<grpc双向流究竟是什么情况?2段代码告诉你>,作者:breakDawn. 为什么需要grpc双向流? 有时候请求调用和返回过程,并 ...
- 让 Java 打包缩小一大半,Solon v1.9.3 发布
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- Interceptor Handle 执行顺序
preHandle 调用时间:Controller方法处理之前 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行 若返回false,则中断执行,注意:不会 ...
- 使用 FHE 实现加密大语言模型
近来,大语言模型 (LLM) 已被证明是提高编程.内容生成.文本分析.网络搜索及远程学习等诸多领域生产力的可靠工具. 大语言模型对用户隐私的影响 尽管 LLM 很有吸引力,但如何保护好 输入给这些模型 ...
- python像操作文件一样操作内存的模块 StringIO
io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插 ...
- IntelliJ IDEA项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
IntelliJ IDEA项目导入时报错: The import javax.servlet.http.HttpServletRequest cannot be resolved 翻译一下错误信息是说 ...
- Codeforces Round #653 (Div. 3) 题解
记第一场CF赛,完成3道题 代码更新(降低时间复杂度和修改写法):21.1.23 A题 Required Remainder 题意:给你 x.y.n 求最大的k (k<=n) 使得k%x==y ...