本篇内容主要讲解“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分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/204089.html