MySQL源码详解二 初始化performance_schema
本回将详细分析一个非常重要的函数initialize_performance_schema,从这个函数的名字就可以知道,它是用来初始化performance_schema的,他的目的就是把一些实现类和方法注入performance_schema需要的一些接口中,我们看看这个函数做了哪些事情
1.pfs_automated_sizing(param);
根据上一回提到的mysql根据你的参数和操作系统等限制调整之后设置的最大连接数等参数会传入这个方法,并由此设置performance_schema的一些初始化参数,主要是比较这几个参数max_connections、table_definition_cache、table_open_cache 。并通过大小设置了三种performance_schema规格,主要是history相关表的规格
2.init_timers();
根据平台的不同调用操作系统的接口来初始化performance_schema的计时器,这个初始化的结果可以得到每种计时器每次计数增加的值、调用这个计数器耗费的时间以及每秒能计数多少次,这个结果能够直观的在performance_timmers这张表里面看到
那么这些数字是如何得到的呢,简而言之,就是多次调用获得时间的函数从而计算每次调用的耗费时间,既然算出了调用函数的耗费时间,计算每次调用计数器增加值和每秒的频率当然也是很容易算出来的
3.init_event_name_sizing(param);
4.register_global_classes();
这两个个函数都是和分配全局空间和初始化全局哈西表有关,它们分配的空间的用处没有上下文不太好理解,所有的仪器都是在一个全局数组中的,有一些不是单例的仪器就会需要数组的一段空间,这里暂时先不讨论
接着就是对各种仪器的初始化,这里详细说明,所谓的仪器(instrumentation),就是performance_schema监控的实现类。先来看一下他们的数据结构
/** 所有仪器的通用数据结构(父类) */ struct PFS_instr_class { /** 一个枚举值,总共有17种 */ PFS_class_type m_type; /** 是否启用 */ bool m_enabled; /** 是否使用计时器(统计仪器的耗时等) */ bool m_timed; /** 一个标志位,标志着是否单例等 */ int m_flags; /** Instrument name index. Self index in: - EVENTS_WAITS_SUMMARY_*_BY_EVENT_NAME for waits - EVENTS_STAGES_SUMMARY_*_BY_EVENT_NAME for stages - EVENTS_STATEMENTS_SUMMARY_*_BY_EVENT_NAME for statements - EVENTS_TRANSACTIONS_SUMMARY_*_BY_EVENT_NAME for transactions */ uint m_event_name_index; /** Instrument name. */ char m_name[PFS_MAX_INFO_NAME_LENGTH]; /** Length in bytes of @c m_name. */ uint m_name_length; /** timer类型,实际上就是我之前列举的那几种timer之一 */ enum_timer_name *m_timer; bool is_singleton() const { return m_flags & PSI_FLAG_GLOBAL; } bool is_mutable() const { return m_flags & PSI_FLAG_MUTABLE; } bool is_progress() const { DBUG_ASSERT(m_type == PFS_CLASS_STAGE); return m_flags & PSI_FLAG_STAGE_PROGRESS; } bool is_shared_exclusive() const { DBUG_ASSERT(m_type == PFS_CLASS_RWLOCK); return m_flags & PSI_RWLOCK_FLAG_SX; } //... };这里再列举一个他的实现类
/** Instrumentation metadata for a COND. */ struct PFS_ALIGNED/*这是一个宏,效果是按照64字节对齐*/ PFS_cond_class : public PFS_instr_class { PFS_cond_stat m_cond_stat;/**信号量相关的采集数据,不过这个暂时没有向用户展示*/ /** 它是一个单例 */ PFS_cond *m_singleton; };有些仪器是单例模式的,有些仪器是有多个实例的
5.初始化所有的表
接着就是通过一连串函数初始化所有的performance_schema中的内存表,包括setup表
至于将这些实现类如何注册进mysql的接口层,下次再说
- 上一篇:没有了
- 下一篇: MySQL源码详解一 mysqld启动