本回将详细分析一个非常重要的函数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源码详解二 初始化performance_schema相关推荐

  1. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  2. okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

    1.简单使用 同步:@Override public Response execute() throws IOException { synchronized (this) { if (execute ...

  3. 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】

    分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人 (8/10) 在进行本章的数学推导前,有必要先粗浅的介绍一下,笔者在广泛查找 ...

  4. 【 反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10)】

    反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10) 数学推导 BP算法 BP神经网络可以说机器学习的最基础网络.对于普通的简单 ...

  5. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  6. 【 梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10)】

    梯度下降算法 Gradient-Descend 数学推导与源码详解 深度学习 Pytorch笔记 B站刘二大人(2/10) 数学原理分析 在第一节中我们定义并构建了线性模型,即最简单的深度学习模型,但 ...

  7. 【 线性回归 Linear-Regression torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人(4/10)】

    torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 深度学习 Pytorch笔记 B站刘二大人(4/10) 介绍 至此开始,深度学习模型构建的预备知识已经完全准备完毕. 从本章开 ...

  8. Tensorflow 2.x(keras)源码详解之第十二章:keras中的损失函数之BinaryCrossentropy详解

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  9. Rocksdb Compaction源码详解(二):Compaction 完整实现过程 概览

    文章目录 1. 摘要 2. Compaction 概述 3. 实现 3.1 Prepare keys 过程 3.1.1 compaction触发的条件 3.1.2 compaction 的文件筛选过程 ...

最新文章

  1. 如何禁用<textarea>的调整大小抓取器? [重复]
  2. spring一: 容器以及bean生命周期
  3. shell语法简单介绍
  4. macbook双网卡路由
  5. microsoft store打不开,提示代码是: 0x80131500,怎么解决?
  6. Design Compiler指南——预综合过程
  7. 进击吧!Blazor!第一期回顾
  8. 【路由和交换之H3C自导自演】
  9. 多功能网页刷新助手(刷PV)
  10. 网络空间安全和计算机科学与技术的区别,密码与网络空间安全学科有什么区别...
  11. stm32Cubemx USB虚拟串口
  12. 关于FTP服务器出现227 Entering Passive Mode错误的解决思路
  13. python +高德地图API调用
  14. 码农架构 | Spring Boot 实现通用 Auth 认证的 4 种方式
  15. python微博情感分析,Python情感分析:鹿晗的粉丝们究竟原谅他了吗?
  16. 如何快速求出与n互素的数有多少个?
  17. 找规律填数字(c++基础)
  18. HCIP路由交换的三门考试
  19. 使用字符映射完成简单的对称加密
  20. Git之拉取指定tag版本/切换指定tag代码

热门文章

  1. Python实现博弈树minmax补全与α-β剪枝算法脚本简介
  2. 2014年哪些网页设计流行趋势最值得关注的?
  3. 软件测试面试必看,资深测试工程师面试题集锦 全网首发
  4. WhatsAppBusiness官方说明导读及调研分析
  5. MAYA卸载/完美解决安装失败/如何彻底卸载清除干净MAYA各种残留注册表和文件的方法
  6. python代码的注释只有一种方式、那就是使用_Python代码的注释只有一种方式,那就是使用#符号。...
  7. 激活函数以及损失函数
  8. 模型压缩之量化入门笔记||量化基本公式的理解||量化过程可视化||LSQ公式理解
  9. ceph 存储 对比_聊聊主流分布式存储技术的对比分析与应用
  10. TFTP协议介绍(细)