深入理解tengine的sysguard模块

2024-05-14 15:12

本文主要是介绍深入理解tengine的sysguard模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. 引言
  • 2. 开启sysguard模块
    • 2.1 编译
  • 2.2 配置
  • 3. 源码分析
    • 3.1 配置参数分析
    • 3.2 模块的初始化
    • 3.3 ngx_http_sysguard_handler函数
  • 3.4 各项负载指标的获取
      • 3.4.1 load系统负载的获取
      • 3.4.2 cpu使用率的获取
      • 3.4.3 内存使用情况的获取
      • 3.3.5 请求平均响应时间的获取

1. 引言

  Tengine 是一款高性能的 Web 服务器,其 Sysguard 模块作为其核心功能之一,为用户提供了强大的系统监控和管理能力。通过 Sysguard 模块,用户可以实时监测服务器的运行状态、性能指标和资源利用情况,对异常压力实施熔断处理,从而有效优化系统运行和提升稳定性。本文将深入探讨 Tengine 的 Sysguard 模块,介绍其功能特点、部署配置,以及通过源码分析来深入理解其实现原理。

2. 开启sysguard模块

2.1 编译

  需要开启sysguard模块,因为tengine默认是不加载这个模块的,因此在编译的时候要将这个模块编译进去,如下:


./configure --add-module=modules/ngx_http_sysguard_module

2.2 配置

  直接拿官网文档的例子来举例:


server {sysguard on;                   # 开启sysguard模块sysguard_mode or;              # 多个负载条件匹配模式采用or还是and方式# 格式:负载类型   负载阈值     超过规定阈值后执行的跳转动作目标路径# 其中部分指令中定义的period表示性能指标采样的周期sysguard_load load=10.5 action=/loadlimit;sysguard_cpu usage=20 period=3s action=/cpulimit;sysguard_mem swapratio=20% action=/swaplimit;sysguard_mem free=100M action=/freelimit;sysguard_rt rt=0.01 period=5s action=/rtlimit;# 以下几个location定义的是熔断以后,nginx将请求跳转到这里来执行响应处理location /loadlimit {return 503;}location /swaplimit {return 503;}location /freelimit {return 503;}location /rtlimit {return 503;}location /cpulimit {return 503;}
}

  针对上面的范例总结一下,我们可以定义一个或者若干个负载条件(包括load、cpu使用率、内存使用率)采用“与”或者“或”的方式进行组合,当nginx的负载超过了设定的条件的时候,就会执行对应的跳转动作。

  具体的各个配置指令大家可以参考sysguard 模块官方文档。

3. 源码分析

3.1 配置参数分析

  首先看一下配置加载的c语言的目标结构体。

typedef struct {ngx_flag_t                    enable;                 // 是否启用本模块ngx_int_t                     load;                   // load阈值ngx_str_t                     load_action;            // locad超阈值的跳转地址ngx_int_t                     cpuusage;               // cpu使用率阈值ngx_str_t                     cpuusage_action;        // cpu使用率超阈值的跳转地址ngx_int_t                     swap;                   // swap阈值ngx_str_t                     swap_action;            // swap超阈值的跳转地址size_t                        free;                   // free内存阈值ngx_str_t                     free_action;            // free内存超阈值的跳转地址ngx_int_t                     rt;                     // 平均响应时间的阈值ngx_int_t                     rt_period;              // 平均响应时间的更新周期ngx_str_t                     rt_action;              // 超平均响应时间阈值的跳转地址time_t                        interval;               // 获取系统信息时的缓存时间time_t                        cpu_interval;           // CPU负载采样更新周期ngx_uint_t                    log_level;              // 超阈值事件的日志等级ngx_uint_t                    mode;                   // or还是and模式ngx_http_sysguard_rt_ring_t  *rt_ring;
} ngx_http_sysguard_conf_t;

  配置加载的时候会根据配置的设置填充以上结构体中对应的字段。

3.2 模块的初始化

  模块的初始化是在ngx_http_sysguard_init函数用执行的。而ngx_http_sysguard_init函数是通过下面的声明来注册到nginx的框架中的。

static ngx_http_module_t  ngx_http_sysguard_module_ctx = {NULL,                                   /* preconfiguration */ngx_http_sysguard_init,                 /* postconfiguration */NULL,                                   /* create main configuration */NULL,                                   /* init main configuration */NULL,                                   /* create server configuration */NULL,                                   /* merge server configuration */ngx_http_sysguard_create_conf,          /* create location configuration */ngx_http_sysguard_merge_conf            /* merge location configuration */
};ngx_module_t  ngx_http_sysguard_module = {NGX_MODULE_V1,&ngx_http_sysguard_module_ctx,          /* module context */ngx_http_sysguard_commands,             /* module directives */NGX_HTTP_MODULE,                        /* module type */NULL,                                   /* init master */NULL,                                   /* init module */NULL,                                   /* init process */NULL,                                   /* init thread */NULL,                                   /* exit thread */NULL,                                   /* exit process */NULL,                                   /* exit master */NGX_MODULE_V1_PADDING
};

  分析ngx_http_sysguard_init函数,我们可以知道,它在NGX_HTTP_PREACCESS_PHASE阶段和NGX_HTTP_LOG_PHASE阶段分别注册了ngx_http_sysguard_handler和ngx_http_sysguard_log_handler两个回调函数,函数定义如下:

static ngx_int_t
ngx_http_sysguard_init(ngx_conf_t *cf)
{ngx_http_handler_pt        *h;ngx_http_core_main_conf_t  *cmcf;cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);if (h == NULL) {return NGX_ERROR;}*h = ngx_http_sysguard_handler;h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);if (h == NULL) {return NGX_ERROR;}*h = ngx_http_sysguard_log_handler;return NGX_OK;
}

3.3 ngx_http_sysguard_handler函数

  该函数在NGX_HTTP_PREACCESS_PHASE阶段被调用。
  首先判断本模块是否已经执行过了并且已经被enable了,如果没有enable,则跳过本模块的后续逻辑。

    if (r->main->sysguard_set) {return NGX_DECLINED;}glcf = ngx_http_get_module_loc_conf(r, ngx_http_sysguard_module);if (!glcf->enable) {return NGX_DECLINED;}

  接着设置sysgaurd_set标记位,表示本模块已经处理过了,后续如果重新进入本函数就不需要重新处理了。

    r->main->sysguard_set = 1;

  为什么会再次进入本函数呢?譬如rewrite操作,或者发生了subrequest请求,都可能导致。

  接下去以load系统负载为例,来看程序的实现逻辑,源码如下:

  /* load */if (glcf->load != NGX_CONF_UNSET) {if (ngx_http_sysguard_cached_load_exptime < ngx_time()) {ngx_http_sysguard_update_load(r, glcf->interval);}ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,"http sysguard handler load: %1.3f %1.3f %V %V",ngx_http_sysguard_cached_load * 1.0 / 1000,glcf->load * 1.0 / 1000,&r->uri,&glcf->load_action

这篇关于深入理解tengine的sysguard模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989087

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是