MySQLソース分析(4):InnoDB主要データ構造及び呼び出しフロー

6335 ワード

原文住所:http://software.intel.com/zh-cn/blogs/2010/09/01/mysql4innodb/
1.主要データ構造(buf 0 buf.h)
(1)Buf_pool
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第1张图片
Buf_poolはbufferシステム全体のコアデータ構造であり、データベース内のすべての操作がこのバッファ層に反映されます.このバッファのサイズは、プロファイル(InnoDB_buffer_pool_size)で指定できます.
Buffer poolには、buffer_を実装するための多層データ構造も含まれています.poolのオンラインサイズ調整はchunkデータ構造を導入した.
Chunk
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第2张图片
chunkデータ構造はより具体的なメモリキャッシュであり、主にメモリブロックを制御するblock構造を含む.
Block
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第3张图片
Blockの主なデータ構造はpageとframeであり、この2つの構造はハードディスク上のデータベースpageを格納するために使用されます.ハードディスク(HDD)ストレージが圧縮を使用していない場合、frameにデータが読み出されます.圧縮を使用するとpageに格納.zipで.
Page構造は、その構造体の第1の位置に置く必要があり、後でポインタを使用する際にpageとblockの間で容易に変換することができる.
例:(buf_page_t*)buf_block_t *p
buf_というタイプが得られますPageのポインタ
Page
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第4张图片
Page構造は主にハードディスク上のファイルを格納し、spaceとoffsetを通じてハードディスク上のデータベースファイルに唯一対応する.io_fixはこのpageのタイプ(読み取りまたは書き込み)を指摘する.Zipは圧縮されたpageを格納する.
Buf_pool模式図
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第5张图片
Io_threads
InnoDB内部では、デフォルトの構成パラメータを使用する場合、10個のスレッドがあります.そのうち、4個のreadスレッド、4個のwriteスレッドがあり、非同期の読み書き操作、1個のlog writeスレッドがあり、操作をログファイルに記録し、1個のsrv_マスタースレッドは、定期的にデータをディスクに書き込むなどの作業を担当します.
InnoDBプラグインの初期化時にinnobase_が呼び出されますstart_or_create_for_mysql、この関数はInnoDBストレージエンジンの初期化を完了します.io threadsを作成する部分は関数で
os_thread_create(io_handler_thread, n + i, thread_ids + i)
そのうちio_handler_threadはコールバック関数で、主にバックグラウンドスレッドごとにタスクを割り当てます.
for (i = 0;; i++) {
    fil_aio_wait(segment);
    mutex_enter(&ios_mutex);
    ios++;
    mutex_exit(&ios_mutex);
}

fil_aio_waitで主な役割を果たすのはos_aio_simulated_handleは、InnoDBでスレッドの番号に基づいて非同期IO設定をシミュレートします.
segment = os_aio_get_array_and_local_segment(&array, global_segment);

Aioとsync aio
mysqlが誕生した時、LinuxにはAIOメカニズムが現れず、InnoDB自身が非同期ioのフレームワークを実現した.
Linux aioの紹介について、AIO first entered the Linux kernel in 2.5 and is now a standard feature of 2.6 production kernels.http://www.ibm.com/developerworks/linux/library/l-async/
最近Innobaseはinnodb pluginにおいて真のAIO機構を実現した.http://blogs.innodb.com/wp/2010/04/innodb-performance-aio-linux/
Arrays
os_aio_read_array//非同期読み
os_aio_write_array//非同期書き込み
os_aio_ibuf_array//insert bufer
os_aio_log_array//ログarray
os_aio_sync_array//同期io array
InnoDBにsync aioを導入し,コードレベルでaioの形式と一致することを目標とした.
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第6张图片
InnoDBの非同期IOが導入した配列を実現するために、システムには5種類の配列が存在する.IO要求が発生すると、非同期メカニズムはこの要求を1つのスロット(slot)に挿入し、要求を実行する信号を待つ.IOが完了し、このスロットから削除します.
Segment
arrayでは、segmentをarrayの識別子として用い、segment値に基づいてarrayの種類を得ることができる.例えば、デフォルトのarray数(4個read、4個write)3号でread arrayを表す
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第7张图片
Slot
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第8张图片
非同期読み書き要求を格納するスロット.
2.呼び出しプロセス
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第9张图片
InnoDBでは、応答速度を向上させるために、直ちにデータを返す必要がある場合があり、この場合は同期した読み出し機構を採用する.一方、速度の要求がそれほど高くない場合、例えばプリフェッチでは、InnoDBは非同期でデータをメモリにロードします.一方、double write bufferをオンにしてデータを書き込む場合、InnoDBはまずハードディスク上のdouble write bufferと呼ばれる領域にデータを書き、将来のある時点でディスクに書き込むと、システムの現在の負荷、現在のメモリ内の汚れたページ数によって異なる遅延が発生します.
非同期読み書き時に要求を待つ:
MySQL源码分析(4):InnoDB主要数据结构及调用流程_第10张图片
キャッシュ・ブロック/ファイルの読み取りが完了すると、次のメッセージが表示されます.
fil_io() -> os_aio()->os_aio_simulated_wake_handler_threads()->os_aio_simulated_wake_handler_thread->os_event_set()->pthread_cond_broadcast()