您好,登錄后才能下訂單哦!
本篇內容主要講解“Mysql Innodb中的Linux native異步I/O分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Mysql Innodb中的Linux native異步I/O分析”吧!
在5.7中Innodb異步I/O的內存結構發生了一些變化特別是異步I/O數組和以前的結構體不同變為了類叫做AIO類但是換湯不換藥只是將一些方法進行了封裝,而異步i/o實際的請求放到了Slot結構體它們分別對應了5.6 os_aio_array_t和os_aio_slot_t。
MYSQL中的異步I/O線程
我以前一直搞不清楚這幾個線程的作用,為了搞清楚這個我才決定好好學習一下異步I/O
如下面的參數設置
mysql> show variables like '%io_threads%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | innodb_read_io_threads | 2 | | innodb_write_io_threads | 2 | +-------------------------+-------+
我在本數據中實際設置了2個read 異步i/o線程和2個write異步I/O線程此外都包含一個log和ibuf異步I/O線程在數據庫中我們也可以查詢到這6個異步I/O線程
mysql> select a.thd_id,b.THREAD_OS_ID,a.user ,a.conn_id,b.TYPE,a.source,a.program_name from sys.processlist a,performance_schema.threads b where b.thread_id=a.thd_id and user like '%io%'; +--------+--------------+------------------------+---------+------------+--------------------+--------------+ | thd_id | THREAD_OS_ID | user | conn_id | TYPE | source | program_name | +--------+--------------+------------------------+---------+------------+--------------------+--------------+ | 3 | 14059 | innodb/io_ibuf_thread | NULL | BACKGROUND | NULL | NULL | | 4 | 14060 | innodb/io_log_thread | NULL | BACKGROUND | sync0debug.cc:1296 | NULL | | 5 | 14061 | innodb/io_read_thread | NULL | BACKGROUND | NULL | NULL | | 6 | 14062 | innodb/io_read_thread | NULL | BACKGROUND | NULL | NULL | | 7 | 14063 | innodb/io_write_thread | NULL | BACKGROUND | sync0debug.cc:1296 | NULL | | 8 | 14064 | innodb/io_write_thread | NULL | BACKGROUND | NULL | NULL | +--------+--------------+------------------------+---------+------------+--------------------+--------------+
AIO類、線程、Slot的關系
首先一個AIO類對應了一個類型的異步,比如ibuf/log/read/write都對應一個AIO類,并且在類的最后用一個類的靜態全局成員進行指向如下:
/** Insert buffer */ static AIO* s_ibuf; /** Redo log */ static AIO* s_log; /** Reads */ static AIO* s_reads; /** Writes */ static AIO* s_writes;
而我們的異步I/O線程實際上有6個也就是s_reads包含了2個線程/s_writes包含了2個線程,那么線程引入了一個叫做local segment的概念,實際上每一個線程對應了一個local segment,而在AIO下面掛的就是一個Slot的vertor數組,數組的大小和每種類型的線程個數(local segment)和每個線程最大的Slot有關,看源碼中對最大的Slot的定義如下:
8 * OS_AIO_N_PENDING_IOS_PER_THREAD
其中宏定義OS_AIO_N_PENDING_IOS_PER_THREAD=32
那么對于s_ibuf和s_log因為只有一個線程(local segment)那么就有256個Slot,而s_reads和s_writes當前我的數據庫各有2個線程(local segment)那么就有2*256=512個Slot.
global segment
這個概念主要和模擬的異步I/O有關,如果我當前有6個異步I/O線程那么global segment就是6,因為在進行初始化調用AIO::start的時候其編號總是固定的及0和1對應了然后是read和write線程個數,那么由global segment到local segment的換算也變得簡單了可以參考AIO::get_segment_no_from_slot.
如果沒有顯示指定本文所有segment均指local segment
整個內存結構的初始化是從由innobase_start_or_create_for_mysql調用的下面代碼開始的如下:
到此,相信大家對“Mysql Innodb中的Linux native異步I/O分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。