`
mqzhuang
  • 浏览: 185278 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Glibc内存管理--ptmalloc2源代码分析(九)

阅读更多

3.2.6 配置选项概述

Ptmalloc主要提供以下几个配置选项用于调优,这些选项可以通过mallopt()进行设置:

1.    M_MXFAST

M_MXFAST用于设置fast bins中保存的chunk的最大大小,默认值为64Bfast bins中保存的chunk在一段时间内不会被合并,分配小对象时可以首先查找fast bins,如果fast bins找到了所需大小的chunk,就直接返回该chunk,大大提高小对象的分配速度,但这个值设置得过大,会导致大量内存碎片,并且会导致ptmalloc缓存了大量空闲内存,去不能归还给操作系统,导致内存暴增。

M_MXFAST的最大值为80B,不能设置比80B更大的值,因为设置为更大的值并不能提高分配的速度。Fast bins是为需要分配许多小对象的程序设计的,比如需要分配许多小struct,小对象,小的string等等。

如果设置该选项为0,就会不使用fast bins

 

2.    M_TRIM_THRESHOLD

M_TRIM_THRESHOLD用于设置mmap收缩阈值,默认值为128KB。自动收缩只会在free时才发生,如果当前freechunk大小加上前后能合并chunk的大小大于64KB,并且top chunk的大小达到mmap收缩阈值,对于主分配区,调用malloc_trim()返回一部分内存给操作系统,对于非主分配区,调用heap_trim()返回一部分内存给操作系统,在发生内存收缩时,还是从新设置mmap分配阈值和mmap收缩阈值。

         这个选项一般M_MMAP_THRESHOLD选项一起使用,M_MMAP_THRESHOLD用于设置mmap分配阈值,对于长时间运行的程序,需要对这两个选项进行调优,尽量保证在ptmalloc中缓存的空闲chunk能够得到重用,尽量少用mmap分配临时用的内存。不停地使用系统调用mmap分配内存,然后很快又free掉该内存,这样是很浪费系统资源的,并且这样分配的内存的速度比从ptmalloc的空闲chunk中分配内存慢得多,由于需要页对齐导致空间利用率降低,并且操作系统调用mmap()分配内存是串行的,在发生缺页异常时加载新的物理页,需要对新的物理页做清0操作,大大影响效率。

         M_TRIM_THRESHOLD的值必须设置为页大小对齐,设置为-1会关闭内存收缩设置。

         注意:试图在程序开始运行时分配一块大内存,并马上释放掉,以期望来触发内存收缩,这是不可能的,因为该内存马上就返回给操作系统了。

 

3.    M_MMAP_THRESHOLD

M_MMAP_THRESHOLD用于设置mmap分配阈值,默认值为128KBptmalloc默认开启动态调整mmap分配阈值和mmap收缩阈值。

当用户需要分配的内存大于mmap分配阈值,ptmallocmalloc()函数其实相当于mmap()的简单封装,free函数相当于munmap()的简单封装。相当于直接通过系统调用分配内存,回收的内存就直接返回给操作系统了。因为这些大块内存不能被ptmalloc缓存管理,不能重用,所以ptmalloc也只有在万不得已的情况下才使用该方式分配内存。

但使用mmap分配有如下的好处:

l   Mmap的空间可以独立从系统中分配和释放的系统,对于长时间运行的程序,申请长生命周期的大内存块就很适合有这种方式。

l   Mmap的空间不会被ptmalloc锁在缓存的chunk中,不会导致ptmalloc内存暴增的问题。

l   对有些系统的虚拟地址空间存在洞,只能用mmap()进行分配内存,sbrk()不能运行。

使用mmap分配内存的缺点:

l   该内存不能被ptmalloc回收再利用。

l   会导致更多的内存浪费,因为mmap需要按页对齐。

l   它的分配效率跟操作系统提供的mmap()函数的效率密切相关,Linux系统强制把匿名mmap的内存物理页清0是很低效的。

所以用mmap来分配长生命周期的大内存块就是最好的选择,其他情况下都不太高效。

 

4.    M_MMAP_MAX

M_MMAP_MAX用于设置进程中用mmap分配的内存块的最大限制,默认值为64K,因为有些系统用mmap分配的内存块太多会导致系统的性能下降。

如果将M_MMAP_MAX设置为0ptmalloc将不会使用mmap分配大块内存。

         Ptmalloc为优化锁的竞争开销,做了PER_THREAD的优化,也提供了两个选项,M_ARENA_TESTM_ARENA_MAX,由于PER_THREAD的优化默认没有开启,这里暂不对这两个选项做介绍。

         另外,ptmalloc没有提供关闭mmap分配阈值动态调整机制的选项,mmap分配阈值动态调整时默认开启的,如果要关闭mmap分配阈值动态调整机制,可以设置M_TRIM_THRESHOLDM_MMAP_THRESHOLDM_TOP_PADM_MMAP_MAX中的任意一个。但是强烈建议不要关闭该机制,该机制保证了ptmalloc尽量重用缓存中的空闲内存,不用每次对相对大一些的内存使用系统调用mmap去分配内存。

分享到:
评论
1 楼 hxz_qlh 2016-10-28  
“M_MMAP_MAX用于设置进程中用mmap分配的内存块的最大限制,默认值为64K,” 这里简单的把 65536 转成“64K”我觉得有问题:

查看官方 man page:http://man7.org/linux/man-pages/man3/mallopt.3.html 中对该参数的解释为:
引用

M_MMAP_MAX
              This parameter specifies the maximum number of allocation
              requests that may be simultaneously serviced using mmap(2).
              This parameter exists because some systems have a limited
              number of internal tables for use by mmap(2), and using more
              than a few of them may degrade performance.

              The default value is 65,536, a value which has no special
              significance and which servers only as a safeguard.  Setting
              this parameter to 0 disables the use of mmap(2) for servicing
              large allocation requests.


这里的单位是用 number 来表示,翻译成数量是不是更合理,”65536 个“。这个参数的意思为:用 mmap分配的内存块的最大数量。

相关推荐

Global site tag (gtag.js) - Google Analytics