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

59次阅读
没有评论

共计 2698 个字符,预计需要花费 7 分钟才能阅读完成。

本篇内容主要讲解“Mysql Innodb 中的 Linux native 异步 I / O 分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“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 分析”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计2698字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)