溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Mysql Innodb中的Linux native異步I/O分析

發(fā)布時(shí)間:2021-11-15 13:38:30 來(lái)源:億速云 閱讀:181 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

本篇內(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。

二、幾個(gè)基本概念

  • 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

三、內(nèi)存結(jié)構(gòu)的初始化

整個(gè)內(nèi)存結(jié)構(gòu)的初始化是從由innobase_start_or_create_for_mysql調(diào)用的下面代碼開(kāi)始的如下:

Mysql Innodb中的Linux native異步I/O分析

到此,相信大家對(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI