0%

Innodb监控

Innodb监控

Innodb由于支持事务操作,是mysql中使用最多的存储引擎,所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的,那么如何进行监控呢?

show engine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-- 显示innodb存储引擎状态的统计和配置信息
show engine innodb status;

展示的主要内容有
-----------------
BACKGROUND THREAD --后台线程
-----------------
srv_master_thread loops: 19610306 srv_active, 0 srv_shutdown, 9705136 srv_idle --统计Innodb启动后的活动
srv_master_thread log flush and writes: 29312902 --写入和刷新日志的次数
----------
SEMAPHORES --信号量包含了线程等待互斥锁或读写锁的信息
----------
OS WAIT ARRAY INFO: reservation count 52795642 --os等待数组信息,分配插槽的次数
OS WAIT ARRAY INFO: signal count 57522728 --os等待数组信息,线程通过数组得到信号的次数
RW-shared spins 0, rounds 77349143, OS waits 9180114 --共享锁期间,读写锁存器上自旋等待个数,自旋循环迭代次数以及操作系统调用的等待个数
RW-excl spins 0, rounds 179767865, OS waits 2534243 --排他锁期间,读写锁存器上自旋等待个数,自旋循环迭代次数以及操作系统调用的等待个数
RW-sx spins 2068750, rounds 40171680, OS waits 844522 --共享排他锁期间,读写锁存器上自选等待个数,自旋循环迭代次数以及操作系统调用的等待个数
Spin rounds per wait: 77349143.00 RW-shared, 179767865.00 RW-excl, 19.42 RW-sx --对于每一个互斥锁,操作系统调用等待的每一个自旋循环迭代个数
------------
TRANSACTIONS --包含所有当前正在执行的事务的信息
------------
Trx id counter 1888483436 --当前事务id
Purge done for trx s n:o < 1888483436 undo n:o < 0 state: running but idle --所有编号小于1888483436的事务都已经从历史记录列表中清除了,清除旧的MVCC行时所用的事务id,这个值与当前事务ID进行比较,就可以知道有多少老版本的数据未被清除
History list length 17 --历史列表的长度,位于Innodb数据文件的撤销空间里的页面的数目,如果事务执行了更新并提交,该数目就会增加,当清理进程移除旧版本数据时,该数目会减少
LIST OF TRANSACTIONS FOR EACH SESSION: 当前事务列表
---TRANSACTION 422068961001072, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068960999248, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961005632, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961013840, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961012016, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961010192, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961001984, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961000160, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961017488, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961011104, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961012928, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961004720, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961002896, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961003808, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961007456, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O --各种IO操作的Innodb内部线程以及执行了多少次IO操作
--------
-- 有四个线程
-- insert buffer thread 负责插入缓冲合并
-- log thread 负责异步刷日志
-- read thread 执行预读操作以尝试预先读取Innodb预感需要的数据
-- write thread 刷脏缓冲
I/O thread 0 state: waiting for completed aio requests (insert buffer thread) --IO线程的状态
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0 -- 挂起操作的信息,aio是指异步io
83934578288 OS file reads, 282688772 OS file writes, 190348192 OS fsyncs --innodb启动后的总统计信息
984.40 reads/s, 16384 avg bytes/read, 10.15 writes/s, 9.12 fsyncs/s --最后一次显示后的总统计信息
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX --插入缓冲区与自适应散列统计信息
-------------------------------------
Ibuf: size 1, free list len 3078, seg size 3080, 8815726 merges --在页中插入缓冲索引树的当前大小,空闲列表的长度,在包含插入缓冲树与头信息的文件段中已分配页的个数,被合并页的个数
merged operations:
insert 6898371, delete mark 38430046, delete 1226485 --通过类型区分,索引页被执行合并操作的次数
discarded operations:
insert 1019, delete mark 0, delete 0 --无须合并丢弃操作的数量
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 74 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 2 buffer(s)
Hash table size 34673, node heap has 28 buffer(s)
Hash table size 34673, node heap has 7 buffer(s)
5203.54 hash searches/s, 128.14 non-hash searches/s --成功使用自适应散列索引查找的数量,当不能使用自适应索引时向下搜索B树的次数
---
LOG --Innodb日志中活动信息
---
Log sequence number 319041331834 --当前日志序号
Log flushed up to 319041331699 -- 日志已经刷到的位置
Pages flushed up to 319033170877
Last checkpoint at 319033170877 -- 上一个检查点,当前日志序列号LSN
0 pending log flushes, 0 pending chkp writes
169033177 log i/o's done, 8.92 log i/o's/second --挂起的日志写入次数,挂起的检查点写入个数,innodb启动后的IO操作个数,从最近一次显示之后的每秒IO操作个数
----------------------
BUFFER POOL AND MEMORY --Innodb缓冲池与内存使用情况
----------------------
Total large memory allocated 137428992 --分配的内存
Dictionary memory allocated 1204989 --被数据字典表与索引对象所占空间的字节数
Buffer pool size 8191 --缓冲池个数
Free buffers 1024 --空闲缓冲区个数
Database pages 7052 --当前缓冲区LRU队列的长度(分配用来存储数据库页的页数)
Old database pages 2583 --旧的LRU队列的长度
Modified db pages 530 --需要刷新的页面的数量(脏数据库页数)
Pending reads 0 --挂起读操作的个数
Pending writes: LRU 0, flush list 0, single page 0 --通过LRU算法,等待刷新的页数
Pages made young 983912385, not young 304833753259 --因为最近第一次被访问时,变成新页面的数目和没有变成新页面的数目
1.54 youngs/s, 16246.04 non-youngs/s -- 上述两个值每秒的速率
Pages read 83934649301, created 4135172, written 103030852 --读操作的页面数目,在缓冲区中创建但是没有读取的页面数目,写操作的页面数目
984.40 reads/s, 0.17 creates/s, 1.15 writes/s -- 上述值美妙的速率
Buffer pool hit rate 972 / 1000, young-making rate 0 / 1000 not 478 / 1000 --读取到的页面数与获得的缓冲池页面的比例,变为新页面的页面数与获得缓冲池页面的比例,没有变为新页面的页面数与获得缓冲池页面的比例
Pages read ahead 913.79/s, evicted without access 5.60/s, Random read ahead 0.00/s --预读的速率与不通过访问剔除的预读页面的个数
LRU len: 7052, unzip_LRU len: 0 --LRU列表的长度,unzip_LRU列表的长度
I/O sum[4121]:cur[0], unzip sum[0]:cur[0] --IO操作的次数:当前间隔的IO
--------------
ROW OPERATIONS --行操作
--------------
0 queries inside InnoDB, 0 queries in queue --当前有多少个正在执行的查询,在innodb_thread_concurrency队列中的查询个数
0 read views open inside InnoDB --只读视图的数量
Process ID=1543, Main thread ID=140593683990272, state: sleeping --线程id以及状态
Number of rows inserted 56092883, updated 133093048, deleted 40729879, read 477150639699 --从innodb启动后,插入、更新、删除、读取的行数
0.19 inserts/s, 7.73 updates/s, 0.00 deletes/s, 138100.85 reads/s -- 速率


1
2
3
4
5
6
7
8
9
10
11
-- 展示Innodb的互斥体信息
show engine innodb mutex;

Type Name Status
InnoDB rwlock: dict0dict.cc:2782 waits=4
InnoDB rwlock: dict0dict.cc:1228 waits=80
InnoDB rwlock: log0log.cc:846 waits=75
InnoDB sum rwlock: buf0buf.cc:1460 waits=11

-- name列显示了创建互斥体的源文件和行号
-- status列显示了互斥体在操作系统上的等待次数

show status

通过查看日志文件

1
2
3
4
5
6
7
8
9
10
11
show status like 'innodb%log%'

Variable_name Value
Innodb_log_waits 0 日志文件太小时,操作必须等待日志刷新的等待时间计数器,该值如果长期大于0,可以适当增加日志文件大小
Innodb_log_write_requests 4539 日志写入请求的数量
Innodb_log_writes 22 数据被写入日志的次数
Innodb_os_log_fsyncs 1020 操作系统文件同步的数量(fsync()方法调用)
Innodb_os_log_pending_fsyncs 0 阻塞的文件同步请求的数量,如果该值开始增长并长期大于0,需要检查磁盘访问问题
Innodb_os_log_pending_writes 0 阻塞的日志写请求的次数,如果该值开始增长并长期大于0,需要检查磁盘访问问题
Innodb_os_log_written 2855424 写入日志中的字节总量
Innodb_available_undo_logs 128

缓冲池信息

缓冲池是Innodb缓存频繁访问数据的地方,对缓冲池内数据的任何更新也会被缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 可以查看存储引擎的统计信息,其中包含有缓冲池的信息
show engine innodb status;

截取出缓冲池的信息来进行分析
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 223164
Buffer pool size 8191
Free buffers 7374 空的且可用于缓冲数据的缓冲段个数
Database pages 809
Old database pages 299
Modified db pages 0 发生变化的页数
Pending reads 0 等待中的读请求个数
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 503, created 306, written 2534
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 809, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

在查看一下缓冲区相关的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
show status like 'innodb%buf%'


Variable_name Value
Innodb_buffer_pool_pages_data 809 含有数据的页数,包括不变和改变的页
Innodb_buffer_pool_bytes_data 13254656 含有数据的字节数
Innodb_buffer_pool_pages_dirty 0 改变的字节数
Innodb_buffer_pool_bytes_dirty 0 改变的页的数目
Innodb_buffer_pool_pages_flushed 2525 缓冲池页面被刷新的次数
Innodb_buffer_pool_pages_free 7374 空页面的数目
Innodb_buffer_pool_pages_misc 8 用于管理工作的页数,公式为'Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data'
Innodb_buffer_pool_pages_total 8191 缓冲池中的总页数
Innodb_buffer_pool_read_ahead_rnd 0 扫描大块数据时发生随机读头的数量
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 107632 逻辑读请求的次数
Innodb_buffer_pool_reads 504 直接从磁盘中逻辑读取的次数(没有从缓冲池中读)
Innodb_buffer_pool_wait_free 0 如果缓冲池繁忙且没有空页,innodb需要等待页面刷新,该值表示等待次数,若始终大于0,可适当增加缓冲池大小
Innodb_buffer_pool_write_requests 47403 写入innodb缓冲池的次数

线程和连接统计信息

使用show status like '变量'来查询,这些变量用来跟踪尝试的连接、退出的连接、网络流量和线程统计

  • Connections
  • Max_used_connections
  • Threads_connected
  • Aborted_clients
  • Aborted_connects 如果不为0,表示有人尝试连接失败
  • Bytes_received
  • Bytes_sent
  • Slow_launch_threads
  • Threads_cached
  • Threads_created
  • Threads_running

二进制日志状态

  • Binlog_cache_use和Binlog_cache_disk_use表示在二进制日志缓存中有多少事务被存储过,以及多少事务因为超过二进制日志缓存而被存储到一个临时文件中
  • Binlog_stmt_cache_use和Binlog_stmt_cache_disk_use表示非事务语句对应的度量值

命令计数器

Com_*变量统计了每种类型的SQL发起的次数

临时文件和临时表

通过Create_tmp%来查看隐式临时文件和临时表的统计

select类型

select_*变量统计select查询的计数器

  • Select_full_join 交叉连接或并没有条件匹配表中行的连接的数目,如果存在,需要检查sql语句
  • Select_full_range_join 使用在表t1中的一个值来从表t2中通过参考索引的区间内获取行所做的连接数,比Select_scan开销大些
  • Select_range 扫描表的一个索引区间的连接数目
  • Select_range_check 在表t2中重新评估表t1中的每一行的索引是否开销最小所做的连接数,意味着表t2中对该连接而言并没有使用索引,这种查询应该避免,开销很大
  • Select_scan 扫描整张表的连接数目

排序

  • Sort_merge_passes 依赖于sort_buffer_size服务器变量,sort_buffer_size来容纳排序的行块,当完成排序后,会将这些排序后的行合并到结果集中,此时就会增加Sort_merge_passes值
  • Sort_scan和Sort_range 当mysql从文件排序结果中读取已经排好序的行并返回给客户端会导致这两个变量的增长,如果是当Select_scan增加时Sort_scan增加;如果是Select_range增加时Sort_range增加

information_schema数据库中关于innodb的表

information_schema数据库中有几个对于innodb的特殊表,可以用于监控压缩、事务和锁

  • INNODB_CMP表 显示压缩表的详细信息和统计信息
  • INNODB_CMP_RESET表 与INNODB_CMP信息相同,但是会在查询表时将重置统计信息,可以定期跟踪统计信息
  • INNODB_CMPMEM表 显示在缓冲池中使用压缩的详细信息和统计信息
  • INNODB_CMPMEM_RESET表 与INNODB_CMPMEM信息相同,但是会在查询表时将重置统计信息,可以定期跟踪统计信息
  • INNODB_TRX表 显示所有事务的详细信息和统计信息,包括事务状态和当前正在运行的查询信息
  • INNODB_LOCKS表 显示事务请求的锁的详细信息和统计信息,描述每个锁的状态、模式、类型等信息
  • INNODB_LOCK_WAITS表 显示被阻塞的事务请求的锁的详细信息和统计信息,描述每个锁的状态、模式、类型和阻塞事务

欢迎关注我的其它发布渠道