当前位置: 首页 > news >正文

Grafana+Prometheus(InfluxDB)+Jmeter使用Nginx代理搭建可视化性能测试监控平台

前言
在这篇博客文章中,将分享JMeter > Prometheus(InfluxDB) > Grafana的集成,以及Nginx端口反向代理各服务的端口。

背景

在JMeter插件库中,有一些后端监听器可供Kafka、ElasticSearch和Azure使用。默认情况下,JMeter支持Graphite和InfluxDB。但是Prometheus没有后端监听器。

幸运的是,找到了这个优秀的开源项目来为Prometheus导出JMeter指标,感谢Jeff Ohrstrom。

关于集成的流程图如下:
 

JMeter, Prometheus, and Grafana Integration


流程如下:

在这里插入图片描述

如上图所示: JMeter + Prometheus(InfluxDB)插件将JMeter指标导出到Prometheus(InfluxDB)数据库. 如果想要将数据可视化,那就需要在Grafana中配置数据源。
这个插件的主要目的是将结果导出到数据库(Prometheus)。

What is Prometheus?

Prometheus是一个开源的系统监控和报警工具包,最初是在SoundCloud开发的。
中文名普罗米修斯,可想而知该工具的意义非凡,不知道普罗米修斯的自行补课去,哈哈哈。

What is InfluxDB?

InfluxDB是一个用于存储和分析时间序列数据的开源数据库。

What is Grafana?

Grafana是大多数 数据库的开源分析和监控解决方案

What is JMeter-Prometheus Plugin?

它是一个开源项目,该插件的工作是将JMeter运行的后的指标数据导出到Prometheus。

先决条件

1、Apache JMeter
2、JMeter-Prometheus Plugin
3、Prometheus
4、InfluxDB
5、Grafana

安装Docker 和 Compose

Aliyun安装docker
sudo yum install docker-ce #由于repo中默认只开启stable仓库,这里安装的是最新稳定版17.12.0
sudo yum install <FQPN> # 例如:sudo yum install docker-ce-18.03.1.ce-1.el7.centos

:注意阿里云的e  l7是E  L7,切勿看错成数字1

AWS linux安装Docker
安装最新的Docker Community Edition程序包
sudo amazon-linux-extras install docker -y

启动Dockers服务
sudo service docker start

将root添加到docker组,以便您能够执行Docker命令,而无需使用sudo,安装完成之后需要重启ssh session。

sudo usermod -a -G docker root

启动Docker

sudo systemctl start docker # 
(sudo systemctl enable docker) #开机启动 
sudo docker --version #查看Docker版本

安装compose
pip3 install docker-compose

安装JMeter-Prometheus插件

有多种方法可以安装JMeter的插件的jar包。
非常简单的方法是从GitHub上下载最新版jmeter-prometheus-plugin-0.6.0.jar文件,并将其放在<JMETER_HOME> libext中,重启Jmeter即可。
在这里下载JMeter-Prometheus插件 (GitHub)
在这里下载JMeter-Prometheus插件 (备用地址:CSDN资源)

安装JMeter-Prometheus插件

通过在JMeter中创建一个简单的脚本来验证安装,然后右击Thread Group > Add > Listener > Prometheus Listener,如下图:

Prometheus Listener

或者右键点击Thread Group > Add > Config Element > Prometheus Metrics

Prometheus Metrics

安装Nginx
###【手动安装】
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  (RHEL)
sudo yum install -y epel-release   (CentOS) 添加Nginx存储库
sudo yum update -y
sudo yum install nginx -y    #安装Nginx
sudo nginx -v   #查看Nginx版本
sudo systemctl start nginx  (sudo service nginx start)   #启动
sudo systemctl enable nginx     #系统启动开启 
sudo systemctl status nginx     #查看状态nginx  #启动Nginx
nginx -t #测试配置是否正确
nginx -s reload #重启Nginx
nginx -s stop  #Nginx停止服务

nginx安装成功
http://[你的IP地址] #登录到主页查看是否显示正确

在这里插入图片描述

配置Nginx.conf

sudo vi /etc/nginx/nginx.conf #编辑nginx.conf文件

cat /etc/nginx/nginx.conf #查看内容
/usr/share/nginx/html #查看默认主页显示内容

在/etc/nginx目录下配置nginx.conf文件,如果没有,直接touch生成一个新文件。
下面是nginx.conf片段代码,参照更新你的文件即可。

        location / {}location /prometheus/ {proxy_pass http://localhost:9090/prometheus/;}location /grafana/ {proxy_pass http://localhost:3000/;}location /influxdb/ {proxy_pass http://localhost:8086/;}

做完以上配置需要重启之后才生效。

nginx -s reload #重启Nginx
docker-compose安装Grafana 、Prometheus(InfluxDB)

文件结构如下:
 

在这里插入图片描述


在这里的docker-compose文件里面包含了Prometheus和InfluxDB,是为了学习和测试两者的区别,在实际使用时选你需要的安装更改下面的yaml文件内容。

docker-compose.yml如下:

version: '3.1'services:nginx:restart: alwaysimage: nginx:latestcontainer_name: nginxports:- "8080:80"- "80:80"- "443:443"volumes:- ~/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro- ./nginx/default.conf:/tmp/default.template- ./opt/dist-generator:/opt/dist-generatorcommand:- '--config.file=/etc/prometheus/prometheus.yml'depends_on:- influxdb- prometheus- grafanainfluxdb:image: influxdb:latestcontainer_name: influxdbports:- "8083:8083"- "8086:8086"- "8090:8090"environment:- INFLUXDB_DB=db0- INFLUXDB_ADMIN_USER=${INFLUXDB_USERNAME}- INFLUXDB_ADMIN_PASSWORD=${INFLUXDB_PASSWORD}volumes:- influxdb-storage:/var/lib/influxdbprometheus:image: prom/prometheuscontainer_name: prometheushostname: prometheusrestart: alwaysvolumes:- ~/test-Grafana_influxDB_Prom/prometheus.yml:/etc/prometheus/prometheus.ymlcommand:- '--config.file=/etc/prometheus/prometheus.yml'- '--web.external-url=http://localhost/prometheus'ports:- "9090:9090"environment:- PROMETHEUS_ADMIN_USER=${PROMETHEUS_USERNAME}- PROMETHEUS_ADMIN_PASSWORD=${PROMETHEUS_PASSWORD}grafana:image: grafana/grafana:latestcontainer_name: grafanaports:- "3000:3000"environment:- GF_SECURITY_ADMIN_USER=${GRAFANA_USERNAME}- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}depends_on:- influxdbuser: "0"volumes:- grafana-storage:/var/lib/grafana- ./grafana-provisioning/:/etc/grafana/provisioning
volumes:influxdb-storage:grafana-storage:
上述的docker-compose.yml需要注意的点是prometheus部分的command,意思是添加子路径,与下文中那个的Grafana添加子路径同理,否则即便设置了Nginx也同样无法访问主页,会报异常。

.env内容如下:

INFLUXDB_USERNAME=admin
INFLUXDB_PASSWORD=adminGRAFANA_USERNAME=admin
GRAFANA_PASSWORD=adminPROMETHEUS_USERNAME=admin
PROMETHEUS_PASSWORD=admin

运行compose命令并安装

docker-compose -f docker-compose.yml up -d

在这里插入图片描述

配置Grafana

进入/etc/grafana/grafana.ini 并编辑 grafana.ini设置子路径
 

在这里插入图片描述


更改如下:

[server]
domain = example.com
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true

做以上配置之后才能够使用http://localhost:3000/grafana来访问主页。

配置Prometheus

注意上文中提到compose ymal文件中的prometheus部分的Command即可。

打开Prometheus

现在启动prometheus对应的容器,打开http://localhost:9090/graph (Nginx:http://localhost/promethers )如下所示:

Prometheus UI

运行 JMeter 测试 (Prometheus)

启动Prometheus之后,该验证JMeter测试计划了。
用几个线程配置你的线程组,并点击无限循环运行。

运行JMeter之后打开链接:http://localhost:9270/metrics 将看到信息显示如下。
如果你看到下面的指标数据,说明一切运行正常。

Prometheus Metrics

在Prometheus中查看JMeter指标
http://localhost/prometheus (如果使用了Nginx端口代理)
http://localhost:9090 (默认访问链接,没有使用Nginx代理)
如上述指标截图显示,我们将看到如何在Prometheus中查看指标。只需复制jvm_classes_loaded并将其粘贴到查询文本框中,然后按Enter,就可以看到如下图的值了:

Prometheus Query

单击Graph选项卡查看可视化结果。也可以自定义想要的可视化方式。下图显示了每个事务的95%响应时间。

Prometheus Graph

Grafana + Prometheus + Jmeter配置

如果你不想集成到Grafana,那可以到此为止了。
但是Grafana比Prometheus可视化特征更强大。
接下来配置Grafana从Prometheus获取指标数据,并创建优雅的可视化视图。

通过http://localhost:3000启动Grafana,首次登录,需要更改密码。

http://localhost/grafana (如果设置了Nginx端口代理)
将鼠标悬停在 设置 图标上,然后单击如下所示的数据源-Data Sources。

Grafana Data Sources


单击Add data source,如下所示:

Add Data Source


填写如下所示的详细信息并点击Save & Test:
URL处填写Prometheus的地址。

Prometheus Data Source

验证Grafana中的Prometheus数据来源
将鼠标悬停在“探索--Explore”图标上,然后单击它。

Explore  Prometheus Data Source

输入jmeter_threads{}并点击进入查询文本框。如果配置正确,将看到图形。
请注意,你的JMeter测试仍然在运行,如果停止,需要更改右上角的时间选择器中的值。

Prometheus Query in Grafana

创建Grafana仪表盘并配置 (Prometheus)

将鼠标悬停在“+”图标上,然后单击Dashboard

Creating Grafana Dashboard

单击“添加查询--Add Query”按钮

Add Query


将查询下拉改为Prometheus,如下所示

Prometheus Query

输入查询 jmeter_summary{quantile="0.95"},然后回车。
你也可以根据需要自定义图形。
 

Prometheus Query and Graph in Grafana


这是个简单的仪表盘 例子。

Sample Grafana Dashboard

Grafana + InfluxDB + Jmeter配置:

新建DB (InfluxDB)

进入容器:docker exec -it 容器ID /bin/bash
创建数据库jmeterDB: create database jmeterDB
 

创建数据库


influxdb容器运行成功后,通过Web浏览器访问http://docker-host-ip:8083访问influxdb后台管理,并登录后台管理系统(默认用户名:root, 默认密码:root)

连接influxdb一般用InfluxDB studio

创建Grafana仪表盘并配置 (InfluxDB)

接下来就是使用http://IPAddress:3000去登陆grafana并进行配置了

http://ip/grafana (如果使用Nginx代理)

初始密码为:admin/admin,也可在上述的.env文件中进行设置。
首次登陆grafana会要求设置新密码

在这里插入图片描述

登陆到grafana主页之后,创建新的Data Source:
 

在这里插入图片描述


配置Database,选择InfluxDB:
 

InfluxDB


填入你的IP地址http://*.*.*.*:8086 (http://*.*.*.*/influxdb #如果使用了Nginx端口代理)
 

在这里插入图片描述


输入InfluxDB信息,如果没做更改的话user和pwd都是默认的root, 为了安全自行修改。
 

在这里插入图片描述

在这里插入图片描述

Grafana Dashboards导入InfluxDB Jmeter模板

到Dashboards去下载: https://grafana.com/grafana/d...

在这里插入图片描述

或者直接访问:https://grafana.com/grafana/d...
复制该模板的ID 或者URL
 

在这里插入图片描述


到我们登陆的Grafana主页去粘贴即可,如下图
 

在这里插入图片描述


然后可以进行命名,填入之前建好的DataSource 名字,设置发送时间,保存即可。
 

在这里插入图片描述


然后转到刚刚建好的主页,如下图,右上角可以设置:
 

在这里插入图片描述


设置界面,可更具你的需要进行设置,比如下面两个点分别是设置时间显示和刷新频率。

在这里插入图片描述

接下来就准备运行Jmeter ,生成数据,看看效果。
挑选了一个URL,对其进行简单的运行并返回数据。
https://mp.weixin.qq.com/s/pz...
 

Jmeter脚本


 

Jmeter脚本


 

Jmeter脚本


其结果如下:

在这里插入图片描述

摘自作者之一说明:

插件的另一点是,它不需要向JMeter控制器发送指标来聚合结果,因为这是由Prometheus本身完成的。
总结:

现在,您已经成功地将JMeter与Prometheus和Grafana集成在一起了。如果喜欢Prometheus的可视化,不需要配置Grafana。
但是Grafana具有比Prometheus更强大的可视化功能。
你需要在运行JMeter的任何地方安装JMeter-Prometheus插件,并将数据流简化到集中的Prometheus数据库中,这将帮助你监视运行时指标。

你需要在Grafana中仔细地编写查询,否则最终会看到错误的指标数据。

附录:

另外再介绍一下使用Docker逐步安装Grafana/ Prometheus /InfluxDB

Docker 安装 Prometheus

安装Prometheus非常简单。下载适用于您的操作系统的Prometheus并解压缩内容并准备就绪。
稍后,我们将启动Prometheus。
搜索Prometheus:docker search Prometheus
拉取Prometheus镜像:docker pull prom/prometheus
查看镜像Images: docker images
运行Prometheus容器:docker run --name my_PrometheusName -p 9090:9090 Prometheus
查看运行的容器Container:docker ps -a
进入容器:docker exec -it 容器ID /bin/bash
创建数据库jmeterDB: create database jmeterDB

Docker安装 InfluxDB

搜索influx:docker search influx
拉取influxdb镜像:docker pull influxdb
查看镜像Images: docker images
运行influxdb容器:docker run --name my_influxdbName -p 8086:8086 influxdb
查看运行的容器Container:docker ps -a

Docker安装 Grafana

搜索grafana:docker search grafana
拉取grafana镜像:docker pull grafana/grafana
运行容器:docker run --name my_grafana -p 3000:3000 grafana/grafana
然后查看状态
docker ps -a 查看当前运行的实例
退出来再次启动即可
docker start ContainerID

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

Grafana+Prometheus(InfluxDB)+Jmeter使用Nginx代理搭建可视化性能测试监控平台

前言 在这篇博客文章中&#xff0c;将分享JMeter > Prometheus(InfluxDB) > Grafana的集成&#xff0c;以及Nginx端口反向代理各服务的端口。 背景 在JMeter插件库中&#xff0c;有一些后端监听器可供Kafka、ElasticSearch和Azure使用。默认情况下&#xff0c;JMeter支…...

web学习笔记(六十六)项目总结

目录 1. Suspense标签 2.发布订阅者模式 3.pinia的使用 4.在请求过来的数据添数据 5.设置token和取token 6. 实现触底加载 7.导航守卫判断登录状态。 1. Suspense标签 Suspense主要用于用于处理异步组件加载和数据获取。&#xff0c;使用这个标签可以允许你在组件等待数…...

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇域控系统提权NetLogonADCSPACKDC永恒之蓝CVE漏洞

红队内网攻防渗透 1. 内网横向移动1.1 横向移动-域控提权-CVE-2020-1472 NetLogon1.2 横向移动-域控提权-CVE-2021-422871.3 横向移动-域控提权-CVE-2022-269231.4 横向移动-系统漏洞-CVE-2017-01461.5 横向移动-域控提权-CVE-2014-63241. 内网横向移动 1、横向移动-域控提权-…...

VMware Workstation安装Windows Server2019系统详细操作步骤

虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 实现操作 创建虚拟机 创建新的虚拟机 自定义->下一步 默认即可&#xff0c;下一步 稍后安装操作系统->下一步 按照图下所示选择好系统->下一步 设置好虚拟机名称和位置->下一步 默认即可&#xff0…...

HTML5【新特性总结】

HTML5【新特性总结】 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。…...

【面试题】面试官:判断图是否有环?_数据结构复试问题 有向图是否有环

type: NODE;name: string;[x: string]: any; }; [x: string]: any;}; export type Data Node | Edge; 复制代码 * 测试数据如下const data: Data[] [ { id: ‘1’, data: { type: ‘NODE’, name: ‘节点1’ } }, { id: ‘2’, data: { type: ‘NODE’, name: ‘节点2’ } },…...

办理北京公司注册地址异常变更要求和流程

在北京注册公司时选择注册地址是非常重要的一环&#xff0c;注册地址不仅体现在营业执照上&#xff0c;在网上也有公示信息&#xff0c;一般选用的是商用地址和商住两用地址&#xff0c;在公司经营过程中&#xff0c;因为经营需要变更注册地址&#xff0c;也要依法变更&#xf…...

当你在浏览器输入一个地址

你在浏览器中输出了一个地址&#xff0c;回车后&#xff0c;一直到显示页面&#xff0c;中间经历了哪些过程 &#xff1f; 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL&#xff08;例如 http://example.com&#xff09;并按下回车键。 2. DNS 解析 浏览…...

JSP基础知识概述

目录 JSP一、什么是JSP1.1 概念1.2 创建JSP1.3 JSP编写Java代码1.4 JSP实现原理 二、JSP与HTML集成2.1 普通脚本2.2 声明脚本2.3 输出脚本2.4 JSP指令2.5 动作标签 三、内置对象3.1 四大域对象 JSP 一、什么是JSP 1.1 概念 简化的Servlet设计&#xff0c;在HTMl标签中嵌套Jav…...

国产编程—— 仓颉

应用 仓颉编程语言是一款由华为主导设计和实现的面向全场景智能的编程语言&#xff0c;主要应用于以下领域&#xff1a; 中文字符编码和文本数据处理&#xff1a;仓颉编程语言充分利用汉字的结构特点来设计编码&#xff0c;为开发者提供了一种高效的方式来编码、存储和处理中…...

0X JavaSE-并发编程(锁)

1...

云计算【第一阶段(18)】磁盘管理与文件系统 分区格式挂载(一)

目录 一、磁盘基础 二、磁盘结构 2.1、机械硬盘 2.2、固态硬盘 2.3、扩展移动硬盘 2.4、机械磁盘的一些计算&#xff08;了解&#xff09; 2.5、磁盘接口类型 二、Linux 中使用的文件系统类型 2.1、磁盘分区的表示 2.1.1、主引导记录(MBR) 2.1.2、Linux中将硬盘、分…...

Flask-cache

Flask-cache 目录 Flask-cache基本使用配置可用参数SimpleCacheNullCacheFileSystemCacheRedisCacheRedisSentinelCacheRedisClusterCacheMemcachedCacheSASLMemcachedCacheUWSGICache Flask-Cache是一个强大的缓存库&#xff0c;为基于Flask的应用提供了简单易用的API和多种缓…...

【面试题】面试小技巧:如果有人问你 xxx 技术是什么?_面试问你对什么技术特别了解

前端工程越来越大&#xff0c;前面几种方案不能很好的支持单元测试。 在这样的背景下&#xff0c;React 诞生了。React 带来了新的思维模式&#xff0c;UI fn(props)&#xff0c;React 中一个组件就是一个函数或者一个类&#xff0c;一个函数或者一个类就是一个基础单位&…...

简单分享Python语言(发现其实并不难)

一. Python基础 Python是一种解释型语言&#xff0c;这意味着开发者可以在代码被编写后立即执行它们&#xff0c;而无需编译。Python的基本语法简单明了&#xff0c;以下是一些基础知识点&#xff1a; 变量和数据类型&#xff1a;Python支持多种数据类型&#xff0c;包括整型&…...

基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建

开源库&#xff1a;VTK9.3.0 开发工具&#xff1a;Visual Studio2017 开发语言&#xff1a;C 实现过程&#xff1a; void initImageActor(double* Matrix, double* center, vtkSmartPointer<vtkImageCast> pImageCast,vtkSmartPointer<vtkImageReslice> imageRe…...

【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测

文章目录 一、文章概览&#xff08;一&#xff09;问题来源&#xff08;二&#xff09;文章的主要工作&#xff08;三&#xff09;相关研究 二、动机&#xff1a;Logits 中缺失的信息&#xff08;一&#xff09;logits&#xff08;三&#xff09;基于零空间的 OOD 评分&#xf…...

【面试题】前端 移动端自适应?_前端移动端适配面试题

设备像素比 设备像素比 (DevicePixelRatio) 指的是设备物理像素和逻辑像素的比例 。比如 iPhone6 的 DPR 是2。 设备像素比 物理像素 / 逻辑像素。可通过 window.devicePixelRatio 获取&#xff0c;CSS 媒体查询代码如下 media (-webkit-min-device-pixel-ratio: 3), (min-…...

在Maven工程中手动配置并测试SpringBoot(巨详)

本篇博客承继自博客&#xff1a; 在IDEA 2024.1.3 (Community Edition)中创建Maven项目_idea2024.1.3如何创建maven项目-CSDN博客 配置POM文件 打开工程中的pom.xml文件&#xff0c;先向其中写入 <parent><groupId>org.springframework.boot</groupId><…...

c# 去掉字符串首尾的 特殊符号

如果首尾的 - 数量不确定,可以使用以下方法来去掉字符串两端的 - 字符: 使用正则表达式: using System.Text.RegularExpressions;string input "---Hello, World!---"; string trimmed Regex.Replace(input, "^-*|-*$", ""); // trimmed 为 …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...