Performance Schema是一种帮助DBA进行性能调优的工具,它通过进行实际的度量而不是“野生的猜测。“本节演示了为此目的使用性能模式的某些方法。这里讨论依赖于使用事件过滤,这将描述第27.4.2节,“性能模式事件过滤”。
下面的示例提供了一种方法,可以用于分析可重复的问题,例如调查性能瓶颈。首先,您应该有一个可重复的用例,其中考虑了性能“太慢了“并需要优化,您应该启用所有仪器(根本没有预滤波)。
运行用例。
使用性能模式表,分析性能问题的根本原因。这种分析严重依赖于过滤后。
对于排除的问题区域,禁用相应的仪器。例如,如果分析显示该问题与特定存储引擎中的文件I/O无关,则禁用该引擎的文件I/O工具。然后截断历史和汇总表以删除以前收集的事件。
重复第1步的过程。
每次迭代,性能模式输出,尤其是
events_waits_history_long
表中,包含的东西越来越少“噪音“由于仪器不重要造成的,并且鉴于这个表有一个固定的大小,包含了越来越多的与分析手头问题相关的数据。在每一次迭代中,调查应该越来越接近问题的根本原因,如“信号/噪声“比率提高,进行分析更容易。
一旦确定了性能瓶颈的根本原因,就采取适当的纠正措施,例如:
调优服务器参数(缓存大小、内存等)。
通过不同的方式调整查询,
调优数据库模式(表、索引等)。
调优代码(仅适用于存储引擎或服务器开发人员)。
在步骤1开始再次开始,以查看性能变化的影响。
这mutex_instances.locked_by_thread_id.
和rwlock_instances.write_locked_by_thread_id.
列对于研究性能瓶颈或死锁非常重要。这是通过Performance Schema工具实现的,如下所示:
假设线程1正在等待互斥锁。
你可以确定线程在等待什么:
选择* from performence_schema.events_waits_current,其中thread_id =thread_1.;
假设查询结果确定了线程正在等待互斥锁A
events_waits_current。OBJECT_INSTANCE_BEGIN
。你可以确定哪个线程持有互斥锁A:
SELECT * FROM performance_schema。mutex_instances WHERE OBJECT_INSTANCE_BEGIN =mutex_A;
假设查询结果确定它是线程2,持有互斥锁A,如中所示
mutex_instances.locked_by_thread_id.
。你可以看到线程2正在做什么:
选择* from performence_schema.events_waits_current,其中thread_id =Thread_2.;