您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > InnoDB-Buffer-Pool管理调研-何登成
InnoDBBufferPool管理调研何登成BUFFERPOOL导读............................................................................................................................2BUFFERPOOL初始化........................................................................................................................2初始化流程..........................................................................................................................................2BUFFERPOOL页面管理.....................................................................................................................4PAGETOBUFFERPOOL...............................................................................................................................4BUFFERPOOLLRULIST.......................................................................................................................4PAGEMOVEMENTINLRU...........................................................................................................................4oldpagemovetonew?....................................................................................................................4newpagebecameold?.....................................................................................................................6BUFFERPOOL页面分配..........................................................................................................................7BUFPOOLLRULISTFLUSH.........................................................................................................................10beforeMySQL5.6.2........................................................................................................................10afterMySQL5.6.2...........................................................................................................................11buf_flush_LRU................................................................................................................................12BUFFERPOOLFLUSHLIST.................................................................................................................13ADDPAGETOFLUSHLIST...........................................................................................................................13REMOVEPAGEFROMFLUSHLIST.................................................................................................................14BUFFERPOOLLRU/FLUSHLISTFLUSH对比......................................................................................14BUFFERPOOLDUMP/LOAD..............................................................................................................15参考文档.........................................................................................................................................15BufferPool导读InnoDBBufferPool,可以说是InnoDB系统内部最重要的模块之一。通过系统参数innodb_buffer_pool_size,用户可以设置几G,几十G,乃至上百G的内存空间。那么,InnoDB系统是如何管理这么大一片内存空间的呢?BufferPool空间如何初始化?BufferPool是通过什么数据结构管理的?如何从BufferPool中分配page?BufferPool已满情况下,如何替换?BufferPool的LRUlist,Flushlist,Freelist上分别有哪些操作?LRUlistflush与Flushlistflush有和不同?本文将详细调研InnoDBBufferPool实现,回答以上提到的各个问题。BufferPool初始化本章主要讨论InnoDB系统初始化的时候,是如何分配bufferpool的内存空间,并且如何初始化这一大块内存空间的。初始化流程源码处理流程:srv0start.cc::innobase_start_or_create_for_mysql//若用户指定的bufpoolsize大于1G,则设置最大的等待线程数为50000if(srv_buf_pool_size=1000*1024*1024)srv_max_n_threads=50000;//初始化bufpool主函数入口//1.每个bufpool的大小为srv_buf_pool_size除以instance个数//2.调用buf_pool_init_instance函数,初始化各个bufpool实例//3.计算buf_poolLRUlist中,oldList部分所占的比率,初始化时默认为3/8//此参数在运行时可以调整,若设置了不同的oldratio,则涉及到调整//buf_pool-LRU_old指向的位置(LRU_old指向的是LRUlist中位于oldratio处的//block位置;oldration调整,LRU_old需要相应的做出调整)//关于LRUlist被划分为new与old两部分的原因及意义,可参考//TheInnoDBBufferPool[1]buf_pool_init(total_size,n_instances);size=total_size/n_instances;流程1//2.1初始化bufpool的freelist//2.2计算每个bufpool实际所需要的空间。空间必须按照page_size对齐;//必须为每个page分配一个内存block结构,用于管理内存page//2.3调用os_men_alloc_large函数,为bufpool分配大块内存//若使用了大页(HugePage),则调用shmget,shmat,shmctl方法分配空间//若在windows平台下,则调用VirtualAlloc函数分配空间//若未使用MMAP,则调用ut_malloc_low函数分配空间//是使用MMAP,则调用mmap函数分配空间////2.4将分配出来的mem空间,按照pagesize对其,作为page的起点//2.5将mem空间划分为两部分:前部分作为block结构的空间;后部分作为//page的空间,page空间每一个page的起始位置,必须按照pagesize对齐//block结构起始位置,为mem空间的0号位置;//page空间的起始位置,为预留足够的block结构之后的第一个frame位置//2.6为每一个page指定一个block头结构,并初始化:初始化各种mutex与lock//每个block头结构的大小:MySQL5.1,32位304bytes;64位800bytes//2.7将page加入bufpool的freelist链表,等待分配//2.8创建bufpool对应的pagehash表,若page对应于文件中的一个页,则page//在hash表中存在,便于page在内存中的快速定位buf_pool_init_instance();流程2UT_LIST_INIT(buf_pool-free);buf_chunk_init();mem_size=ut_2pow_round(mem_size,UNIV_PAGE_SIZE);mem_size+=ut_2pow_round((mem_size/UNIV_PAGE_SIZE)*(sizeof*block)+(UNIV_PAGE_SIZE–1),UNIV_PAGE_SIZE);os0proc.cc::os_men_alloc_large(mem_size);流程2.3frame=(bytes*)ut_align(chuck-mem,UNIV_PAGE_SIZE);流程2.4buf_block_init(buf_pool,block,frame);流程2.6UT_LIST_ADD_LAST(buf_pool-free);流程2.7buf_pool-page_hash=hash_create(2*buf_pool-curr_size);流程2.8buf_pool_set_sizes();buf_LRU_old_ratio_update(100*3/8,FALSE);流程3buf0lru.cc::buf_LRU_old_ratio_update_inst
本文标题:InnoDB-Buffer-Pool管理调研-何登成
链接地址:https://www.777doc.com/doc-6500997 .html