免费注册 查看新帖 |

Chinaunix

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

『请教』get_free_pages申请大内存 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
21 [报告]
发表于 2009-10-16 11:34 |只看该作者
原帖由 peimichael 于 2009-10-16 11:31 发表
刚想到一个小问题,
VMALLOC_START是在high_memory之上的8M以后的,
那么假如我有1G内存,high_memory界限会划在896M吧
也就是说vmalloc最多只有128-8=120M了,这还要再除去顶端的固定内核映射等空间
那么这 ...


不是的。我是系统内存剩下不到200M了,所以分了100M。下面是分了150M的情形:
[root@localhost alloc_large_mem]# free
             total       used       free     shared    buffers     cached
Mem:        385624     212368     173256          0       4972      75260
-/+ buffers/cache:     132136     253488
Swap:       522104       7992     514112
[root@localhost alloc_large_mem]# insmod alloc_large_mem.ko
[root@localhost alloc_large_mem]# free
             total       used       free     shared    buffers     cached
Mem:        385624     366024      19600          0       4988      75260
-/+ buffers/cache:     285776      99848
Swap:       522104       7992     514112
[root@localhost alloc_large_mem]#

论坛徽章:
0
22 [报告]
发表于 2009-10-16 11:47 |只看该作者
原帖由 peimichael 于 2009-10-16 11:31 发表
物理内存越大,vmalloc能分配到的越少?

vmalloc 可以分配多少内存和 /proc/meminfo 有关
MemTotal:      1018680 kB
MemFree:        642760 kB
Buffers:         32800 kB
Cached:         126024 kB
SwapCached:          0 kB
Active:         243148 kB
Inactive:        94348 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      1018680 kB
LowFree:        642760 kB
SwapTotal:     2096440 kB
SwapFree:      2096440 kB
Dirty:            1224 kB
Writeback:           0 kB
AnonPages:      178728 kB
Mapped:          20260 kB
Slab:            15712 kB
SReclaimable:     4400 kB
SUnreclaim:      11312 kB
PageTables:        896 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   2605780 kB
Committed_AS:  1095916 kB
VmallocTotal:  1040376 kB
VmallocUsed:     10108 kB
VmallocChunk:  1030208 kB

启动时在 kernel 后面加参数 vmalloc=xxxM 可以指定系统允许使用多大虚拟内存空间,但这个数值必须 < 实际物理内存
至于有的机器为什么不指定也显示超大,而有的系统不指定则才 100M 左右,我就不清楚了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
23 [报告]
发表于 2009-10-16 11:52 |只看该作者

回复 #22 platinum 的帖子

白金兄,那你分配个800M的内存看一下能否成功。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
24 [报告]
发表于 2009-10-16 11:57 |只看该作者
刚刚试图分配300M的内存,我的系统仅剩下170多M的物理内存,分配前的情况如下:
[root@localhost alloc_large_mem]# free
             total       used       free     shared    buffers     cached
Mem:        385624     207388     178236          0       6220      76076
-/+ buffers/cache:     125092     260532
Swap:       522104       7992     514112
[root@localhost alloc_large_mem]# cat /proc/meminfo | grep Vmalloc
VmallocTotal:   638968 kB
VmallocUsed:      3512 kB
VmallocChunk:   633644 kB

加载模块,分配300M内存
[root@localhost alloc_large_mem]# insmod alloc_large_mem.ko
[root@localhost alloc_large_mem]# free
             total       used       free     shared    buffers     cached
Mem:        385624     378624       7000          0        212      20952
-/+ buffers/cache:     357460      28164
Swap:       522104      72520     449584
[root@localhost alloc_large_mem]# cat /proc/meminfo | grep Vmalloc
VmallocTotal:   638968 kB
VmallocUsed:    311032 kB
VmallocChunk:   326440 kB
[root@localhost alloc_large_mem]#

可见,物理内存减少了170M,但是从/proc/meminfo可以看出,虚拟内存由原先的3M多变成了311M,使用了300多M的虚拟内存。

论坛徽章:
0
25 [报告]
发表于 2009-10-16 12:05 |只看该作者

回复 #22 platinum 的帖子

在386机器上,如果物理内存超过1G的话,default的vmalloc区间只有128M左右。同过vmalloc=XX参数的话,是减少了kernel线性映射空间为代价的。

在x86_64的机子上就没有这个问题,vmalloc的区间可以很大。

论坛徽章:
0
26 [报告]
发表于 2009-10-16 12:36 |只看该作者

又做了一个实验

# cat /proc/meminfo
MemTotal:      1544432 kB
MemFree:       1475704 kB
Buffers:          8604 kB
Cached:          31096 kB
SwapCached:          0 kB
Active:          30860 kB
Inactive:        19308 kB
HighTotal:      786368 kB
HighFree:       741500 kB
LowTotal:       758064 kB
LowFree:        734204 kB
SwapTotal:      522104 kB
SwapFree:       522104 kB
Dirty:            2524 kB
Writeback:           0 kB
AnonPages:       10512 kB
Mapped:           3184 kB
Slab:             7696 kB
SReclaimable:     2272 kB
SUnreclaim:       5424 kB
PageTables:        192 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1294320 kB
Committed_AS:    16540 kB
VmallocTotal:  1294328 kB    // 在启动时 kernel 里 vmalloc=1280M
VmallocUsed:      4216 kB
VmallocChunk:  1289704 kB


# free
             total       used       free     shared    buffers     cached
Mem:       1544432      68660    1475772          0       8604      31096
-/+ buffers/cache:      28960    1515472
Swap:       522104          0     522104

# insmod module.ko

# free
             total       used       free     shared    buffers     cached
Mem:       1544432    1118084     426348          0       8688      31096
-/+ buffers/cache:    1078300     466132
Swap:       522104          0     522104

# rmmod module

# free
             total       used       free     shared    buffers     cached
Mem:       1544432      69596    1474836          0       8772      31096
-/+ buffers/cache:      29728    1514704
Swap:       522104          0     522104

#

代码如下

  1. #include <linux/module.h>
  2. #include <linux/vmalloc.h>

  3. MODULE_AUTHOR("platinum");
  4. MODULE_DESCRIPTION("This is a module sample.");
  5. MODULE_LICENSE("GPL");

  6. #define MB      (1024*1024)

  7. __u8 *data;

  8. int
  9. init_module (void)
  10. {
  11.         data = vmalloc(1024 * MB);

  12.         if (!data)
  13.                 return -ENOMEM;

  14.         memset(data, 0xff, 1024 * MB);
  15.         printk("module loaded.\n");
  16.         return 0;
  17. }


  18. void
  19. cleanup_module(void)
  20. {
  21.         vfree(data);
  22.         printk("module unloaded.\n");
  23. }
复制代码

由此可见,在内核里分配并使用了 1G 内存空间,虽然实现了,但不知道用于生产环境是否可行

在386机器上,如果物理内存超过1G的话,default的vmalloc区间只有128M左右。同过vmalloc=XX参数的话,是减少了kernel线性映射空间为代价的。

在x86_64的机子上就没有这个问题,vmalloc的区间可以很大。

不知道这种代价到底有多大,对内存管理不熟悉,eexplorer 兄可否给我们讲一下

论坛徽章:
0
27 [报告]
发表于 2009-10-16 12:48 |只看该作者
白金前辈,你的vmalloc怎么有1280M阿。。你用的64系统么?

论坛徽章:
0
28 [报告]
发表于 2009-10-16 13:07 |只看该作者
原帖由 peimichael 于 2009-10-16 12:48 发表
白金前辈,你的vmalloc怎么有1280M阿。。你用的64系统么?

我用的是 32bit 虚拟机,里面运行的是 32bit linux 系统 gentoo
虚拟机分配了 1536MB 内存(宿主机 2GB)

论坛徽章:
0
29 [报告]
发表于 2009-10-16 13:21 |只看该作者

回复 #25 eexplorer 的帖子

可是他却分配了1G的,...
是不是0xc0000000边界下降了?

论坛徽章:
0
30 [报告]
发表于 2009-10-16 13:56 |只看该作者

回复 #29 epegasus 的帖子

查了一下,在compile kernel的时候有一个memory splict的选项,
可以改变PAGE_OFFSET的值。可以查一下 /lib/modules/`uname -r`/build/.config里CONFIG_PAGE_OFFSET的值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP