您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Mysql Innodb中的Linux native異步I/O分析”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Mysql Innodb中的Linux native異步I/O分析”吧!
在5.7中Innodb異步I/O的內(nèi)存結(jié)構(gòu)發(fā)生了一些變化特別是異步I/O數(shù)組和以前的結(jié)構(gòu)體不同變?yōu)榱祟?lèi)叫做AIO類(lèi)但是換湯不換藥只是將一些方法進(jìn)行了封裝,而異步i/o實(shí)際的請(qǐng)求放到了Slot結(jié)構(gòu)體它們分別對(duì)應(yīng)了5.6 os_aio_array_t和os_aio_slot_t。
MYSQL中的異步I/O線程
我以前一直搞不清楚這幾個(gè)線程的作用,為了搞清楚這個(gè)我才決定好好學(xué)習(xí)一下異步I/O
如下面的參數(shù)設(shè)置
mysql> show variables like '%io_threads%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | innodb_read_io_threads | 2 | | innodb_write_io_threads | 2 | +-------------------------+-------+
我在本數(shù)據(jù)中實(shí)際設(shè)置了2個(gè)read 異步i/o線程和2個(gè)write異步I/O線程此外都包含一個(gè)log和ibuf異步I/O線程在數(shù)據(jù)庫(kù)中我們也可以查詢(xún)到這6個(gè)異步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類(lèi)、線程、Slot的關(guān)系
首先一個(gè)AIO類(lèi)對(duì)應(yīng)了一個(gè)類(lèi)型的異步,比如ibuf/log/read/write都對(duì)應(yīng)一個(gè)AIO類(lèi),并且在類(lèi)的最后用一個(gè)類(lèi)的靜態(tài)全局成員進(jìn)行指向如下:
/** Insert buffer */ static AIO* s_ibuf; /** Redo log */ static AIO* s_log; /** Reads */ static AIO* s_reads; /** Writes */ static AIO* s_writes;
而我們的異步I/O線程實(shí)際上有6個(gè)也就是s_reads包含了2個(gè)線程/s_writes包含了2個(gè)線程,那么線程引入了一個(gè)叫做local segment的概念,實(shí)際上每一個(gè)線程對(duì)應(yīng)了一個(gè)local segment,而在AIO下面掛的就是一個(gè)Slot的vertor數(shù)組,數(shù)組的大小和每種類(lèi)型的線程個(gè)數(shù)(local segment)和每個(gè)線程最大的Slot有關(guān),看源碼中對(duì)最大的Slot的定義如下:
8 * OS_AIO_N_PENDING_IOS_PER_THREAD
其中宏定義OS_AIO_N_PENDING_IOS_PER_THREAD=32
那么對(duì)于s_ibuf和s_log因?yàn)橹挥幸粋€(gè)線程(local segment)那么就有256個(gè)Slot,而s_reads和s_writes當(dāng)前我的數(shù)據(jù)庫(kù)各有2個(gè)線程(local segment)那么就有2*256=512個(gè)Slot.
global segment
這個(gè)概念主要和模擬的異步I/O有關(guān),如果我當(dāng)前有6個(gè)異步I/O線程那么global segment就是6,因?yàn)樵谶M(jìn)行初始化調(diào)用AIO::start的時(shí)候其編號(hào)總是固定的及0和1對(duì)應(yīng)了然后是read和write線程個(gè)數(shù),那么由global segment到local segment的換算也變得簡(jiǎn)單了可以參考AIO::get_segment_no_from_slot.
如果沒(méi)有顯示指定本文所有segment均指local segment
整個(gè)內(nèi)存結(jié)構(gòu)的初始化是從由innobase_start_or_create_for_mysql調(diào)用的下面代碼開(kāi)始的如下:
到此,相信大家對(duì)“Mysql Innodb中的Linux native異步I/O分析”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。