透明大页相关内核参数_透明大内存页Hugepage支持

==目标==

在linux2.6.38之前,处理大容量内存工作集的高性能关键计算应用是运行在libhugetlbfs之上,必须依赖于

hugetlbfs,。透明Hugepage支持是一种替代手段,它使用大内存页,并且虚拟内存页的大小可以动态变化,没有hugetlbfs的缺点。

目前只适用于匿名内存映射,但未来可以扩展到tmpfs的papecache层。

大内存页的优点:

巨大的页面可以通过减少缺页提升性能(一次缺页分配大块的内存),还可以通过减少虚拟地址到物理地址的转换成本(减少转化次数),甚至可以避免地址转换。如果处理器必须转换一个虚拟地址,它必须通过多达四层页表。处理器保持一个“翻译后备缓冲器(TLB)的缓存的转换结果。TLB的容量很小,一般是128条指令转换、32条数据转换。非常容易被填满,从而必须进行大量的地址转换。例如:2m的页大小只需要一个tlb项,而4k的页大小就需要512个tlb项。通过内核地址使用大内存页,可以减少tlb的压力。

基于以上原因,使用大内存页的程序会运行的很快。

hugetlbfs 缺点:

(1)巨页必须在内核启动时刻进行设置,并且需要应用程序显示映射。

(2)更倾向于大的专有数据库管理系统

==设计==

- “优雅的回退”:不具有透明hugepage的内存管理系统可以会退到不使用透明hugepage,而使用常规页面和各自的规则pmd/pte映射

- ,如果因为内存碎片导致大内存页分配失败,这时系统应该优雅的使用常规页代替,并将其写入到相同的vma中,并且没有任何故障、重大延迟或用户态通知。

- 如果有些任务结束,越来越多的大页面变成可用(无论是立即在伙伴系统或通过虚拟内存),常规页分配的物理内存应该通过khugepaged自动迁往大内存页.

- 它并不需要保留内存,只要有可能就会使用大页面。

(唯一可能保留的kernelcore =  避免不可移动的页面片段去分裂所有内存,但这样一个调整不特定于透明hugepage支持,它是一个通用的适用于所有的动态内存高阶分配)

- 这个最初只支持提供匿名内存区,但将来会扩展到tmpfs和pagecache

与hugetlbfs通过将不可用内存用来作为cache或者可移动的(或者甚至无法移动实体)的保留内存方式相比,透明Hugepage可以使空闲内存利最大化。它不需要保留内存,以防止大内存页分配。这对用户态是透明的。大内存页允许分页和所有其他的先进的虚拟技术,并且对用户是透明的,不需要修改应用程序来使用这些技术。

应用可以更好的使用这些功能。例如可以避免有优化之前的malloc(4k)的mmap系统洪水。这种优化不是强制的,khugepaged会处理理那些不使用大内存的来处理大量内存的应用程序。

在某些情况下,系统范围使用大页面,会导致应用分配更多的内存资源。例如应用程序MMAP了一大块内存,但是只涉及1个字节,在这种情况下,2M页面代替4K页的分配没有任何好处,这就是为什么禁用全系统大页面,而只针对MADV_HUGEPAGE区使用的原因。

嵌入式系统仅仅在madvise区域使能大页面分配可以消除浪费内存的任何风险,并且程序运行的更快。

== sysfs==

透明Hugepage支持可以被完全禁用(多为调试目的)或只启用MADV_HUGEPAGE(以避免消耗更多的内存资源的风险)或启用系统

范围。

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

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

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

它也可以限制在创造大页面的内存碎片整理的影响,他们不是立即对madvise区空闲或从未尝试碎片整理内存而使用规则页面,除非是立即可用。显然,我们使用CPU来碎片整理内存,希望获得的更多的大内存页,而不是普通页面。这并不是保证,但它更可能的情况下分配为MADV_HUGEPAGE区。

echo always >/sys/kernel/mm/transparent_hugepage/defrag

echo madvise >/sys/kernel/mm/transparent_hugepage/defrag

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

khugepaged会自动启动时当transparent_hugepage/enabled设置为“always”或“madvise",它会自动关机,如果它被设置为“never”。

khugepaged通常在低频运行。

echo 0 >/sys/kernel/mm/transparent_hugepage/khugepaged/defrag

echo 1 >/sys/kernel/mm/transparent_hugepage/khugepaged/defrag

你还可以控制khugepaged每次扫描多少页。

/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan

扫描间隔(毫秒)

/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs

当分配大内存失败等待多少毫秒来压制下一个大内存页的分配尝试。

/sys/kernel/mm/transparent_hugepage/khugepaged/alloc_sleep_millisecs

可以看出,倒塌的内存页数量

/sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed

每次扫描:

/sys/kernel/mm/transparent_hugepage/khugepaged/full_scans

==引导参数==

你可以改变透明Hugepage的默认支持。

通过内核命令行参数"transparent_hugepage=always" or

"transparent_hugepage=madvise" or "transparent_hugepage=never"。

==需要重新启动应用程序==

transparent_hugepage/enabled 只影响未来行为。因此,使它们有效,你需要重新启动任何

应用程序可以一直使用大页面。这也适用于注册khugepaged的内存区。

== get_user_pages和follow_page ==

get_user_pages和follow_page在hugepage上运行,将返回

像往常一样的头或尾页(正如hugetlbfs所做的)。

多数GUP用户只关心实际的物理页面地址和其I/O完成后的释放,所以他们将不会注意到的页面其实是巨页的。但如果驱动程序操作页面结构(如检查起始页、末尾页的page->mapping或相关的其他位),它应去检查头页。

注意:对GUP API没有新的约束,跟hugetlbfs具有相同的约束。所以任何在hugetlbfs中操作GUP的驱动可以在

透明hugepage支持映射中运行的很多。

如果你不能处理通过follow_page返回的混合页,FOLL_SPLIT位可以被指定为follow_page参数,这样它将会返回之前分离巨页。

==优化应用程序==

要保证内核立即映射到一个2M的页面在任何内存区域中,在mmap区域必须是hugepage对齐。 posix_memalign()可以提供这种保证。

== Hugetlbfs ==

您可以使用在配置透明巨页功能的内核中使用hugetlbfs。除了没有整体内存碎片外,其他没有区别。所有属于hugetlbfs的通用功能都保存并且不受影响。 libhugetlbfs也将像以前一样正常工作。

==优雅的回退==

查询pagetables的时候可以使用split_huge_page_pmd 检查pmd_offset返回的pmd。

如果没有查询pagetables并且碰上一个物理hugepage但你不能在你的代码处理它本身,可以使用split_huge_page分离它。

==了解hugepage代码的锁定==

我们要尽可能知道hugepage代码,使用split_huge_page()或split_huge_page_pmd()有代价的。

为了使查询页表时意识到 huge pmd,你需要做的是调用pmd_trans_huge 在pmd_offset返回后。您必须持有mmap_sem(读或写),确保huge pmd不能被khugepaged创建(khugepaged collapse_huge_page在获取mmap_sem和anon_vma lock在写模式下执行)。

如果pmd_trans_huge返回false,就走旧代码路径。相反,如果pmd_trans_huge返回true,你必须要获取 page_table_lock和重新执行pmd_trans_huge。page_table_lock将防止将huge pmd转换成常规pmd(split_huge_page可以并行执行检查页表)。如果第二次pmd_trans_huge返回flase,你应该丢弃page_table_lock和执行以前的代码路径。否则你应该执行pmd_trans_splitting。pmd_trans_splitting返回true,这意味着split_huge_page已经在分裂页面中。因此,如果pmd_trans_splitting返回true,丢弃page_table_lock和执行wait_split_huge_page,然后执行旧的代码路径。当wait_split_huge_page返回时候,pmd不再是巨页的。如果pmd_trans_splitting返回false,就可以进行处理hugepmd和hugepage。一旦完成,你可以释放page_table_lock。

== compound_lock,get_user_pages和put_page ==

在从页结构清除所有PG_head/tai位之前,split_huge_page函数必须从头页到尾页设置refcounts值。对huge pmd映射的refcounts很容易做到。get_page和put_page运行在尾页的时候(仅在尾页),它们必须找到其各自的头页,

然后减少头页和尾页的refcount。为了得到可靠的头页和在无竞争状态下减少refcount值,put_page必须串行获取每页锁compound_lock使用__split_huge_page_refcount。

compound_lock。

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

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

相关文章

c语言五子棋斜向判断,c语言 五子棋危险判断 求大神解释啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码#include #define right r#define lower l#define lower_right i#define lower_left e#define none oint table[19][19];int hit_space(int x, int y, char vec){if (vec right){if (x - 1 > 0 && table[x - 1][y]…

vue项目接口地址暴露_vue组件暴露和.js文件暴露接口操作

1、将同一类型的组件放在一个文件夹下2、在此文件夹下创建一个index.js3、在index.js中导入组件,并把他们暴露出去1、写法一import studentCourse1 from ./studentCourse.vueimport studentInfo1 from ./studentInfo.vueexport var studentCoursestudentCourse1expo…

linux编译lnx文件命令_linux命令dd

dd使用dd这个linux命令可以创建一定大小文件。linux创建文件命令:dd命令把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换。语法:CODE:[Copy to clipboard]dd 〔选项〕QUOTE:if 输入文件(或设备名称)。of 输出文件…

android opencv 水印,关于opencv对图片添加水印

有一段时间没有写博客了,最近因为自己需要给图片添加水印,就写了个简单的图片添加水印python:3.6.7pycharmopencv是一个开源的库,是有c编写,支持c ,python,java和matlab接口,并支持windows&…

python做一个窗口样式_python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法...

本文借用HTML的css语法,将样式表应用到窗口部件。这里只是个简单的例子,实际上样式表的语法很丰富。以下类似于css:StyleSheet """QComboBox { color: darkblue; }QLineEdit { color: darkgreen; }QLineEdit[mandatory"…

华为开发微信鸿蒙版,HUAWEI DevEco Studio

华为鸿蒙2.0开发平台为开发者在PC上面所提供的的开发平台,这个平台能够让用户在PC和Mac上面完成对鸿蒙相关开发内容,开发者能够在这个官方的平台当中开发属于自己的应用内容,更好的开发属于自己的应用并且在上面进行全面的调试,感…

linux安装python3.6 setuptools_linux下安装Python3.6.1

linux下安装Python3.6.1Python-3.6.1下载wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz解压、编译、安装tar Jxvf Python-3.6.1.tar.xzcd Python-3.6.1./configure --prefix/usr/local/python3make && make install最终显示下面代码表示python3…

function里面可以写function吗_和田玉不戴的时候,可以长时间泡在水里面吗?

叶子珠宝翡翠批发商城数百万玉石好友聚集地翡翠行业最活跃的领军,实力收藏家都在关注新朋友请点击叶子珠宝翡翠批发商城关注!抢购源头翡翠!请加1号店微信号:stchenchuye(←长按复制请加2号店微信号:feicui1236(←长按复…

shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立

test 命令是 Bash 中重要的判断命令,也是 Shell 脚本中条件判断的重要辅助工具。当我们需要让程序自动判断哪些事情是成立的时,test 命令就派上用场了。按照文件类型进行判断根据表 1,我们先来看看 test 可以进行哪些文件类型的判断。表 1 文…

android智能老人机系统,国产老人机也可以变智能!可运行Android

原标题:国产老人机也可以变智能!可运行Android相信很多用户对老人机的认知都是大电池、小屏幕、高音量以及功能少。看完下边这个老年机,你的认知可能会被颠覆。微博用户极客村长今天在微博上放出了一张来自国内厂商TETC的老人机图片&#xff…

android时间最大,Android TimePickerDialog设置最大时间

对于lolipop和更高版本的android,您可以使用此修改过的RangeTimePickerDialog类(从lolipop,Timepicker默认使用时钟模式(材料设计),因此旧的自定义类将无法使用。我们可以将模式更改为Spinner以获取最新版本,并可以重用该类)publi…

css毛玻璃效果白边_css3毛玻璃效果白边问题_html/css_WEB-ITnose

注:css3毛玻璃效果应该很多人都知道怎么实现,但是有个问题是图片模糊了之后相当于缩小了,所以颜色深的图片会出现白边,这里说下我参考网上的解决方式吧!1、毛玻璃实现方法:CSS3 blur滤镜实现如下测试代码&a…

如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。

一、插件简介Tab2Xls-将表导出到XLS、CSV或HTMLTab2Xls是一个用于AutoCAD的LISP实用程序,用于导出将AutoCAD表格转换为XLS、CSV或HTML。启动TAB2XLS命令并选择一个table对象-Excel应用程序将启动,表格将以选定的名称保存(默认情况下:绘图路径…

python问卷调查数据分析_如何用excel统计调查问卷

有些人可能经常要对调查问卷进行统计,使用手写的方法(就是在纸上写正字的方法)虽然很方便,不过不方便在一定条件下进行统计,如在男士的条件下,使用诺基亚的手机有多少人。而用excel可以很方便得出此类统计结果,并且由于…

html中什么是语义,html – “语义正确”是什么意思?

标签正确这意味着你正在调用它实际上是什么。典型的例子是&#xff0c;如果某个表是一个表&#xff0c;它应该包含行和数据列。要用于布局语义上是不正确的 – 你不是说“这是一个表”。另一个例子&#xff1a;通常应该使用列表(< ul> or< ol>)来对相似的项目(<…

golang商城_Golang——简单是终极的成熟

Google的Rob Pike在2012年的主题演讲中说&#xff1a;“ Go的目的不是要对编程语言设计进行研究&#xff1b; 这是为了为其设计师及其同事改善工作环境。 与编程语言研究相比&#xff0c;Go不仅仅是软件工程。 换一句话&#xff0c;它与软件工程服务中的语言设计有关。” 演讲揭…

android 换行模式,Android进阶之自定义View(1)实现可换行的TextView

今天来一起学习一下最简单的自定义view,自己动手写一个MyTextView,当然不会像系统的TextView那么复杂&#xff0c;只是实现一下TextView的简单功能&#xff0c;包括分行显示及自定义属性的处理&#xff0c;主要目的是介绍自定义view的实现的基本思路和需要掌握的一些基础知识。…

shell 停止tomcat_Linux停止tomcat运行

打开终端cd /java/tomcat#执行bin/startup.sh #启动tomcatbin/shutdown.sh #停止tomcattail -f logs/catalina.out #看tomcat的控制台输出&#xff1b;#看是否已经有tomcat在运行了ps -ef |grep tomcat#如果有&#xff0c;用kill;kill -9 pid #pid 为相应的进程号例如 pe -ef |…

中国大学moocpython笔记_中国大学MOOC_高级语言程序设计(Python)笔记

一、程序设计基础1、Python历史2、Python特点Python的伪代码(形式语言)更接近于自然语言(自然语言)胶水语言3、Python的应用&#xff1a;Google、Youtube等4、IDE1)Python是解释性语言(“同声传译”)&#xff0c;支持有两种方法使用解释器&#xff1a;交互式模式(interactivemo…

html调用chr,FpHtmlEnCode 函数之标题过滤特殊符号的代码

FpHtmlEnCode 函数之标题过滤特殊符号的代码更新时间&#xff1a;2007年09月01日 22:11:50 作者&#xff1a;函数名&#xff1a;FpHtmlEnCode作 用&#xff1a;标题过滤参 数&#xff1a;fString ------字符串Function FpHtmlEnCode(fString)If IsNull(fString)False or fS…