注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

InnoDB模拟异步IO实现  

来自Longhui   2013-09-22 12:13:49|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

概述

         异步IO的原理是:请求的IO操作延迟执行,以便将多个连续位置的IO合并成一次IO,减少IO次数提高效率。

逻辑结构

         InnoDB使用了5个队列来管理请求的IO操作,所发起的IO操作首先被记录到队列中,然后由异步IO处理线程进行统一的调度执行。五个IO队列分别是:数据页的读,数据页的写,ibuf的读写,日志页的读写以及同步读写。队列的形式如下:

InnoDB异步IO实现 (MySQL 3.23) - raolh - raolh的博客
 

每一个IO队列都是分区的,一个区包含若干个基本队列元素,一个区对应图中的一种颜色。可以看到:ibuf读写队列,日志页的读写队列,同步读写队列只有一个区,而数据页的读队列和写队列都有若干个区。每一个区都有一个全局编号和一个本地编号,全局编号是所有队列的区合在一起进行的编号,而本地编号是队列内的编号。由于队列的排列顺序固定,因此全局编号和本地编号可以互相转换。

IO处理线程

         系统为每一个区创建一个IO处理线程(IO handler),专门批量处理一个区中的IO请求。

IO处理线程的作用是:将一个区中的连续位置的多个IO请求合并成一次IO进行处理,若区中没有IO请求则进入休眠等待。整个处理流程是:

InnoDB异步IO实现 (MySQL 3.23) - raolh - raolh的博客
 

         每个区的IO处理线程是在系统启动的时候创建的后台运行线程。

异步IO请求处理

         InnoDB当发起一个IO请求时,异步IO系统将这个IO请求作为一条记录插入到相应的IO队列中,然后直接返回。整个处理流程是:

InnoDB异步IO实现 (MySQL 3.23) - raolh - raolh的博客
 

插入IO请求

         插入一个IO请求记录到队列中时,队列可能已经满了,此时要进行额外的处理。整个处理流程如下:

InnoDB异步IO实现 (MySQL 3.23) - raolh - raolh的博客
 

数据结构

         记录一个IO请求的数据结构是:

struct os_aio_slot_struct{

         ibool          is_read;       /* TRUE if a read operation */

         ulint          pos;               /* index of the slot in the aio array */

         ibool          reserved;     /* TRUE if this slot is reserved */

         ulint          len;                /* length of the block to read or write */

         byte*        buf;               /* buffer used in i/o */

         ulint          type;                  /* OS_FILE_READ or OS_FILE_WRITE */

         ulint          offset;                /* 32 low bits of file offset in bytes */

         ulint          offset_high;     /* 32 high bits of file offset */

         os_file_t  file;                /* file where to read or write */

         char*        name;                /* file name or path */

         ibool          io_already_done; /* used only in simulated aio:

TRUE if the physical i/o already

made and only the slot message needs to

be passed to the caller of os_aio_simulated_handle */

         void*                  message1;       /* message which is given by the */

         void*                  message2;       /* the requester of an aio operation

                                                                  and which can be used to identify

                                                                  which pending aio operation was completed */

#ifdef WIN_ASYNC_IO

         OVERLAPPED   control;    /* Windows control block for the aio request */

#elif defined(POSIX_ASYNC_IO)

         struct aiocb      control;    /* Posix control block for aio request */

#endif

};

         一个IO处理队列的结构是:

struct os_aio_array_struct{

         os_mutex_t     mutex;                     /* the mutex protecting the aio array */

         os_event_t       not_full;                     /* The event which is set to the signaled

                                                                        state when there is space in the aio

                                                                          outside the ibuf segment */

         os_event_t       is_empty;                          /* The event which is set to the signaled

                                                                       state when there are no pending i/os

                                                                       in this array */

         ulint          n_slots;                      /* Total number of slots in the aio array.

                                                              This must be divisible by n_threads. */

         ulint          n_segments;             /* Number of segments in the aio array of

                                                              pending aio requests. A thread can wait

                                                              separately for any one of the segments. */

         ulint          n_reserved;               /* Number of reserved slots in the

                                                              aio array outside the ibuf segment */

         os_aio_slot_t*        slots;        /* Pointer to the slots in the array */

         os_event_t*    events;             /* Pointer to an array of event handles

                                                                 where we copied the handles from slots,

                                                              in the same order. This can be used in

                                                                 WaitForMultipleObjects; used only in

                                                              Windows */

};

  评论这张
 
阅读(701)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017