jemalloc存储块(region、run、chunk)

jemalloc中按存储单元的块大小分,有region、run、chunk三种存储块。

最小的单元是region,它的大小是8字节~14KB,1个或多个相同大小的region组成一个run。

run的大小必须是页(4kB)的整数倍,相同大小region对应的run的大小总是相同的,多个run组成一个chunk。

chunk的大小固定是2M(或4M,可配置)。

region size run size number of region in run
8 4K 512
16 4k 256
32 4k 128
48 12k 256
64 4k 64
80 20k 256
96 12k 128
112 28k 256
128 4k 32
160 20k 128
192 12k 64
224 28k 128
256 4k 16
320 20k 64
384 12k 32
448 28k 64
512 4k 8
640 20k 32
768 12k 16
896 28k 32
1024 4k 4
1280 20k 16
1536 12k 8
1792 28k 16
2048 4k 2
2560 20k 8
3072 12k 4
3584 20k 8
4096 4k 1
5120 20k 4
6144 12k 2
7168 28k 4
8192 8k 1
10240 20k 2
12288 12k 1
14336 28k 2

相关代码:

arena_bin_info_t    arena_bin_info[NBINS];

static void
bin_info_init(void)
{
    arena_bin_info_t *bin_info;

#define    BIN_INFO_INIT_bin_yes(index, size)                \
    bin_info = &arena_bin_info[index];                    bin_info->reg_size = size;                        bin_info_run_size_calc(bin_info);                    bitmap_info_init(&bin_info->bitmap_info, bin_info->nregs);
#define    BIN_INFO_INIT_bin_no(index, size)
#define    SC(index, lg_grp, lg_delta, ndelta, bin, lg_delta_lookup)    \
    BIN_INFO_INIT_bin_##bin(index, (ZU(1)<<lg_grp) + (ZU(ndelta)<<lg_delta))
    SIZE_CLASSES
#undef BIN_INFO_INIT_bin_yes
#undef BIN_INFO_INIT_bin_no
#undef SC
}

gdb中打印arena_bin_info:

(gdb) p je_arena_bin_info
$353 = {{
    reg_size = 8,
    redzone_size = 0,
    reg_interval = 8,
    run_size = 4096,
    nregs = 512,
    bitmap_info = {
      nbits = 512,
      ngroups = 8
    },
    reg0_offset = 0
  }, {
    reg_size = 16,
    redzone_size = 0,
    reg_interval = 16,
    run_size = 4096,
    nregs = 256,
    bitmap_info = {
      nbits = 256,
      ngroups = 4
    },
    reg0_offset = 0
  }, {
    reg_size = 32,
    redzone_size = 0,
    reg_interval = 32,
    run_size = 4096,
    nregs = 128,
    bitmap_info = {
      nbits = 128,
      ngroups = 2
    },
    reg0_offset = 0
  }, {
     ...
  }, {
    reg_size = 12288,
    redzone_size = 0,
    reg_interval = 12288,
    run_size = 12288,
    nregs = 1,
    bitmap_info = {
      nbits = 1,
      ngroups = 1
    },
    reg0_offset = 0
  }, {
    reg_size = 14336,
    redzone_size = 0,
    reg_interval = 14336,
    run_size = 28672,
    nregs = 2,
    bitmap_info = {
      nbits = 2,
      ngroups = 1
    },
    reg0_offset = 0
  }}

region、run、chunk之间的位置关系如下:

时间: 2024-10-01 21:14:38

jemalloc存储块(region、run、chunk)的相关文章

Rhel6-moosefs分布式存储配置文档

MFS 特性: 1. Free(GPL) 2. 通用文件系统,不需要修改上层应用就可以使用 3. 可以在线扩容,体系架构可伸缩性极强. 4. 部署简单. 5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或 写的性能,只会加速!) 6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类 似 oralce 的闪回等高级 dbms 的即时回滚特性!) 7. 提供 netapp,emc,ibm 等商业存储的 snapsh

C# 读取WAV文件(详细)

class WAVReader { #region RIFF WAVE Chunk private string Id; //文件标识 private double Size; //文件大小 private string Type; //文件类型 #endregion #region Format Chunk private string formatId; private double formatSize; //数值为16或18,18则最后又附加信息 private int formatTa

Linux排错:rpmdb: PANIC: fatal region error detected; run recovery

[[email protected] ~]$ sudo rpm -ivh MySQL-server-5.6.20-1.el6.x86_64.rpm  rpmdb: PANIC: fatal region error detected; run recovery 安装mysql时候,提示rpmdb错误.google了一下centos的KB,解决思路如下: 需要清除rpm的database,保险起见,将/var/lib/rpm目录下的数据做个备份到/home/tmp里 [[email protect

jemalloc管理块(arena、bin)

arena是jemalloc的总的管理块,一个进程中可以有多个arena,arena的最大个可以通过静态变量narenas_auto,. 可通过静态数组arenas获取进程中所有arena的指针: (gdb) p narenas_auto $359 = 2 (gdb) p *[email protected] $360 = {0x7f93e02200, 0x7f93f12280} 可知,目前进程中arena的最大个数是2,它们的指针分别为0x7f93e02200,0x7f93f12280. ar

jemalloc和内存管里

netty的buffer引入了缓冲池.该缓冲池实现使用了jemalloc的思想.为了看懂这块代码学写了内容分配的知识.这里讲的内存分配是堆的内存分配,其他内容本文不会涉及. 内存分配是面向虚拟内存的而言的,以页为单位进行管理的,页的大小一般为4kb,当在堆里创建一个对象时(小于4kb),会分配一个页,当再次创建一个对象时会判断该页剩余大小是否够,够的话使用该页剩余的内存,减少系统调用.真实的内存分配算法比这个复杂了,效率不好的内存算法会导致出现很多内存碎片. 内存分配的核心思想概括起来有3条 1

[MODx] 8. Snippet get data, chunk display

Simple Example: Lets process this chunk and output its value. We have this Chunk, called "WelcomeChunk": <p>Welcome [[+name]]!</p> We'll put this in our Snippet: $output = $modx->getChunk('WelcomeChunk',array( 'name' => 'John',

hbase源码系列(三)Client如何找到正确的Region Server

客户端在进行put.delete.get等操作的时候,它都需要数据到底存在哪个Region Server上面,这个定位的操作是通过HConnection.locateRegion方法来完成的. loc = hConnection.locateRegion(this.tableName, row.getRow()); 这里我们首先要讲hbase的两张元数据表-ROOT-和.META.表,它们一个保存着region的分部信息,一个保存着region的详细信息.在<hbase实战>这本书里面详细写了

region split流程分析

region split流程分析 splitregion的发起主要通过client端调用regionserver.splitRegion或memstore.flsuh时检查并发起. Client通过rpc调用regionserver的splitRegion方法 client端通过HBaseAdmin.split传入regionname与splitpoint(切分的rowkey,能够不传入), 通过meta得到此region所在的server,发起rpc请求,调用HRegionServer.spl

三 Client如何找到正确的Region Server

客户端在进行put.delete.get等操作的时候,它都需要数据到底存在哪个Region Server上面,这个定位的操作是通过 Connection.locateRegion方法来完成的. loc = hConnection.locateRegion(this.tableName, row.getRow()); 这里我们首先要讲hbase的两张元数据 表-ROOT-和.META. 表,它们一个保存着 region的分部信息,一个保存着region的详细信息.在<hbase实战>这本书里面详