免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1973 | 回复: 8
打印 上一主题 下一主题

请教一个分配内存的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-29 16:09 |只看该作者 |倒序浏览
在机器内存是2G,内核中我使用kmem_cache_zalloc一直分配IP地址,一个node大约84字节,大约分到600万的时候(大约是480M内存)系统会死掉,在这个过程中我使用free -m查看内存使用情况,开始free内存越来越小,free到200M的时候开始增加(这个时候我还在kmem_cache_zalloc继续分配,不知道这是为什么增加),大约free增加到将近1G的时候,系统死掉。我不太清楚内核内存的使用机制,有几个问题向大家请教:
1. 我物理内存是2G的话,我使用kmem_cache_zalloc最多能占用多少内存呢,为什么分配到480M的时候系统会死掉呢?
2. 为什么free的内存最后会增长呢?

论坛徽章:
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
2 [报告]
发表于 2011-12-30 11:12 |只看该作者
回复 1# 里贵子

1. 我物理内存是2G的话,我使用kmem_cache_zalloc最多能占用多少内存呢,为什么分配到480M的时候系统会死掉呢?

1.使用kmem_cache_zalloc函数分配内存,最终实际上是从内核固定大小的告诉缓存来分配;这些高速缓存的大小为32,64,128,256,512,1024,2048,4096,8192,16384,32768,655356和131072;因为你需要的大小是84字节,所以最终会从128字节的高速缓存上分配节点。
2.由于使用kmem_cache_alloc函数,只能从NORMAL内存区域分配内存,也就是从16M-896M(我想你的内存空间应该是按内核态:用户态=1:3的比例)这个区间。
3.实际可使用的内存应该是(896-16-内核使用空间)大约在800M左右
4.实际能分配的节点个数为: 800M/128B 大约是 6.25M,也就是最多分配大约625万个节点,就会因为内存不足而导致内核panic。
   

论坛徽章:
0
3 [报告]
发表于 2011-12-30 11:25 |只看该作者
瀚海书香 发表于 2011-12-30 11:12
回复 1# 里贵子

十分感谢瀚海书香回答,
1. 那我能否通过修改内核参数修改内核态和用户态这个比例呢?因为我2G的内存我想多分一些给内核?
2. kmem_cache_zalloc在NORMAL区分配空间,那我能否通过修改内核参数加大NORMAL区的整体空间呢?

论坛徽章:
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
4 [报告]
发表于 2011-12-30 12:47 |只看该作者
回复 3# 里贵子
1. 那我能否通过修改内核参数修改内核态和用户态这个比例呢?因为我2G的内存我想多分一些给内核?
2. kmem_cache_zalloc在NORMAL区分配空间,那我能否通过修改内核参数加大NORMAL区的整体空间呢?


这个可以通过修改内核配置参数CONFIG_PAGE_OFFSET来扩大内核空间。

论坛徽章:
0
5 [报告]
发表于 2011-12-30 13:34 |只看该作者
回复 4# 瀚海书香
还是没太明白,你说的内核空间:用户空间是1:3是说虚拟的4G空间来分还是实际的物理内存的分配?如果是物理内存,我2G的内存内核空间应该是500M啊,怎么能分配到800M的空间呢?

我机器内存2G如下:
  1. bash-3.2# cat /proc/meminfo
  2. MemTotal:        2065436 kB
  3. MemFree:         1911448 kB
  4. Buffers:           16344 kB
复制代码
.config文件配置如下:
  1. CONFIG_HIGHMEM4G=y
  2. # CONFIG_HIGHMEM64G is not set
  3. CONFIG_PAGE_OFFSET=0xC0000000
  4. CONFIG_HIGHMEM=y
复制代码
应该是你所说的3:1的配置,那如果我改为CONFIG_PAGE_OFFSET=0x80000000,是否就将比例改为了1:1了?



   

论坛徽章:
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
6 [报告]
发表于 2011-12-30 13:43 |只看该作者
回复 5# 里贵子
还是没太明白,你说的内核空间:用户空间是1:3是说虚拟的4G空间来分还是实际的物理内存的分配?如果是物理内存,我2G的内存内核空间应该是500M啊,怎么能分配到800M的空间呢?

1:3是指虚拟地址空间。也就是说即使你有2G的内存,由于只有1G的内核虚拟地址空间,所有可以直接访问的地址空间不会超过1G,但是可以通过高端内存来访问所有的2G空间。

论坛徽章:
0
7 [报告]
发表于 2011-12-30 13:54 |只看该作者
本帖最后由 里贵子 于 2011-12-30 13:56 编辑

回复:6# 瀚海书香
谢谢瀚海书香的指导,也就是说因为这里配置的是0xC0000000,所以内核地址空间就有1G,不管物理内存多少,内核最多访问1G的物理内存,如果我改为0x80000000,那么我内核地址空间就是2G,我能访问的物理内存就最多是2G,是这意思吗?


   

论坛徽章:
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
8 [报告]
发表于 2011-12-30 13:58 |只看该作者
回复 7# 里贵子
也就是说因为这里配置的是0xC0000000,所以内核地址空间就有1G,不管物理内存多少,内核最多访问1G的物理内存,如果我改为0x80000000,那么我内核地址空间就是2G,我能访问的物理内存就最多是2G,是这意思吗?

可以这样理解。确切的说应该是直接映射的内存大小,因为内核可以通过高端内存映射来访问所有的物理内存。

   

论坛徽章:
0
9 [报告]
发表于 2011-12-30 14:01 |只看该作者
回复 8# 瀚海书香
谢了,我去试一下!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP