原文作者: Peter Zaitsev
首先,让我们来了解一下 SHOW INNODB STATUS 输出的基础,它打印了很多关于 InnoDB 内部性能相关的计数器、统计、事务处理信息等。在 MySQL 5 中,InnoDB 的性能统计结果也在 SHOW STATUS 结果中显示了。大部分和 SHOW INNODB STATUS 的其他信息相同,在旧版本中还没有这个功能。 SHOW INNODB STATUS 中的很多统计值都是每秒更新一次的,如果你打算利用这些统计值的话,那么最好统计一段时间内的结果。InnoDB 首先输出以下信息: 1.===================================== 下一部分显示了信号(Semaphores)相关信息: 1.---------- 通过这部分信息,你就会知道系统负载的热点在哪了。不过这需要了解一下源码相关的知识 - 从上面的信息中就可以看出来是哪个源码文件中的哪行(不同的版本结果可能不同),只是从这里却看不出来任何信息。尽管如此,还是可以从文件名中猜到一些东西 - 比如本例中,文件名 "buf0buf.ic" 预示着和一些缓冲池争夺有关系。如果想了解更多,就去看源码吧。 还有一些关于等待的更多细节。"lock var" 表示当前的 mutex 对象的值(被锁住 = 1 / 释放 = 0) 值,"waiters flag" 表示当前的等待个数。另外,本例中还可以看到等待状态信息 "wait is ending",这表示 mutex 已经释放,但是系统调度线程还正在处理。 第二块是事件统计 - "reservation count" 和 "signal count" 显示了 innodb 使用内部同步阵列的活跃程度 - 时间片(slot)分配以及线程信号使用同步阵列的频繁程度。这些统计信息可以用于表示 innodb 回退到系统等待的频率。还有关于系统等待的直接相关信息,可以看到"OS Waits"的互斥信号灯(mutexes),以及读写锁。这些信息中显示了互斥锁和共享锁。系统等待和 "保留(reservation)" 不完全一样,在回退到用 sync_array 的复杂等待模式前,innodb 会尝试 "输出(yield)" 到系统,希望下一次调度时间对象里命名线程已经释放了。系统等待相对较慢,如果每秒发生了上万次系统等待,则可能会有问题。另一个观察方法是查看系统状态中的上下文(context)交换频率。 另一块重要的信息是 "spin waits" 和 "spin rounds" 的数量。相较于系统等待,自旋锁是低成本的等待;不过它是一个活跃的等待,会浪费一些cpu资源。因此如果看到大量的自旋等待和自旋轮转,则很显然它浪费了很多cpu资源。浪费cpu时间和无谓的上下文切换之间可以用 innodb_sync_spin_loops 来平衡。 接下来的这段显示死锁状况: 1.------------------------ 下面是关于外键约束引发的死锁信息: 1.------------------------ 接下来是显示 Innodb 当前活跃的事务: 1.------------ 事务ID是当前事务的标识,事务的id每次都会增加。Purge done for trx's n:o 是指净化(purge)线程已经完成的事务数。Innodb仅清除那些被当前事务认为不再需要的旧版本数据。那些未提交的旧事务可能会阻塞净化线程并且消耗资源。通过查看2次清除事务数之差,就可以知道是否发生了这种情况。少数情况下,净化线程可能难以跟上更新的速度,2次查看值之差可能会越来越大;那么,innodb_max_purge_lag 就派得上用场了。 "undo n:o" 显示了净化线程当前正在处理的回滚日志号,如果当前不处于活跃状态,则它的值是 0。 History list length 6 是指在回滚空间中的未清除事务数。随着事务的提交,它的值会增加;随着清除线程的运行,它的值会减小。 Total number of lock structs in row lock hash table 是指事务分配过的行锁结构总数。它和曾经被锁住过的行总数不一定相等,通常是一个锁结构对应多行记录。 MySQL中,每个连接如果没有活动的事务,则它的状态是 not started,如果有活动的事务,则是 ACTIVE。注意,尽管事务是活动的,但是其连接的状态却可能是 "睡眠(sleep)" - 如果是在一个有多条语句的事务里的话。Innodb 会同时显示系统的线程号以及进程号,这有助于利用gdb来调试或者其他类似用途。另外,事务的状态也会根据当前实际状态来显示,例如 "读取记录(fetching rows)",em>"更新(updating)"等等。"Thread declared inside InnoDB 400" 的意思是 Innodb 内核正在运行该线程,并且还需要400个票。Innodb 会根据 innodb_thread_concurrency 的值来限制同时并发的线程数不超过它。如果线程当前不在 Innodb 的内核中运行,则它的状态可能是 "waiting in InnoDB queue" 或 "sleeping before joining InnoDB queue"。后面这个状态有点意思 - Innodb 为了避免有太多的线程同时抢着要进入运行队列,那么就会尝试让这些线程进入等待状态(如果没有足够的空闲插槽(slot)的话)。这就可能会导致 Innodb 内核中当前活跃的线程数可能比 innodb_thread_concurrency 的值还小。某种负载环境下,这可能有助于减小线程进入队列的时间。可以通过调整 innodb_thread_sleep_delay 来实现,它的单位是微妙。 mysql tables in use 1, locked 0 是指事务中已经用过的数据表个数(已经访问过了的),以及被锁的个数。Innodb 一般情况不会锁表,因此锁表数一般是0,除非是 ALTER TABLE 或者其他类似 LOCK TABLES 的语句。 除了Innodb相关的特定信息外,一些基本信息可以通过 来查看,例如正在执行什么语句,查询ID号,查询状态等。
1.-------- 每个线程都会显示正在进行的操作数量 - 同时正要执行或者正在执行的操作数量。另外,正在执行的 fsync 操作数量也会显示出来。有写数据时,Innodb需要确保数据最终被写到磁盘上,只是把它们放在系统缓存里是不够的。通常是调用 fsync() 来完成的。如果它的值一直很高,那意味这Innodb可能是处于IO负载较高状态。注意,由线程执行请求引发的IO请求是不计算在内的,因此尽管系统的IO负载较高,但是它们的值却可能为 0。 接下来显示的是IO操作的平均统计值,它们对于图形显示或者监控很有用。 1.------------------------------------- Innodb采用哈希索引建立内存页索引形成自适应哈希索引而不是采 B-tree 索引,得以加速行记录到内存页的检索。这里显示了哈希表的大小,以及自适应哈希索引使用了多少单元和缓冲。可以通过计算利用哈希索引检索的次数以及没利用它检索的次数来了解哈希索引的效率。 当前对自适应哈希索引基本没有什么办法可以调整它,主要还是用于查看。 1.--- 另外,还能看到日志写入以及检查点的数目。根据日志 I/O 操作的数目可以区分开表空间相关的IO请求和日志IO请求数量,进而可以确定到底需要几个日志文件。注意,innodb_flush_log_at_trx_commit 的值可以影响到日志写操作的代价高或低。如果 innodb_flush_logs_at_trx_commit=2,则日志是写到系统缓存,然后再顺序写到日志文件中,因此相对会快很多。 1.---------------------- 等待中的读写是指内存缓冲池级别的请求。Innodb可能会把多个文件级别的请求合并到一个上,因此各不相同。我们还可以看到Innodb提交的各种不同类型的IO,LRU内存页中需要刷新的页 - 脏内存页,它们不会被长时间存取;刷新列表 - 我们还可以看到内存页总共读写了多少次。已经创建的内存页是当前一个内存页中的内容没有读取到内存缓冲池中时,专门为新数据创建的空内存页。 最后我们可以看到缓冲池的命中率,它预示着缓冲池的效率。1000/1000 相当于 100% 的命中率。不过这样也很难说明缓冲池的命中率就足够高了,这要需要根据不同的负载环境而定。通常情况下,950/1000 就够了,有些时候在IO负载较高的环境下,命中率可能为 995/1000。 1.-------------- 一开始显示了Innodb线程队列状态 - 有多少线程处于等待或活跃的。Innodb内部打开了多少读视图 - 接下来可以看到自从系统启动以来,所有的数据行操作数量及其平均值。它们可以很方便地用于监控以及画出系统状态图,数据行操作次数可以很好的衡量Innodb的负载。不是所有的数据行操作带来的负载都是一样的,存取10字节的行比10Mb的行相比会小了很多,不过相对于查询的总次数来说这个信息可是有用的多了,差别也很大。 还有一点需要注意的是,SHOW INNODB STATUS 不是一成不变的,有些时间点上可能会不相符。SHOW INNODB STATUS结果中,不同时间可能会显示不同结果,因此有些时候可能会看到冲突的信息。这是由于设计时需要由全局锁提供一致性信息,导致了大量的开销。
|
mysql SHOW INNODB STATUS 探秘
最新推荐文章于 2025-02-17 17:09:22 发布
mysql SHOW INNODB STATUS 探秘