obdiag如何实现一键采集20+故障场景的诊断信息——《OceanBase诊断系列》之九
作者简介:靖顺,OcenaBase 开发工程师,专注于数据库诊断与调优
1. 前言
在2024年初,我与一线运维人员交流时,他们纷纷提及在运维过程中遭遇的难题——OceanBase出现问题时,排查工作不容易,有时需要依赖原厂的支持人员。然而,线上交流效率不高,故障排查的时间又尤为宝贵,他们反馈说,花费在信息采集上的时间过多,这无疑影响了服务的SLA。因此,我向他们推荐了obdiag这个工具,并建议他们使用一行命令进行信息采集。几位支持人员给出了反馈,他们认为目前obdiag的诊断信息采集虽然功能全面,但各项采集任务是独立的,如采集日志、主机信息、SQL信息等,这对于单个问题的排查来说仍显繁琐。他们期望能针对常见的故障场景提供套餐式的一键采集功能,以更高效地完成信息采集工作。
本着客户第一的原则。这个需求必须高效优先去做。就有了2024年1月31号发布的obdiag 1.6版本,支持场景化的一键诊断信息采集。
2. obdiag 场景化信息采集使用
2.1 支持的场景列表
执行如下命令可查看支持的场景
obdiag gather scene list
结果如下:
#obdiag gather scene list[Other Problem Gather Scenes]:
---------------------------------------------------------------------------------------
command info_en info_cn
---------------------------------------------------------------------------------------
obdiag gather scene run --scene=other.application_error [application error] [应用报错问题]
---------------------------------------------------------------------------------------[Obproxy Problem Gather Scenes]:
----------------------------------------------------------------------------------
command info_en info_cn
----------------------------------------------------------------------------------
obdiag gather scene run --scene=obproxy.restart [obproxy restart] [obproxy无故重启]
----------------------------------------------------------------------------------[Observer Problem Gather Scenes]:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
command info_en info_cn
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
obdiag gather scene run --scene=observer.backup [backup problem] [数据备份问题]
obdiag gather scene run --scene=observer.backup_clean [backup clean] [备份清理问题]
obdiag gather scene run --scene=observer.clog_disk_full [clog disk full] [clog盘满]
obdiag gather scene run --scene=observer.cluster_down [cluster down] [集群无法连接]
obdiag gather scene run --scene=observer.compaction [compaction] [合并问题]
obdiag gather scene run --scene=observer.cpu_high [High CPU] [CPU高]
obdiag gather scene run --scene=observer.delay_of_primary_and_backup [delay of primary and backup] [主备库延迟]
obdiag gather scene run --scene=observer.io [io problem] [io问题]
obdiag gather scene run --scene=observer.log_archive [log archive] [日志归档问题]
obdiag gather scene run --scene=observer.long_transaction [long transaction] [长事务]
obdiag gather scene run --scene=observer.memory [memory problem] [内存问题]
obdiag gather scene run --scene=observer.perf_sql --env "{db_connect='-hxx -Pxx -uxx -pxx -Dxx', trace_id='xx'}" [SQL performance problem] [SQL性能问题]
obdiag gather scene run --scene=observer.recovery [recovery] [数据恢复问题]
obdiag gather scene run --scene=observer.restart [restart] [observer无故重启]
obdiag gather scene run --scene=observer.rootservice_switch [rootservice switch] [有主改选或者无主选举的切主]
obdiag gather scene run --scene=observer.sql_err --env "{db_connect='-hxx -Pxx -uxx -pxx -Dxx', trace_id='xx'}" [SQL execution error] [SQL 执行出错]
obdiag gather scene run --scene=observer.suspend_transaction [suspend transaction] [悬挂事务]
obdiag gather scene run --scene=observer.unit_data_imbalance [unit data imbalance] [unit迁移/缩小 副本不均衡问题]
obdiag gather scene run --scene=observer.unknown [unknown problem] [未能明确问题的场景]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.2 使用说明
运行如下命令即可一键采集某个场景下所有的故障信息
obdiag gather scene run --scene={SceneName}
--scene={SceneName}SceneName 是对需要执行收集的场景Example1:
obdiag gather scene run --scene=observer.unknown
选项说明如下:
| 选项名 | 是否必选 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|---|
| --scene | 是 | string | 默认为空 | 场景名,可以通过obdiag gather scene list 查看当前版本支持哪些场景 |
| --from | 否 | string | 默认为空 | 日志收集的开始时间,格式为: yyyy-mm-dd hh:mm:ss,不需要加引号,例如 1970-01-01 12:00:00。 |
| --to | 否 | string | 默认为空 | 日志收集的结束时间,格式为: yyyy-mm-dd hh:mm:ss,不需要加引号,例如 1970-01-01 13:00:00。 |
| --since | 否 | string | 默认为空 | 日志收集最近的某段时间,格式为: \<n> <m\|h\|d>,其中,n 表示待输入的时间数字,m 表示分钟,h 表示小时,d 表示天,例如 30m表示收集最近 30 分钟的日志。 |
| --env | 否 | string | 默认为空 | 部分场景需要额外的参数才能支持,统一放到了--env这个参数里边 |
| --store_dir | 否 | string | 默认为命令执行的当前路径 | 存储结果的本地路径。 |
| -c | 否 | string | ~/.obdiag/config.yml | 配置文件路径 |
例子:
应用报错问题
obdiag gather scene run --scene=other.application_errorobproxy无故重启
obdiag gather scene run --scene=obproxy.restart数据备份问题
obdiag gather scene run --scene=observer.backup备份清理问题
obdiag gather scene run --scene=observer.backup_cleanclog盘满
obdiag gather scene run --scene=observer.clog_disk_full 合并问题
obdiag gather scene run --scene=observer.compaction CPU高
obdiag gather scene run --scene=observer.cpu_high主备库延迟
obdiag gather scene run --scene=observer.delay_of_primary_and_backup 日志归档问题
obdiag gather scene run --scene=observer.log_archive长事务
obdiag gather scene run --scene=observer.long_transaction 内存问题
obdiag gather scene run --scene=observer.memorySQL性能问题, 此处env中的trace_id对应gv$ob_sql_audit的trace_id
obdiag gather scene run --scene=observer.perf_sql --env "{db_connect='-hxx -Pxx -uxx -pxx -Dxx', trace_id='xx'}" 数据恢复问题
obdiag gather scene run --scene=observer.recovery observer无故重启
obdiag gather scene run --scene=observer.restart 有主改选或者无主选举的切主
obdiag gather scene run --scene=observer.rootservice_switch SQL 执行出错, 此处env中的trace_id对应gv$ob_sql_audit的trace_id
obdiag gather scene run --scene=observer.sql_err --env "{db_connect='-hxx -Pxx -uxx -pxx -Dxx', trace_id='xx'}" 悬挂事务
obdiag gather scene run --scene=observer.suspend_transaction unit迁移/缩小 副本不均衡问题
obdiag gather scene run --scene=observer.unit_data_imbalance 未能明确问题的场景
obdiag gather scene run --scene=observer.unknownio问题
obdiag gather scene run --scene=observer.io
3. 自定义添加场景
场景化信息采集有两种方式:
- yaml编排:通过yaml的方式进行采集项的编排,添加后执行器会按照编排顺序依次执行,采集所需要的信息。(适用于简单场景,普通用户都可添加)
- hardcode方式:通过硬编码(写python脚本)的方式进行采集,流程自主控制,执行器执行的时候会自动跳转到hardcode模式进行采集。(需要下载obdiag源代码,新增后编译使用,适用于开发者)
3.1 yaml 编排添加场景
在用户目录下增加~/.obdiag/gather/tasks场景即可,注意:一个yaml对应一个场景, 如下:
.
├── obproxy
│ └── restart.yaml
├── observer
│ ├── backup_clean.yaml
│ ├── backup.yaml
│ ├── clog_disk_full.yaml
│ ├── cluster_down.yaml
│ ├── compaction.yaml
│ ├── delay_of_primary_and_backup.yaml
│ ├── io.yaml
│ ├── log_archive.yaml
│ ├── long_transaction.yaml
│ ├── memory.yaml
│ ├── recovery.yaml
│ ├── restart.yaml
│ ├── rootservice_switch.yaml
│ ├── suspend_transaction.yaml
│ ├── unit_data_imbalance.yaml
│ └── unknown.yaml
└── other└── application_error.yaml
可在observer增加一个~/.obdiag/gather/tasks/observer/test.yaml的场景
具体编写详情参见官网文档链接。
例子:
info_en: "[io problem]"
info_cn: "[io问题]"
command: obdiag gather scene run --scene=observer.io
task:- version: "[2.0.0.0, 4.0.0.0]"steps:- type: sqlsql: "show variables like 'version_comment';"global: true- type: sqlsql: "SELECT * FROM oceanbase.v$ob_cluster"global: true- type: sqlsql: "SELECT * FROM oceanbase.__all_zone WHERE name='idc';"global: true- type: sqlsql: "select svr_ip,zone,with_rootserver,status,block_migrate_in_time,start_service_time,stop_time,build_version from oceanbase.__all_server order by zone;"global: true- type: sqlsql: "SELECT zone, concat(svr_ip, ':', svr_port) observer, cpu_capacity, cpu_total, cpu_assigned, cpu_assigned_percent, mem_capacity, mem_total, mem_assigned, mem_assigned_percent, unit_Num, round(`load`, 2) `load`, round(cpu_weight, 2) cpu_weight, round(memory_weight, 2) mem_weight, leader_count FROM oceanbase.__all_virtual_server_stat ORDER BY zone,svr_ip;"global: true- type: sqlsql: "select tenant_id,tenant_name,primary_zone,compatibility_mode from oceanbase.__all_tenant;"global: true- type: sqlsql: "show parameters like '%syslog_level%';"global: true- type: sqlsql: "show parameters like '%syslog_io_bandwidth_limit%';"global: true- type: sqlsql: "select count(*),tenant_id,zone_list,unit_count from oceanbase.__all_resource_pool group by tenant_id,zone_list,unit_count;"global: true- type: sshssh: "df -h"global: false- type: sshssh: "cat /proc/sys/fs/aio-nr"global: false- type: sshssh: "cat /proc/sys/fs/aio-max-nr"global: false- type: logglobal: falsegrep: "IO"- type: sysstatglobal: falsesysstat: ""- version: "[4.0.0.0, *]"steps:- type: sqlsql: "show variables like 'version_comment';"global: true- type: sqlsql: "SELECT * FROM oceanbase.DBA_OB_ZONES;"global: true- type: sqlsql: "SELECT * FROM oceanbase.DBA_OB_SERVERS;"global: true- type: sqlsql: "SELECT * FROM oceanbase.GV$OB_SERVERS;"global: true- type: sqlsql: "SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;"global: true- type: sqlsql: "SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;"global: true- type: sqlsql: "SELECT * FROM oceanbase.DBA_OB_TENANTS;"global: true- type: sqlsql: "SELECT c.TENANT_ID, e.TENANT_NAME, concat(c.NAME, ': ', d.NAME) `pool:conf`,concat(c.UNIT_COUNT, ' unit: ', d.min_cpu, 'C/', ROUND(d.MEMORY_SIZE/1024/1024/1024,0), 'G') unit_info FROM oceanbase.DBA_OB_RESOURCE_POOLS c, oceanbase.DBA_OB_UNIT_CONFIGS d, oceanbase.DBA_OB_TENANTS e WHERE c.UNIT_CONFIG_ID=d.UNIT_CONFIG_ID AND c.TENANT_ID=e.TENANT_ID AND c.TENANT_ID>1000 ORDER BY c.TENANT_ID;"global: true- type: sqlsql: "SELECT a.TENANT_NAME,a.TENANT_ID,b.SVR_IP FROM oceanbase.DBA_OB_TENANTS a, oceanbase.GV$OB_UNITS b WHERE a.TENANT_ID=b.TENANT_ID;"global: true- type: sqlsql: "show parameters like '%syslog_level%';"global: true- type: sqlsql: "show parameters like '%syslog_io_bandwidth_limit%';"global: true- type: sqlsql: "select * from __all_virtual_io_quota limit 20"global: true- type: sshssh: "df -h"global: false- type: sshssh: "cat /proc/sys/fs/aio-nr"global: false- type: sshssh: "cat /proc/sys/fs/aio-max-nr"global: false- type: logglobal: falsegrep: "IO"- type: sysstatglobal: falsesysstat: ""
3.2 硬编码添加场景
源代码下载: GitHub - oceanbase/oceanbase-diagnostic-tool: OceanBase Diagnostic Tool is designed to help OceanBase users quickly gather necessary information and analyze the cause of the problem.
开发者在该目录下增加{project_dir}/handler/gather/scene场景, 建议一个场景一个.py文件。
│ ├── gather/ 一键收集功能
│ │ ├── gather_awr.py awr报告收集代码
│ │ ├── gather_log.py 日志收集代码
│ │ ├── gather_obadmin.py 解析clog/slog的代码
│ │ ├── gather_obproxy_log.py 收集obproxy代码
│ │ ├── gather_obstack2.py 收集堆栈信息的代码
│ │ ├── gather_perf.py 收集火焰图的代码
│ │ ├── gather_plan_monitor.py 收集并行SQL的代码
│ │ ├── gather_scenes.py 场景化收集的入口代码
│ │ ├── gather_sysstat.py 收集主机信息的代码
│ │ ├── scenes/ 场景化信息采集的处理代码
│ │ │ ├── base.py
│ │ │ ├── cpu_high.py cpu高场景
│ │ │ ├── list.py 场景列表展示的代码
│ │ │ ├── register.py 硬编码场景注册代码
│ │ │ └── sql_problem.py sql问题采集的代码
│ │ ├── step/ 场景化采集的执行器
│ │ │ ├── base.py
│ │ │ ├── sql.py sql执行器
│ │ │ └── ssh.py ssh执行器
│ │ └── tasks/ 收集场景的yaml文件
3.2.1 模版
#!/usr/bin/env python
# -*- coding: UTF-8 -*
# Copyright (c) 2022 OceanBase
# OceanBase Diagnostic Tool is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
# http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details."""
@file: test.py
@desc:
"""class TestScene(object):def __init__(self, nodes, cluster, report_path, task_variable_dict=None, args=None, env={}):if task_variable_dict is None:self.task_variable_dict = {}else:self.task_variable_dict = task_variable_dictself.nodes = nodesself.cluster = clusterself.report_path = report_pathself.args = argsself.env = envself.is_ssh = Truedef execute(self): # 执行函数passdef xxx(self):pass
3.2.2 例子
#!/usr/bin/env python
# -*- coding: UTF-8 -*
# Copyright (c) 2022 OceanBase
# OceanBase Diagnostic Tool is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
# http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details."""
@file: test.py
@desc:
"""
import os
from utils.shell_utils import SshHelper
from common.logger import logger
from handler.gather.gather_obstack2 import GatherObstack2Handler
from handler.gather.gather_perf import GatherPerfHandlerclass TestScene(object):def __init__(self, nodes, cluster, report_path, task_variable_dict=None, args=None, env={}):if task_variable_dict is None:self.task_variable_dict = {}else:self.task_variable_dict = task_variable_dictself.nodes = nodesself.cluster = clusterself.report_path = report_pathself.args = argsself.env = envself.is_ssh = Truedef execute(self): # 执行函数self.__gather_obstack() # 例self.__gather_perf()self.__gather_cmd_info()def __gather_obstack(self):logger.info("gather obstack start")obstack = GatherObstack2Handler(nodes=self.nodes, gather_pack_dir=self.report_path, is_scene=True)obstack.handle(self.args)logger.info("gather obstack end")def __gather_perf(self):logger.info("gather perf start")perf = GatherPerfHandler(nodes=self.nodes, gather_pack_dir=self.report_path, is_scene=True)self.args = ParserAction.add_attribute_to_namespace(self.args, 'scope', "all")perf.handle(self.args)logger.info("gather perf end")
4. 附录
- obdiag 官方文档: OceanBase分布式数据库-海量数据 笔笔算数
- obdiag github地址: GitHub - oceanbase/oceanbase-diagnostic-tool: OceanBase Diagnostic Tool is designed to help OceanBase users quickly gather necessary information and analyze the cause of the problem.
| 第一篇 | 如何修炼成“神医”——《OceanBase诊断系列》之一 |
| 第二篇 | 走进SQL审计视图——《OceanBase诊断系列》之二 |
| 第三篇 | 快速收集诊断信息,敏捷诊断工具obdiag应用实践——《OceanBase诊断系列》之三 |
| 第四篇 | 如何快速分析OB集群日志,敏捷诊断工具obdiag分析能力实践——《OceanBase诊断系列》之四 |
| 第五篇 | 防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五 |
| 第六篇 | obdiag帮你读懂全链路诊断日志——《OceanBase诊断系列》之六 |
| 第七篇 | 如何排查合并问题——《OceanBase诊断系列》之七 |
| 第八篇 | 轻松掌握锁冲突问题的排查方法——《OceanBase诊断系列》之八 |
| 第九篇 | obdiag如何实现一键采集20+故障场景的诊断信息——《OceanBase诊断系列》之九 |
相关文章:
obdiag如何实现一键采集20+故障场景的诊断信息——《OceanBase诊断系列》之九
作者简介:靖顺,OcenaBase 开发工程师,专注于数据库诊断与调优 1. 前言 在2024年初,我与一线运维人员交流时,他们纷纷提及在运维过程中遭遇的难题——OceanBase出现问题时,排查工作不容易,有时需…...
Cookie和Session的获取方法
1、Cookie的简单获取方法(可以获取到所有的cookie) (1)在参数里还有HttpServletResponse response这些,这些都是内置对象需要就拿不需要就删掉就可以,在这里我们用到的是HttpServletRequest request &…...
旅游市场游客满意度调查报告
民安智库开展游客满意度调查主要通过问卷调查的方式进行,在设计问卷时,应确保问题覆盖游客在某省旅游过程中可能遇到的各个方面,包括交通、住宿、餐饮、旅游景点、导游服务等。此外,还可以设置一些开放性问题,让游客提…...
为什么选用python开发web?
目前,不少公司在用python做web开发,前司用pythonflask做内容审核的后端。 java和php在web开发领域积累较久,有丰富的web开发生态组件可以使用,性能稳定,扩展性强,这个是事实,从这方面来讲&…...
C# Chart曲线控件专题
1.控件基本设置 chart1.ChartAreas[0].AxisY.IsStartedFromZero false; //设置Y轴自适应chart1.Series["瞬时值"].BorderWidth 2; // 设置曲线宽度为2个像素,注意[]中写入的Series的Namechart1.Series["瞬时值"].Color Color.Red; // 设置曲…...
Spring:StopWatch
文章目录 一、介绍二、使用1、导入相关的Spring包2、创建StopWatch实例和开始计时3、停止计时4、获取时间5、获取任务详情6、分阶段计时7、获取总耗时与各阶段耗时 三、案例 一、介绍 在Spring框架中,StopWatch类通常用于测量代码块的执行时间。您可以使用StopWatc…...
考研C语言复习进阶(5)
目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 编辑 编辑 4.1 对比一组函数: 编辑 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind…...
[uni-app] 小程序码转为二维码, 小程序解析此码获取数据
小程序码缩小后太细, 不好扫, 还是改成二维码扫 记录解析该二维码 onLoad(e) {if (e.shareTimeline) { // 以单页面启动-朋友圈分享出的单页面this.shareTimeline e.shareTimeline;let param {certId: e.certId,uid: e.uid,unionid: e.unionid,openid: e.openid,}this.initD…...
【四 (3)数据可视化之 Seaborn 常用图表及代码实现 】
目录 文章导航一、介绍二、安装Seaborn三、导入Seaborn四、设置可以中文显示五、占比类图表1、饼图2、环形图 六、比较排序类1、条形图2、箱线图3、小提琴图 七、趋势类图表1、折线图 八、频率分布类1、直方图 九、关系类图表1、散点图2、成对关系图3、热力图 文章导航 【一 简…...
ASP.NET-Server.HtmlEncode
目录 背景: 1.转义特殊字符: 2.防止跨站脚本攻击(XSS): 3.确保输出安全性: 4.保留原始文本形式: 5.与用户输入交互安全: 实例说明: 不用Server.HtmlEncode 效果展示: 用Server.HtmlEnc…...
Linux下进行JavaEE开发-安装JDK、Tomcat、MySQL
目录 JDKTomcatMySQL JDK 安装JDK步骤: 1、创建目录mkdir /opt/jdk 2、将jdk压缩包通过xftp6上传到该目录 3、cd /opt/jdk 4、tar -zxvf jdk-8u151-linux-x64.tar.gz 5、mkdir /usr/local/java 6、mv /opt/jdk/jdk1.8.0_151 /usr/local/java 7、修改环境变量…...
视频和图像编码标准或格式的发展关系
MPEG-2 继承 MPEG-1: MPEG-2 是 MPEG-1 的继任者,用于更高质量和分辨率的视频传输,如 DVD 和数字电视。 MPEG-4 继承 MPEG-2: MPEG-4 在 MPEG-2 的基础上增加了更多的功能和灵活性,适用于多媒体交互和网络传输。 H.2…...
移动云行动:5.5G技术引领数字化转型
刚刚结束的全国两会上,有人大代表建议应尽快发挥5G-A(5.5G)优势,加快试点城市布局。此前,中国移动已宣布将在300多个城市启动5.5G商用部署。在通信技术的历史长河中,4G改变了我们的生活方式,而5…...
Git如何与Gitee连接(主) , Git的基础使用方式简述(次)
作者前言 本章默认读者已经下好了git并拥有gitee账号,如果这两步没有完成的话,可以先去下载和注册账号接着继续阅读,由于写这篇博客的时候更关注的是怎么连接,所以先展示需要的部分,后面会介绍git的一些基本使用方法&…...
使用VLC实现自动播放视频
VLC是一款开源的多媒体播放器,它支持大量的视频和音频格式,并且具有强大的脚本和编程接口。虽然VLC本身并没有内置的编程语言,但你可以通过其命令行接口或Lua脚本来实现自动化播放视频的功能。 以下是一个简单的示例,展示如何使用…...
KY199 查找
描述: 输入数组长度 n 输入数组 a[1…n] 输入查找个数m 输入查找数字b[1…m] 输出 YES or NO 查找有则YES 否则NO 。 输入描述: 输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1&…...
html5播放flv视频
参考:flv-h265 - npmHTML5 FLV Player. Latest version: 1.7.0, last published: 6 months ago. Start using flv-h265 in your project by running npm i flv-h265. There are no other projects in the npm registry using flv-h265.https://www.npmjs.com/packag…...
【知识简略】 简单理解SpringCloud微服务架构:服务注册发现、配置中心、限流、熔断、降级、网关路由等
主要介绍Nacos那一套。 目录 微服务架构1.服务注册发现2.配置中心3.限流、熔断、降级4.网关路由 微服务架构 Spring Cloud 微服务架构中,Nacos 提供了一系列核心组件和服务治理功能,以下是对 Nacos 中涉及的相关组件及其功能的详细解释: 1.…...
福派斯课堂:选择黑背犬的狗粮时需要注意哪些细节?
亲爱的狗友们,选择适合黑背犬的狗粮可不是一件小事哦!🐾 毕竟,黑背犬作为活泼、聪明的犬种,它们的饮食需求可是很特别的。接下来,就让我们一起探讨一下选择黑背犬狗粮时需要注意的细节吧! 1️⃣…...
Python QT 之PySide6简单入门
目录 1.开发环境配置 1.1 下载PySide6 2.2 配置pycharm相关快捷方式 PySide6_Designer - QT Designer 设计UI PySide6_UIC - 将QT Designer生成的UI文件转换为python文件 PySide6_RCC - 将RCC文件转换为python文件 2.第一个开发实例 2.1 QT desiger设计界面 2.2 将ui文…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
