MySQLStudy之--MySQL体系结构深入解析(二)

2015-07-24 08:18:33 · 作者: · 浏览: 2
ages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pages read 152, created 0, written 1 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the lastprintout Pages read ahead 0.00/s, evicted withoutaccess 0.00/s, Random read ahead 0.00/s LRU len: 152, unzip_LRU len: 0 I/O sum[0]:cur[0], unzip sum[0]:cur[0] -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 0 read views open inside InnoDB Main thread process no. 2461, id139733873489664, state: sleeping Number of rows inserted 0, updated 0,deleted 0, read 0 0.00 inserts/s, 0.00 updates/s, 0.00deletes/s, 0.00 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT

?

?

[root@mysrv ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.4-m7-log Sourcedistribution
 
Copyright (c) 2000, 2011, Oracle and/or itsaffiliates. All rights reserved.
 
Oracle is a registered trademark of OracleCorporation and/or its
affiliates. Other names may be trademarksof their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' toclear the current input statement.
 
mysql> show variables like'innodb_%io%';
+---------------------------------+---------+
| Variable_name                   | Value   |
+---------------------------------+---------+
| innodb_additional_mem_pool_size | 8388608|
| innodb_io_capacity              | 200     |
| innodb_read_io_threads          | 4       |
| innodb_replication_delay        | 0       |
| innodb_use_native_aio           | ON      |
| innodb_version                  | 1.2.4   |
| innodb_write_io_threads         | 4       |
+---------------------------------+---------+
7 rows in set (0.01 sec)

?

后台线程主要作用有三个:

1. 刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据

2. 将修改的数据文件刷新到磁盘文件

3. 在数据库发生异常情况下,保证InnoDB能恢复到正常运行状态

master thread的线程优先级别最高。其内部由几个循环(loop)组成:主循环(loop)、后台循环(backgroundloop)、刷新循环(flush loop)、暂停循环(suspend loop)。master thread会根据数据库运行的状态在loop、background loop、 flush loop和suspend loop中进行切换。loop称为主循环,因为大多数的操作都在这个循环中,其中有两大部分操作:每秒钟的操作和每10秒的操作.

Loop为主循环,如果没有用户活动,就切换到backgroundloop中,然后跳转会loop,如果还需要flush刷新,那就转到flush loop,如果在flush loop中也空闲,那就切换到suspend loop中,将master thread挂起等待事件的发生。

?

Mysql 进程结构

\

\

?

Loop:

每秒一次的操作包括:

? 日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)。

? 合并插入缓冲(可能)。

? 至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)。

? 如果当前没有用户活动,切换到background loop(可能)。

接着来看每10秒的操作,包括如下内容

? 刷新100个脏页到磁盘(可能)。

? 合并至多5个插入缓冲(总是)。

? 将日志缓冲刷新到磁盘(总是)。

? 删除无用的Undo页(总是)。

? 刷新100个或者10%脏页到磁盘(总是)。

? 产生一个检查点(总是)。

Background loop会执行以下操作

? 删除无用的Undo页(总是)。

? 合并20个插入缓冲(总是)。

? 跳回到主循环(总是)。

? 不断刷新100个页,直到符合条件(可能,跳转到flush loop中完成)。

Mysql进程结构--控制磁盘io的参数

? innodb_io_capacity

? 用来表示磁盘IO的吞吐量,默认值为200。对于刷新到磁盘的数量(脏缓冲),会按照innodb_io_capacity的百分比来刷新相对数量的页

? 在合并插入缓冲时,合并插入缓冲的数量为innodb_io_capacity数值的5%。

? 在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity。

? innodb_max_dirty_pages_pct

? 默认值为75%。加快脏页刷新频率,减少恢复时间,也可保证磁盘IO负载。

? innodb_adaptive_flushing:

? 在innodbplugin中。该值影响每1秒刷新脏页的数量。原来的刷新规则是:如果脏页在缓冲池所占的比例小于innodb_max_dirty_pages_pct时,不刷新脏页。大于innodb_max_dirty_pages_pct时,刷新100个脏页,而innodb_adaptive_flushing参数的引入,InnoDB存储引擎会通过一个名为buf_flush_get_desired_flush_rate的函数判断产生重做日志的速度来判断最合适的刷新脏页的数量。因此,当脏页的比例小于innodb_max_dirty_pages_pct时,也会刷新一定量的脏页。

? 还有两个和mysql启动和关闭有关的参数

? innodb_fast_shutdown

? 这个参数影响着innodb表的行为,该参数可设置为0,1,2

? 0: 表示当MySQ