glusterfs IO缓存池

写作不易,转载请注明出处:
http://blog.youkuaiyun.com/wbin233/article/details/82320575 ,谢谢。

glusterfs IO缓存池主要包括三个数据结构:iobuf_pool,iobuf_arena,iobuf。

iobuf

最小的io buffer单元

struct iobuf {
        union {   /* 链表,链接到同一个iobuf_arena中的其他iobuf */
                struct list_head      list;
                struct {
                        struct iobuf *next;
                        struct iobuf *prev;
                };
        };
        struct iobuf_arena  *iobuf_arena;   /* 该iobuf所属的iobuf_arena */

        gf_lock_t            lock;          /* for ->ptr and ->ref */
        gf_atomic_t          ref;           /* 0 == passive, >0 == active */

        void                *ptr;           /* 指向实际的存储区域,由iobuf_arena初始化时决定 */

        void                *free_ptr;      /* in case of stdalloc, this is the one to be freed */
};

iobuf_arena

包含了多个iobuf

struct iobuf_arena {
        union {   /* 链表,链接到同一个iobuf_pool中的其他iobuf_arena */
                struct list_head            list;
                struct {
                        struct iobuf_arena *next;
                        struct iobuf_arena *prev;
                };
        };

        struct list_head    all_list;
        size_t              page_size;      /* 该iobuf_arena中单个iobuf分配的大小(gf_iobuf_init_config其中一个) */
        size_t              arena_size;     /* 该iobuf_arena分配的缓存大小,为page_size * page_count */
        size_t              page_count;     /* 该iobuf_arena包含的iobuf个数 */

        struct iobuf_pool  *iobuf_pool;     /* 该iobuf_arena所属的iobuf_pool */

        void               *mem_base;       /* 该iobuf_arena的基地址,创建时由mmap映射到内存 */
        struct iobuf       *iobufs;         /* 指向该iobuf_arena中iobufs链表的头节点 */

        int                 active_cnt;
        struct iobuf        active;         /* head node iobuf(unused by itself) */
        int                 passive_cnt;
        struct iobuf        passive;        /* head node iobuf(unused by itself) */
        uint64_t            alloc_cnt;      /* 此池中的总分配数 */
        int                 max_active;     /* max active buffers at a given time */
}

iobuf_pool

相应的,iobuf_pool中则包含了多个iobuf_arena

struct iobuf_pool {
        pthread_mutex_t     mutex;
        size_t              arena_size;         /* iobuf_pool中总缓存大小,由各个iobuf_arena中分配累加得 */
        size_t              default_page_size;  /* iobuf的默认大小 */

        int                 arena_cnt;          /* iobuf_pool中包含的iobuf_arena个数 */
        struct list_head    all_arenas;         /* 链接了iobuf_pool中所有的iobuf_arena */

        /* 根据page_size(iobuf分配的大小)的不同进入不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值