首页 > 编程语言 >StoneDB 源码解读系列|Tianmu 引擎工具类模块源码详解(一)

StoneDB 源码解读系列|Tianmu 引擎工具类模块源码详解(一)

时间:2023-08-03 11:04:06浏览次数:39  
标签:Tianmu log thread 源码 线程 StoneDB 堆栈 日志

StoneDB 源码解读系列文章正式开启,预计以周更的形式跟大家见面,请多多支持~ 本篇源码解读内容已进行直播分享,可在视频号观看直播回放,也可点击阅读原文跳转至 B 站观看回放视频。 PPT内容可在社区论坛中查看下载:https://forum.stonedb.io/t/topic/89

image.png 各个工具类属于 Tianmu 引擎的核心组件,这些组件可以说是 Tianmu 的基石,由于工具类的范围广,在源码解读系列中会挑选主要的一些跟大家做分享,包括:日志系统、异常处理、堆栈跟踪、线程池、内存管理、数据压缩/解压缩等。本篇内容主要分享前面四点。 image.png ::: hljs-center

源码结构

::: 众所周知大型项目会有巨量的代码,为了方便管理和维护,一般开发人员会根据功能模块对源代码划分为不同的目录,所以在分析大型项目时首先要知道项目中每个目录的作用是干什么的,然后再根据自己的需求去对应的目录解读对应的代码。

  1. StoneDB 源码目录结构 image.png
  2. Tianmu 引擎的源码目录结构

image.png<br>image.png <br> image.png

::: hljs-center

Tianmu 引擎的日志系统

::: <br> Tianmu 引擎的日志类型分为了三类,系统日志、调试日志、和查询引擎执行的结果日志。其中系统的异常信息、异常情况的堆栈信息 和一些计时信息都记录在系统日志里面。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。 <br> 下图为 Tianmu 引擎的日志系统结构关系图:

image.png <br>

  1. 日志系统 系统日志把日志分为了以下 7 个级别 : image.png 使用枚举类型表示各个级别

enumLogCtl_Level { 
    DISABLED = 0, FATAL = 1, ERROR = 2, WARN = 3, INFO = 4, DEBUG = 5, TRACE = 6 
};

并支持将MySQL日志级别映射到Tianmu日志级别,可以通过 设置参数 tianmu_global_debug_level 来控制日志的输出级别: image.png

日志的级别越高输出的信息就越多,当然详细的日志信息会影响系统的运行性能,需要视情况而定。 <br> Tianmu 的系统日志会统一落地到 MySQL 安装目录下/log/tianmu.log文件 <br> 日志系统核心类:


class utils:: LogCtl

<br> 2. 调试日志 调试日志落地到mysql安装目录下/log/trace.log文件。 <br> 由 tianmu_control_trace 该配置项控制,为1打开记录日志的开关,为0则关闭 <br> 调用接口对象:

system::Channel rccontrol

<br>

  1. 查询引擎执行的结果日志 <br> 查询引擎执行的结果日志落地到 StoneDB 安装目录下/log/ query.log文件。 <br> 由 tianmu_ini_controlquerylog 该配置项控制,为1打开记录日志的开关,为0则关闭 <br> 调用接口对象:

system::Channel rcquerylog

<br> image.png ::: hljs-center

堆栈跟踪

::: <br> 保存堆栈的相关信息(堆栈的函数调用和堆栈的符号信息等),方便后续调试和问题排查,目前 Tianmu 系统基于异常处理模块加上了堆栈信息的记录,如果有异常情况出现,就会把现场的堆栈信息记录下来。堆栈的调用信息会以 WARN 级别的日志信息记录在 Tianmu 的系统日志里面,日志所在的目录:StoneDB 安装目录下/log/tianmu.log文件中。 <br> 其中为了获得堆栈信息,Tianmu 这里使用了 glibc中提供的backtrace()和backtrace_symbols() 两个函数来输出和解析程序的 call stack,并使用 g++ 中的 abi::__cxa_demangle 来 demangle(将C++ ABI标识符(C++ ABI identifier)转换成C++源程序标识符(original C++ source identifier)的过程称为demangle。更简单的说,识别C++编译以后的函数名的过程,就叫demangle。) <br> 调用函数接口:


GetStackTrace();

<br> image.png ::: hljs-center

异常处理

::: <br> Tianmu支持的异常处理类型如下图: image.png 异常处理的流程图如下:

image.png 出现异常后Tianmu 系统会把异常信息,和出现异常逻辑的堆栈调用信息以WARN级别的日志信息记录在Tianmu的系统日志里面,日志所在的目录:StoneDB安装目录下/log/tianmu.log文件中。 <br> 异常处理模块核心基类:


class common:: Exception

<br> image.png

::: hljs-center

线程池

::: <br> Tianmu 的线程是基于 C++ 新特性实现的 <br> 线程池核心类:

class utils::thread_pool

其具有以下优点:

  • Tianmu 的线程池的实现是基于 C++11 标准的线程库:std::thread。可进行跨平台编译而无需修改代码。

  • 使用 std::condition_variable 和 std::mutex 进行线程的阻塞控制和唤醒,避免线程无效的循环和等待,提高程序效率。

  • 对添加线程的入口使用了函数模板与可变长参数模板,使之可添加任意的处理流程进入到线程池中。

  • 其中 Tianmu 引擎支持利用 std::thread::hardware_concurrency() 函数或者机器的 CPU 核心数,自动的对不同线程池利用不同的分配策略来设置线程池中的线程数量,可以自动精准的配置和利用机器的 CPU,避免造成CPU 资源利用不足和线程分配过多导致系统资源内耗的情况。同时用户也可根据机器的资源情况进行配置。

<br>

1.线程池类型 <br> 目前Tianmu引擎基于此线程池类定义了以下四类线程池 <br>

  • 延迟插入线程池

主要功能是将 insert buffer 中的数据加载到数据库

utils::thread_pool delay_insert_thread_pool;
  • 加载导入线程池

主要功能是把插入和导入的数据落地到磁盘

utils::thread_pool load_thread_pool;
  • 查询处理线程池

为查询过程中提供并行处理的能力

utils::thread_pool query_thread_pool;
  • delete & update 执行线程池

为 delete 和update 执行接口提供并行执行的功能

utils::thread_pool delete_or_update_thread_pool

各类线程池和其中加入的线程执行体如下图所示: image.png <br> 2.线程池初始化流程 <br> 线程池初始化的过程是在 StoneDB 系统启动的过程中进行的初始化,主要是为各类线程池初始化实例对象,设置各类线程池的类型,和线程池的大小。 <br> 下图为线程初始化过程 StoneDB 系统调用的流程:

image.png

以上是本文全部内容。 <br> 如果您对我们的源码感兴趣,欢迎到我们的 GitHub 代码仓库阅读查看,觉得不错记得点个 Star 哦~ <br> StoneDB 代码仓库:https://github.com/stoneatom/stonedb

StoneDB 社区官网:https://stonedb.io/

标签:Tianmu,log,thread,源码,线程,StoneDB,堆栈,日志
From: https://blog.51cto.com/u_15722181/6947254

相关文章

  • Android手部检测和手势识别(含训练代码+Android源码+手势识别数据集)
    Android手部检测和手势识别(含训练代码+Android源码+手势识别数据集)目录Android实时手势动作识别(含训练代码++手势识别数据集)1.前言2.手势识别的方法(1)基于多目标检测的手势识别方法(2)基于手部检测+手势分类识别方法3.手势识别数据集说明(1)HaGRID手势识别数据集(2)自定义数据集4.基于......
  • github代码外泄监控——可用来提供源码泄露检测服务,数据泄露场景,原理就是在github搜索
     Hawkeye监控github代码库,及时发现员工托管公司代码到GitHub行为并预警,降低代码泄露风险。特点优点邮箱告警通知黑名单添加爬虫任务设置缺点spider通过关键词在github进行模糊搜索,搜索结果会比较杂依赖Python3.x(Hawkeye支持Python3.xonLinuxandmacOS;2.x兼容性需自行修改测试......
  • RTSP流媒体服务器LntonNVR(源码版)平台配置录像阀值,实现边删边录的具体操作步骤
    LntonNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台,可提供丰富且灵活的视频能力,包括:设备接入、实时视频直播、录像、云存储、录像回放与检索等功能,也能支持GB28181协议进行平台级联。有很多用户咨询我们,在LntonNVR使用过程中,当开启录像时,如果磁盘的存储空间满了,......
  • 稳扎稳打,坚定前行 | 一文带你回顾 StoneDB 的 2022 年
    2022年6月29号,StoneDB正式宣布开源,自开源以来,StoneDB开源团队在用心打磨产品的同时,也在积极地拥抱开源社区,与万千数据库开发者共同成长,我们从day1就励志要做一款立足中国、面向全球的开源数据库,内核代码已经在Github上完全开源,欢迎大家前往关注:https://github.com/sto......
  • 国标GB28181国标平台LntonGBS(源码版)国标视频平台实现设备录像设置收留IP的具体操作方
    国标视频云服务LntonGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • RTSP/Onvif视频服务器LntonNVR(源码版)视频平台鉴权功能应用场景
    LntonNVR平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,还可以提供API接口,便于用户调用集成。用户也能够直接将流地址放到第三方播放器进行播放。那么,该如何限制非管理员用户的播放权限呢?考虑到用户的使......
  • 哪篇论文宣布了 HTAP 数据库的诞生? | StoneDB学术分享会#5
    本文是StoneDB学术分享会专栏的第五篇,我们来分享一下HTAP学术界上比较经典的一篇论文《ACommonDatabaseApproachforOLTPandOLAPUsinganIn-MemoryColumnDataBase》。<br>为什么说这篇论文经典呢,因为这篇论文来自国际著名厂商,号称欧洲最大的软件公司SAP(思爱普,截......
  • flask as_view源码,请求响应,cookie,session
    1CBV1cbv写法 -1写个类,继承MethodView-2在类中写跟请求方式同名的方法-3注册路由:app.add_url_rule('/home',view_func=Home.as_view('home'))#home是endpoint,就是路由别名2cbv加装饰器 -方式一: classHome(MethodView): decorators=[auth]#......
  • 直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆
    直播商城系统源码,自定义View实现方向控制控件,可拖拽中间圆 publicclassDirectionViewextendsViewimplementsView.OnTouchListener{  privateintwidth;  privateintheight;  privateinthalfWidth;  privateinthalfHeight;  privateintsmal......
  • 视频直播源码,android:textColor设置无效
    视频直播源码,android:textColor设置无效title_color.xml <?xmlversion="1.0"encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android">  <itemandroid:color="@color/txt_blue"/>......