前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[linux][memory]hugetlb和hugepage技术分析

[linux][memory]hugetlb和hugepage技术分析

作者头像
皮振伟
发布于 2018-04-09 03:17:36
发布于 2018-04-09 03:17:36
8.2K0
举报
文章被收录于专栏:皮振伟的专栏皮振伟的专栏

前言: 乍一看,hugetlb和hugepage还挺像的,好像都是所谓的“大页”。然而,却很难说出来它们的差异。作者也是花了写时间翻翻代码,写了几个测试的例子,加上用工具据实测了几个关键参数,才明白。 分析: 1,page fault 用户大多数情况下申请内存的方法: a,使用malloc函数族,其实是glibc封装了brk/mmap。这种情况下分配的是虚拟内存,并没有直接分配物理内存。 b,调用brk分配,这种情况很少见,并只分配虚拟内存。 c,使用mmap,分配出来虚拟内存。如果flags带有MAP_POPULATE,则直接分配物理内存,否则不分配物理内存。 d,使用mlock,则mlock指定的地址空间内,要分配物理内存。 上述的几种情况中,其实大多数情况下,都是只分配虚拟内存,并不分配物理内存。 对于这种情况,在CPU访问到没有分配物理内存的地址的时候,MMU会产生exception(这个exception就是page fault),kernel处理page fault,如果访问的地址合法,权限合法,则分配相应的物理内存。 2,2M page size 例如进程分配了4G的虚拟内存,那么,就会产生4G / 4K = 1M次page fault。 如果page size变大呢?page size为2M的情况下,会产生4G / 2M = 2K次page fault。 相比之下,减少了很多次page fault。换言之,就是节省了好多计算量,节省了处理page fault的CPU资源。 这里还有一个问题,为什么是2M,而不是其他呢?原因是在x86上,一个pmd能管理的内存是2M。 3,hugetlb shell中敲cat /proc/meminfo | grep -i HugePage:

可以看到,Hugepace的大小事2048K,即2M。当前没有HugePages的total,free等。 执行:echo 1024 > /proc/sys/vm/nr_hugepages

通过修改/proc/sys/vm/nr_hugepages,来控制kernel中的HugePages的数量。 在执行mmap函数中,flags带着MAP_HUGETLB则分配2M的page。 这里需要注意的是,HugePages不在buddy system中继续管理了,在修改echo 1024 > /proc/sys/vm/nr_hugepages的前后对比,也会发现,系统中的free memory减少了2G。 那么问题来了,如果buddy system中没有那么多连续的2M会怎么样呢?会分配出问题。所以需要在开机的时候,就分配大量的2M page。最差情况就是,2M page有很多剩余,而操作系统的free memory很少。 hugetlb的主要逻辑代码在linux-4.0.4/mm/hugetlb.c中,VM_HUGETLB的宏定义数值是0x00400000。 再需要说明一点,hugetlb标记的vma,是不能做ksm/uksm的。 4,hugepage linux提供函数int madvise(void *addr, size_t length, int advice); 其中advice有MADV_HUGEPAGE。 先看madvise,其实就是advise类型的,并非强制的。设定了MADV_HUGEPAGE的地址空间,可以在smaps中查到hg标记。 敲命令cat /proc/PID/smaps可以看到:

查看当前系统的hugepage的策略:cat /sys/kernel/mm/transparent_hugepage/enabled:

一共三种,always,madvise,never。修改的话,也同样:echo “always” > /sys/kernel/mm/transparent_hugepage/enabled 关于hugepage的代码,主要在linux-4.0.4/mm/huge_memory.c中实现。大意是,如果是hugepage的vma发生了page fault,则尽量使用2M的page来分配,如果分配失败,则使用普通的page(4K)来分配。同时,还有一个后台内核线程khugepaged,周期性扫描vma,如果kernel中有了2M的page,会尽量 使用2M page替换4K page。M_HUGEPAGE的宏定义是0x20000000。可见,和HUGETLB还是不同的。另外,hugepage是可以做ksm的。 5,test 作者写了一段简单的代码: #include <sys/mman.h> #include <sys/time.h> #include <stdio.h> #include <string.h> #define SIZE ((size_t)1024*1024*1024*1) int main(int argc, char *argv[]) { void *p = NULL; struct timeval starttv, endtv; int ret = 0; size_t index = 0; p = mmap(NULL, SIZE, PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { perror("mmap"); return 0; } if (argc == 2) { printf("madvise\n"); ret = madvise(p, SIZE, MADV_HUGEPAGE); if (ret < 0) { perror("madvise"); return 0; } } getchar(); ret = gettimeofday(&starttv, NULL); if (ret < 0) { perror("gettimeofday starttv"); return 0; } for (index = 0; index < SIZE; index += 4096) *((int*)(p + index)) = 0xc5; ret = gettimeofday(&endtv, NULL); if (ret < 0) { perror("gettimeofday starttv"); return 0; } printf("time cost : %ld\n", (endtv.tv_sec - starttv.tv_sec) * 1000000 + endtv.tv_usec - starttv.tv_usec); getchar(); return 0; } 先不要在意没有执行munmap的那段~: 编译:gcc hugepace.c -o hugepage 执行:a,./hugepage看执行时间 b, ./hugepage huge看执行时间

实验结果上来看,确实减少了执行时间。 6,perf 上面看到了执行时间的变少,再来看看具体的原因。 perf是性能分析的首选。 启动上述的测试程序hugepage,会停留在第一个getchar()位置上,这时候,敲:perf record -e page-faults -p PID;等到函数执行完,会在perf的shell里面生成perf.data文件;敲:perf report: 两次的结果分别是:

可见,page-faults的差别还是有很大差别。 7,/sys/kernel/mm/transparent_hugepage/enabled 前文提到过,这个参数有三个,当使用always的时候,其实kernel不在乎是否vma带有了VM_HUGEPAGE选项,都会优先使用2M page的。这里需要注意一下。 后记: 关于hugepage和hugetlb的代码,这里没有仔细分析,原因是代码比较繁杂,作者也只是大概看了逻辑,没完全看透。 从使用的角度来说,作者并不欣赏hugetlb,首先会划出去很多内存,让内存管理复杂化,诚然会让大块连续内存分配的情况下性能有所提高,不过看实验结果也没那么明显,还要牺牲挺多高级特性。而hugepage则好很多,非强制,hugepage使用的内存也是在buddy system的管理框架内。 网上有人说使用hugetlb会加速CPU访问内存的速度,作者并不清楚,也没想到一个好的办法来实验。期待有朋友给出来好办法或者数据。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP100上的图片上传程序
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php /****************
Yiiven
2022/12/15
1.5K0
记一次某开源OA白名单后缀限制下巧用系统设计getshell
如 d=systam&m=admin|admin&a=login 相当于调用 webmain/system/admin/adminAction.php#login
亿人安全
2025/02/26
1440
记一次某开源OA白名单后缀限制下巧用系统设计getshell
通达OA代码审计篇 - 11.7 有条件的任意命令执行
这是一个由有条件的任意用户登录+低权限文件上传+低权限目录穿越+低权限文件包含组成。可能是盯着国内OA的人太多了,这个漏洞在2020年9月28号的11.8版本中被更新修复,比较可惜的是,一次更新修复了全部的漏洞逻辑,不禁令人惊叹。
LoRexxar
2023/02/21
8660
通达OA代码审计篇 - 11.7 有条件的任意命令执行
Hack the box-Network
大家好,今天给大家带来的CTF挑战靶机是来自hackthebox的“Network”,hackthebox是一个非常不错的在线实验平台,能帮助你提升渗透测试技能和黑盒测试技能,平台上有很多靶机,从易到难,各个级别的靶机都有。
Khan安全团队
2020/03/08
7330
Hack the box-Network
PHP上传文件超过文件最大限制导致无法上传成功
     最近在学习《HeadFirst PHP & MySQL》一书的第5章“使用存储在文件中的数据”,做一个文件上传的应用时,出现了错误,就是文件无法成功上传。这个问题困扰了我很久,不过还好最后终于解决了。原因是我上传的图片文件大小超过了HTML 表单中MAX_FILE_SIZE 选项指定的值32768Bytes即32KB导致无法上传成功。
ccf19881030
2019/04/24
1.9K0
PHP上传文件超过文件最大限制导致无法上传成功
PHP全栈学习笔记32
php自定义函数之匿名函数 所谓匿名,就是没有名字。 匿名函数,也就是没有函数名的函数。
达达前端
2019/07/03
9590
PHP全栈学习笔记32
通过DedeCMS学习php代码审计
织梦(DedeCms)也是一个国产内容管理系统,曾经爆出过众多漏洞,甚至还有人开发了dedecms漏洞一键扫描器
FB客服
2021/08/24
21.9K0
dvwa通关攻略_猫里奥通关攻略
DVWA是一款基于PHP和mysql开发的web靶场练习平台,集成了常见的web漏洞如sql注入,xss,密码激活成功教程等常见漏洞。本教程将以DVWA为例,演示常见的web漏洞的利用和攻击。
全栈程序员站长
2022/09/27
1.5K0
dvwa通关攻略_猫里奥通关攻略
PHP 常见漏洞代码总结
只验证MIME类型: 代码中验证了上传的MIME类型,绕过方式使用Burp抓包,将上传的一句话小马*.php中的Content-Type:application/php,修改成Content-Type: image/png然后上传.
王瑞MVP
2022/12/28
1.3K0
信息安全国赛技能赛 Writeup
周末在北京wooyun峰会的旅途上打了一场大学生信息安全的国赛的技能赛,本以为能进的决赛,却因为人手不够再加上个人水平太差错过了,虽然i春秋的平台一股浓浓的国产页游风,但不得不说,题目的质量确实不算差,稍微整理下wp…
LoRexxar
2023/02/21
4810
通达OAの漏洞合集
两三个月之前实习的时候通达OA的漏洞学习笔记,赶紧发了清一下库存,免得文件夹吃灰。
h0cksr
2023/05/18
5.7K0
在线涂改图片 php,php网站怎么修改图片[通俗易懂]
$db = mysql_connect(‘localhost’,’root’,’Ctrip07185419′) or die(‘can not connect to database’);
全栈程序员站长
2022/10/04
4.7K0
在线涂改图片 php,php网站怎么修改图片[通俗易懂]
NJCTF Web部分writeup
又到了一年一度的比赛季,这次打了打赛宁自己办的NJCTF,这里稍微整理下Web部分的wp,虽然不知道题目是谁出的,但是我觉得大部分题目还是挺蠢的…看的人从中汲取自己想要的知识就好。
LoRexxar
2023/02/21
3090
NJCTF Web部分writeup
VulnHub靶场 PwnLab: init 渗透测试思路
是个白名单验证只能上传图片马,然后使用index.php的文件包含漏洞getshell,这里需要登陆才能上传文件
曈曈too
2024/08/24
1281
VulnHub靶场 PwnLab: init 渗透测试思路
利用OpenAI CLIP、Claude Sonnet 3.5和pgvector构建一个AI图库
本文探讨了使用 OpenAI CLIP、Claude Sonnet 3.5 和 pgvector 构建 AI 驱动的图片库的 RAG 应用挑战。
云云众生s
2024/10/01
1450
利用OpenAI CLIP、Claude Sonnet 3.5和pgvector构建一个AI图库
一句话木马(新)[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说一句话木马(新)[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/02/10
2.6K0
一句话木马(新)[通俗易懂]
2024全网最全面及最新且最为详细的网络安全技巧 十之CMS文件上传漏洞典例分析POC;EXP以及 如何防御和修复[含PHP;Pyhton,C源码和CTF精题及WP详解]
非常明显,采用的是黑名单验证,虽然我们可以采用类似这样的文件后缀绕过程序的检测,如:bypass.phpX(这里的X代表空格%20或其他特殊字符{%80-%99}),但这并是今天我想要讲的内容。
盛透侧视攻城狮
2024/10/21
950
2024全网最全面及最新且最为详细的网络安全技巧 十之CMS文件上传漏洞典例分析POC;EXP以及 如何防御和修复[含PHP;Pyhton,C源码和CTF精题及WP详解]
2024全网最全面及最新且最为详细的网络安全技巧 九之文件包含漏洞典例分析POC;EXP以及 如何防御和修复[含PHP;Pyhton,C源码和CTF精题及WP详解](4)
这里我们可以介绍第一个trick,即利用phpinfo会打印上传缓存文件路径的特性,进行缓存文件包含达到getshell的目的。
盛透侧视攻城狮
2024/10/21
1890
2024全网最全面及最新且最为详细的网络安全技巧 九之文件包含漏洞典例分析POC;EXP以及 如何防御和修复[含PHP;Pyhton,C源码和CTF精题及WP详解](4)
Bugku Web 部分WP
1.web2 听说聪明的人都能找到答案 http://123.206.87.240:8002/web2/ CTRL + u 查看源代码 2.计算器 http://12
wywwzjj
2023/05/09
5890
小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150010.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
2.3K0
推荐阅读
相关推荐
PHP100上的图片上传程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档