免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香
打印 上一主题 下一主题

linux内存管理讨论——欢迎大家围观! [复制链接]

论坛徽章:
0
91 [报告]
发表于 2012-04-12 15:55 |只看该作者
    前段时间发现服务器会出现短暂访问异常缓慢的情况,top发现是kswapd 100%引起的。服务器上面跑的memcached、mongodb,这些都是内存大户。借着这个机会,正好分析了swap以及内存管理相关的原理,跟大家交流一下心得。

1.linux内存管理涉及的概念有:page、zone、node、页目录、页表。
分页单元把所有的RAM分成固定长度的页框,每个页框包含一个页。
页目录项和页表都具有present字段,表明page是否在主存中,如果present标志被清0,那么分页单元就把该线性地址存放cr2中,产生缺页异常。
页框的状态信息保存在page页描述符中,所有的页描述符存放在mem_map数组中。page的_count是页引用计数器,_flags字段描述页框状态PG_xxxx。
NUMA中,根据内存单元的访问时间划分为node,在一个单独的节点,任意给定CPU访问页面所需的时间都是相同。用pg_data_t来描述。
每个节点的物理内存又可分为几个管理区zone。zone分为ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM,
管理区描述符里面,比较重要的字段有free_pages pages_min pages_low pages_high free_area

2.管理区zone
pages_min 管理区中保留页的数目
pages_low 回收页框使用的下界、同时也被管理区分配器作为阈值使用
pages_high 回收页框使用的上界、同时也被管理区分配器作为阈值使用

3.管理区分配器
管理区分配器接受动态内存分配与释放的请求,在请求分配的情况下,搜索一个能满足请求的一组连续页框内存的管理区,在每个管理区内,页框由buddy system来处理。
请求页框:
alloc_pages --> alloc_page --> __get_free_pages --> __get_free_page
释放页框:
free_pages free_page

__rmqueue() 函数用来在管理区找到一个空闲块
__free_pages_bulk()函数按照buddy system的策略释放页框

__alloc_pages()函数,会对内存管理区扫描,配合z->pages_min 、z->pages_low、z->pages_high标志,如果没有剩下多少空闲内存,会唤醒kswapd内核线程来异步地开始回收页框。

4.获得动态内存方式:
__get_free_pages或alloc_pages 从页框分配器中获取页框;
kmem_cache_alloc 或kmalloc 使用slab分配器为专用或通用对象分配块;
vmalloc 获得一块非连续的内存区。

论坛徽章:
0
92 [报告]
发表于 2012-04-12 16:12 |只看该作者
5.kswapd内核线程,主要的执行流程:

kswapd被唤醒时,主要执行逻辑是:
调用kswapd_can_sleep,变量所有的管理区,检查zone_t的need_balance 字段,如果有need_balance被设置,则它不能睡眠。
如果不能睡眠,则会被移出kswapd_wait等待队列;
调用kswapd_balance 遍历所有的管理区,如果need_balance字段被设置,它将使用try_to_free_pages_zone来释放管理区内的页面,直到达到pages_high阈值;
由于tq_disk的任务队列的运行,所以也没队列都将清除;
将kswapd重新加入kswapd_wait队列并返回继续执行。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
93 [报告]
发表于 2012-04-12 16:16 |只看该作者
回复 91# doit_zzg
多谢分享!

   

论坛徽章:
0
94 [报告]
发表于 2012-04-12 17:01 |只看该作者
在学习内存管理的过程中,感觉带着问题去找答案可能思路会清晰些,我列了一些便于理清思路的问题,希望大家一起完善啊~~~

1.内存寻址的方式,线性地址、物理地址的转换关系?

2.页目录表、页表作用?物理页面是如何分配的?

3.硬件高速缓存、TLB作用是?

4.进程页表、内核页表关系、作用是?

5.page、zone、node关系,分别是管理的目标是?

6.请求、释放页框的函数流程是?

7.高端内存页框的内核映射原理?

8.buddy system 提出的目的,方法?实现的过程是?

9.slab分配的原理?

10.非连续内存管理,连续的线性地址是如何与非连续的页框关联起来的?

11.进程结构是如何与内存管理系统关联起来的?

12.vm_area_struct是如何实现线性区的?

13.申请、释放线性地址区间的过程是?

14.do_mmap do_munmap  do_mremap实现的过程?

15.什么时候发生缺页,缺页异常处理程序的处理流程是?

16.如何做到请求调页?

17.进程堆管理,函数调用流程?这里如何与页框产生关系的?

18.系统没有空闲内存了会触发什么动作?

19.页框回收的方式有哪些?

20.页框回收时,是如何与slab、zone、node关联起来的?如何收缩slab?

21.pageout写回磁盘的流程是?

22.swap 信息的结构,缺页发生后,如何从磁盘唤回内存的?

23.内存管理中涉及到的高速缓存有哪些?

24.内存管理中数据结构有哪些?

论坛徽章:
0
95 [报告]
发表于 2012-04-12 20:33 |只看该作者
good good study, day day up!

论坛徽章:
0
96 [报告]
发表于 2012-04-13 19:32 |只看该作者
新手只知道改/proc/sys/vm/drop_caches可以释放内存

论坛徽章:
0
97 [报告]
发表于 2012-04-14 00:02 |只看该作者
实现各个task共享内核空间的机制:
1、各个task拥有自己的页表。
2、在切换task时将一级页表的高4K部分拷贝到新task的一级页表的高4K部分,再将新的task的页表基址告诉MMU,从而使MMU看到的内核空间和原任务的内核空间的映射关系是一样的。

一年前研究过的,把当时跟踪的一个问题答案贴出来。呵呵

论坛徽章:
0
98 [报告]
发表于 2012-04-14 09:29 |只看该作者
以前盲目的认为Linux可用内存就是free -m所看到的free,但是后来与前辈讨论得知自己的观点是错误的。
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。

通常情况:
  1. [root@localhost ~]#free -m
  2. total used free shared buffers cached
  3. Mem: 249 163 86 0 10 94
  4. -/+ buffers/cache: 58 191
  5. Swap: 511 0 511
复制代码
其中:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached

可用的memory=free memory+buffers+cached。

手动释放:cat /proc/sys/vm/drop_caches
cache的好处就是可以减少很多硬盘的访问。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
99 [报告]
发表于 2012-04-14 13:45 |只看该作者
回复 98# rootsecurity
的确是这样的。除非内存的确紧张了,否则没必要手动的清楚page cache。

   

论坛徽章:
0
100 [报告]
发表于 2012-04-14 17:21 |只看该作者
本帖最后由 EnjoyKernel 于 2012-04-14 17:23 编辑

结贴!
据我所知,Linux内存管理的粒度为页。内存分配粒度为页内大小块。

我100楼!!!LZ发奖品。。速度的。


额。。楼层怎么变了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP