写作不易,转载请注明出处:
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分配的大小)的不同进入不