Flink系列知识讲解之:网络监控、指标与反压
Flink系列知识之:网络监控、指标与反压
在上一篇博文中,我们介绍了 Flink 网络协议栈从高层抽象到底层细节的工作原理。本篇博文是网络协议栈系列博文中的第二篇,在此基础上,我们将讨论如何监控网络相关指标,以识别吞吐量和延迟方面的反压或瓶颈等影响。如果您对网络协议栈不熟悉,我们强烈建议您先阅读网络协议栈深度剖析,然后继续阅读本文。
网络监控
网络监控最重要的部分可能是监控反压,即操作符算子接收数据的速度超过其处理速度的情况¹。这种行为会导致上游发送方受到反压,原因可能有两个:
- 接收器处理性能较慢
- 出现这种情况的原因可能是接收器本身受到了反压,无法保持与发送器相同的处理速度,或者由于垃圾回收、系统资源不足或 I/O 而暂时受阻。
- 网络通道速度较慢
- 尽管在这种情况下接收方并没有(直接)参与,但由于在同一台机器上运行的所有子任务共享的网络带宽可能被超量占用,因此我们称发送者受到了反向压力。请注意,除了 Flink 的网络堆栈,可能还有更多的网络用户,如source和sink,分布式文件系统(检查点、网络附加存储)、日志和指标数据都会在网络通道中传输。
如果出现反压,这种压力会向上游传递,最终到达Flink应用的源头,从而使其变慢。这种反压机制本身并不是坏事,某种程度来说是应用程序根据当前资源情况的一种自我保护机制,只是说明您缺乏资源来应对当前的负载。不过,您可能会希望通过改进应用程序,使其能够在不使用更多资源的情况下应对更高的负载。
为此,您需要找到:
(1) 瓶颈在哪里(哪个任务/操作符算子);
(2) 造成瓶颈的原因。Flink 提供两种机制来识别瓶颈所在:
- 直接通过 Flink 的网络用户界面(Flink web UI)和反压监控器(backpressure monitor)
- 间接地通过一些网络指标。
Flink Web UI可能是快速排除故障的第一入口,但也有一些缺点,我们将在下文中解释。另一方面,Flink 的网络指标(netwrok metrics)更适合持续监控和推理造成反压的瓶颈的确切问题所在。我们将在下面的章节中介绍这两种方法。在这两种情况下,您都需要确定从source到sink的背压具体来源。值得注意的是,反压的根源节点并不一定会在反压面板体现出高反压,因为反压面板监控的是发送端,如果某个节点是性能瓶颈并不会导致它本身出现高反压,而是导致它的上游出现高反压。总体来看,如果我们找到第一个出现反压的节点,那么反压根源要么是就这个节点,要么是它紧接着的下游节点。
反压监控
反压监控可以通过 Flink 的 Web UI² 进行监控。原理是反压监控器周期性地通过 Thread.getStackTrace() 对所有TaskManager上的运行Task线程的栈信息进行采样,得到线程被阻塞在请求 Buffer(意味着被下游队列阻塞)的频率来判断该节点是否处于反压状态。这些Task要么是无法以buffer的生产速度被发送到网络缓冲区,要么是下游Task处理缓冲区的速度很慢,导致基于credit-based流量控制时,返回给上游发送端的credit值较小(或等于0)。
反压监控器(backpressure monitor)将显示被阻止的请求buffer与总请求的比率。由于某些反压被认为是正常/临时的,因此它将显示以下状态:
- OK for ratio ≤ 0.10,
- LOW for 0.10 < Ratio ≤ 0.5, and
- HIGH for 0.5 < Ratio ≤ 1.
虽然可以调整刷新间隔、采样次数或采样延迟等参数,但通常情况下,您并不需要调整这些参数,因为默认值已经能提供足够好的结果。
也可以通过 Flink提供的REST API 接口来访问反压监控指标:/jobs/:jobid/vertices/:vertexid/backpressure
反压监控器可以帮助您找到反压的来源(在哪个任务/操作符算子处)。但是,它无法帮助您进一步推理产生反压的原因。此外,对于较大的任务或并行度较高的任务,反压监控器会变得过于拥挤而无法使用,而且从所有TaskManager收集所有信息也可能需要一些时间。另外需要注意,频繁地对Task线程栈采样也可能会影响运行任务的性能。
网络指标—Network Metrics
网络(Network)和任务 I/O (Task I/O)指标比反压监控更轻量级,而且会持续地为每个正在运行的作业进行监控。我们可以利用这些指标,获得更多信息,而不仅仅是用于反压监控。与用户最相关的指标包括:
- 至 Flink 1.8:outPoolUsage、inPoolUsage
- 评估已使用的缓冲区与各本地缓冲区中可用缓冲区的比率。在使用基于credit-based的流量控制的 Flink 1.5 - 1.8 版本中,inPoolUsage只与浮动缓冲区有关(独占缓冲区不是池的一部分)。
- Flink 1.9以及更高:outPoolUsage, inPoolUsage, floatingBuffersUsage, exclusiveBuffersUsage
- 评估已使用的缓冲区与各本地缓冲区中可用缓冲区的比率。从 Flink 1.9 开始,inPoolUsage 是 floatingBuffersUsage 和 exclusiveBuffersUsage 的总和。
- numRecordsOut, numRecordsIn
- 该指标包含两个作用域:一个作用域针对操作符算子,另一个作用域针对subtask子任务。对于网络监控来说,子任务域显示的是SubTask发送/接收的记录总数。在实际使用时,需要指定具体的时间跨度
…PerSecond
,比如numRecordsOutPerSecond
、numRecordsInPerSecond
。
- 该指标包含两个作用域:一个作用域针对操作符算子,另一个作用域针对subtask子任务。对于网络监控来说,子任务域显示的是SubTask发送/接收的记录总数。在实际使用时,需要指定具体的时间跨度
- numBytesOut, numBytesInLocal, numBytesInRemote
- 该SubTask从本地/远程发出或读取的字节总数。这些数据也可以通过
…PerSecond
指标作为时间跨度提供。
- 该SubTask从本地/远程发出或读取的字节总数。这些数据也可以通过
- numBuffersOut, numBuffersInLocal, numBuffersInRemote
- 与
numBytes...
类似,但计算的是网络缓冲区的数量。
- 与
另外需要注意:
- 任何至少被使用过一次的输出通道都会占用一个缓冲区(自 Flink 1.5 起)。
- 直到 Flink 1.8:该缓冲区(即使是空的)也会始终被算作值为1的积压,因此接收器试图为其保留一个浮动缓冲区。
- Flink 1.9 及以上版本:缓冲区只有在可以使用(即已满或已刷新)时才会被计入积压(参见FLINK-11082)
- 接收器只有在反序列化缓冲区中的最后一条记录后,才会释放接收到的缓冲区。
以下各节将利用并结合这些指标来推理与吞吐量有关的反压和资源使用/效率。另一部分将详细介绍与延迟相关的指标。
Backpressure
反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题。反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速。由于实时计算应用通常使用消息队列来进行生产端和消费端的解耦,消费端数据源是 pull-based 的,所以反压通常是从某个节点传导至数据源并降低数据源(比如 Kafka consumer)的摄入速率。
我们将在下文中重点讨论输入和输出池的使用情况对反压的监控:
- 如果SubTask的 outPoolUsage 为 100%,它本身就已经受到反向压力。子任务是已经阻塞还是仍在向网络缓冲区写入记录,取决于RecordWriters当前写入的缓冲区有多满。
- inPoolUsage 为 100% 意味着所有浮动缓冲区都已经分配给了输入通道,最终将对上游传导反压。这些浮动缓冲区可能处于以下任一情况:
- 由于独占缓冲区被使用,它们被保留以此在未来被某一通道使用
- 它们被保留用来接收发送方的积压数据(backlog)并等待数据
- 它们可能包含数据并在输入通道中排队
- 或者它们可能包含数据并正在被接收方的子任务读取(一次读取一条记录)。
- 至 Flink 1.8:由于 FLINK-11082,即使在正常情况下,inPoolUsage 达到 100% 也很常见。
- Flink 1.9以及更高:如果 inPoolUsage 持续保持在 100% 左右,则表明上游正在经受反压。
下表总结了inPoolUsage和outPoolUsage的所有组合及其解释。但请记住,反压可能是轻微的或暂时的(无需调查),只存在于特定通道上,或由于特定TaskManager的其他 JVM 进程造成的,如 GC、同步、I/O、资源短缺,而非特定的子任务。
我们甚至可以通过观察两个连续任务的子任务的网络指标来进一步推断反压产生的原因:
- 如果接收方任务的所有子任务的 inPoolUsage 值都很低,而上游任务子任务的 outPoolUsage 值都很高,那么可能是网络瓶颈导致了反压。由于网络是TaskManager所有子任务的共享资源,因此这种反压的产生可能不是直接来自该子任务,而是来自其他各种并发操作,如checkpoint、其他流、外部连接或同一台机器上的其他TaskManager/进程。
反压也可能由任务的所有并行实例或单个任务实例造成。前者通常是因为任务在执行某些针对所有输入分区都耗时的操作。后者通常是某种倾斜的结果,可能是shuffle过程中的数据倾斜,也可能是资源可用性/分配的倾斜。
Flink 1.9以及更高
- 如果 floatingBuffersUsage 不是 100%,则不太可能存在反压。如果浮动缓冲区使用率为 100%,且任何上游任务都存在反压,则表明该输入通道正在对单个、部分或所有输入通道施加反压。要区分这三种情况,可以使用 exclusiveBuffersUsage。
- 假设 floatingBuffersUsage 约为 100%,则 exclusiveBuffersUsage 越高,正在经历反压的输入通道就越多(exclusiveBuffersUsage每个输入通道独占)。在 exclusiveBuffersUsage 接近 100% 的极端情况下,这意味着当前所有输入通道都在受到反压。
下表概括了 “exclusiveBuffersUsage”、"floatingBuffersUsage "和上游任务的 "outPoolUsage "之间的关系,并在上表的基础上扩展了 “inPoolUsage = floatingBuffersUsage + exclusiveBuffersUsage”:
资源使用量 / 吞吐量—Resource Usage / Throughput
除了上述每个监控指标的明显用途外,还有一些组合指标可以帮助我们深入了解网络堆栈中发生的情况:
- 低吞吐量,outPoolUsage 值经常在 100%左右,但所有接收器的 inPoolUsage 值都很低,这说明在做流量控制时的credit-notification(取决于网络延迟)的往返时间过长,不足以利用带宽。可以考虑增加taskmanager.network.memory.buffers-per-channel参数,或尝试禁用基于credit-based的流量控制(不推荐)。
- 将 numRecordsOut 和 numBytesOut 结合起来,有助于确定平均序列化记录大小,从而可以针对峰值情况进行容量规划。
- 如果要推理缓冲区填充率(buffer fill rate)和输出刷新器(output flusher)的影响,可以将 numBytesInRemote 与 numBuffersInRemote 结合起来。
- 当希望调整吞吐量(而不是延迟)时,低缓冲区填充率可能表明网络效率降低。在这种情况下,可以考虑增加缓冲区超时时间,以此来增加单次发送的数据量来提升吞吐。请注意,从 Flink 1.8 和 1.9 版开始,numBuffersOut 只有在缓冲区满或特殊事件(如checkpoint barrier)时才会触发增加,而且可能会滞后。另外需要注意,对本地通道的缓冲区填充率进行推理是不必要的,因为缓冲是一种针对远程通道的优化技术,对本地通道的影响有限。
- 也可以使用 numBytesInLocal 和 numBytesInRemote 将本地流量和远程流量分开,但在大多数情况下这是不必要的。
反压产生的潜在原因
假设已经确定了反压产生的源头(瓶颈)所在,下一步就是分析发生反压的原因。下面,我们列出了一些可能造成反压的潜在原因,从较基本的到较复杂的。建议首先检查基本原因,然后再深入研究更复杂的原因,以免得出错误的结论。
同时需要注意,反压可能是暂时的,是负载峰值、触发checkpoint或作业重启时有积压数据等待处理的结果。在这种情况下,通常可以忽略不计。
在分析反压时,有下面几种瓶颈可以检查:
- 系统资源
首先,你应该检查执行机器的基本资源使用情况,如 CPU、网络或磁盘 I/O。如果某些资源被完全或大量使用,你可以采取以下措施之一:- 尝试优化代码。在这种情况下,代码剖析器很有帮助。
- 基于上述特定的资源环境,调整Flink应用程序,以此来适配机器的资源使用情况。
- 通过增加并行性和/或增加集群中的机器数量来扩大规模。
- GC垃圾回收
通常,长时间的 GC 暂停会导致性能问题。您可以通过打印调试 GC 日志(通过 -XX:+PrintGCDetails)或使用一些内存/GC 剖析器来验证是否存在这种情况。由于处理 GC 问题在很大程度上取决于应用程序,且与 Flink 无关,在此不再赘述,有兴趣的可以参考Oracle 的《垃圾回收调整指南》或 Plumbr 的《Java 垃圾回收手册》。 - CPU/线程瓶颈
有时,如果一个或几个线程造成了 CPU 瓶颈,从而导致整个机器的 CPU 使用率相对较低,CPU 瓶颈可能一眼看不出来。例如,在 48 核机器上,单个 CPU 瓶颈线程的 CPU 使用率仅为 2%。为此,可以考虑使用代码剖析器(Code Profilers),因为它们可以通过显示每个线程的 CPU 使用率来识别占用CPU过多的线程。 - 线程通信
与上述 CPU/线程瓶颈问题类似,子任务也可能因共享资源上的线程竞争而出现瓶颈。在这方面,CPU Profilers 同样是你最好的助手!考虑在用户代码中查找同步开销/锁争用情况。还可以考虑调查共享系统资源。例如,JVM 的默认 SSL 实现可能会占用共享的 /dev/urandom 资源。 - 负载不均衡
如果瓶颈是由数据偏斜造成的,可以尝试通过改变数据分区以打散热点key,或者预聚合来消除瓶颈或减轻其影响。
实际上远不止上述列出来的这些情况。一般来说,要减少背压,首先要分析瓶颈出现的位置,然后找出原因。开始推理 "原因 "的最佳途径是检查哪些资源得到了充分利用。
数据延迟监控
在本节中,我们将关注数据记录在 Flink应用程序流动时,其在 网络协议栈(包括系统的网络连接)内的等待时间。在吞吐量较低的情况下,这些延迟会直接受到缓冲区超时参数或间接受到应用程序代码处理延迟的影响。当处理记录的时间超过预期,或(多个)定时器同时启动并阻止接收器处理接收到的记录时,网络堆栈内记录的流动时间就会大大延长。因此,强烈建议在 Flink 作业中添加自己的指标,以便更好地跟踪作业组件中的数据延迟,并更广泛地了解延迟的原因。
目前,Flink 支持追踪记录流过应用系统(用户代码之外)的延迟。不过,默认情况下是禁用的(原因见下文)。该功能默认为禁用。要启用延迟追踪功能,必须在 Flink Configuration中将metrics.latency.interval 设置为正数(默认为0)或 ExecutionConfig#setLatencyTrackingInterval() 设置延迟跟踪间隔来启用。启用后,Flink 将根据通过 metrics.latency.granularity 定义的粒度来收集延迟直方图:
- single:每个操作符子任务对应一个直方图
- operator(default):source任务和操作符子任务的每个组合都对应一个直方图
- subtask:source子任务和操作符子任务的每种组合都对应一个直方图。
这些指标是通过特殊的 “延迟标记” (latency markers)来收集的:每个source子任务都会周期性地发出一条特殊记录,其中包含其创建的时间戳。然后,“延迟标记”会与正常记录一起流动,但不会在线路上或缓冲队列内超越正常记录。同时,“延迟标记”并不会进入算子逻辑,并不包含记录在操作符中的处理时间。只有当操作符算子无法接收新记录,从而导致记录在缓存中排队时,使用Latency Markers测得的延迟才会反映出来。因此,延迟标记只能测量在操作符算子之间的等待时间,而不是完整的 "端到端 "延迟。不过,用户代码会间接影响这些等待时间!
由于 LatencyMarker 和普通记录一样位于网络缓冲区中,因此它们也会等待缓冲区满或因缓冲区超时而被刷新。当通道处于高负载时,网络缓冲数据不会增加延迟。但是,一旦一个通道处于低负载状态,记录和延迟标记就会出现最多为 buffer_timeout / 2
的预期平均延迟。 这种延迟会增加通向子任务的每个网络连接,在分析子任务的延迟指标时应将其考虑在内。
通过查看每个子任务暴露的延迟跟踪指标(latency tracking metrics)(例如第 95 百分位数),您应该能够确定哪些子任务大大增加了source-to-sink的总体延迟,并继续优化这些子任务。
总结
在本文中,我们讨论了如何监控 Flink 的网络协议栈,这主要涉及识别反压:反压发生的位置、来源以及可能的原因。这可以通过两种方式实现:
- 使用反压监控器来观察简单场景以及调试;
- 使用 Flink 的任务和网络堆栈指标进行持续监控、更深入的分析,并减少运行时开销。
反压可能是由网络层本身造成的,但在大多数情况下,是由高负载下的某些子任务造成的。通过分析上述指标,可以将这两种情况区分开来。同时,Flink还提供了一些监控资源使用情况和跟踪网络延迟的指标。
相关文章:
Flink系列知识讲解之:网络监控、指标与反压
Flink系列知识之:网络监控、指标与反压 在上一篇博文中,我们介绍了 Flink 网络协议栈从高层抽象到底层细节的工作原理。本篇博文是网络协议栈系列博文中的第二篇,在此基础上,我们将讨论如何监控网络相关指标,以识别吞…...
Postman接口测试05|实战项目笔记
目录 一、项目接口概况 二、单接口测试-登录接口:POST 1、正例 2、反例 ①姓名未注册 ②密码错误 ③姓名为空 ④多参 ⑤少参 ⑥无参 三、批量运行测试用例 四、生成测试报告 1、Postman界面生成 2、Newman命令行生成 五、token鉴权(“…...
人工智能学习路线全链路解析
一、基础准备阶段(预计 2-3 个月) (一)数学知识巩固与深化 线性代数(约 1 个月): 矩阵基础:回顾矩阵的定义、表示方法、矩阵的基本运算(加法、减法、乘法)&…...
图像处理 | 图像二值化
在图像处理领域,图像二值化是一个重要的操作,它将彩色或灰度图像转换为只有两种颜色(通常是黑白)的图像。二值化广泛应用于文字识别、图像分割、边缘检测等领域,尤其在处理简洁和高对比度的图像时非常有效。本文将深入…...
ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析
前言 在 ASP.NET Core 中,服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (Dependency Injection, DI),我们可以为服务定义其生命周期:Scoped、Transient 和 Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用…...
鼠标自动移动防止锁屏的办公神器 —— 定时执行专家
目录 ◆ 如何设置 ◇ 方法1:使用【执行Nircmd命令】任务 ◇ 方法2:使用【模拟键盘输入】任务 ◆ 定时执行专家介绍 ◆ 定时执行专家最新版下载 ◆ 如何设置 ◇ 方法1:使用【执行Nircmd命令】任务 1、点击工具栏第一个图标【新建任务】&…...
开源库:jcon-cpp
说明 jcon-cpp 是一个用于 C 的 JSON-RPC 库,它允许开发者通过 JSON-RPC 协议进行进程间通信(IPC)。JSON-RPC 是一种轻量级的远程过程调用协议,基于 JSON 格式数据进行通信。基于MIT协议,最新代码基于Qt6实现。可通过…...
Docker入门之docker基本命令
Docker入门之docker基本命令 官方网站:https://www.docker.com/ 1. 拉取官方镜像并创建容器(以redis为例) 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令,如需要,直接看第二步 docker r…...
C++ Qt练习项目 QChar功能测试
个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…...
Taro+react 开发第一节创建 带有redux状态管理的项目
Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…...
【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】
Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异, 在 SoC设计中,RTL-to-Netlist映射 是从RTL(Register Transfer Level)代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...
551 灌溉
常规解法: #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…...
计算机网络之---OSI七层模型
为什么会有七层模型 OSI七层模型的出现源于计算机网络技术的发展需求,主要解决以下几个问题: 标准化与互操作性 随着计算机网络的快速发展,不同厂商、不同技术之间的设备和系统需要能够无缝通信。而不同厂商在网络硬件、软件、协议等方面存在…...
spring task使用
Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Sprin…...
ADB->查看进程并强杀进程
查看进程 adb shell ps | findstr com.example.myapplication// result u0_a275 26312 914 17185988 193260 do_freezer_trap 0 S com.example.myapplication用户USER: u0_a275 该字段表示运行此进程的用户。在 Android 中,应用通常以 uN_aM 的格式表…...
Qt重写webrtc的demo peerconnection
整个demo为: 可以选择多个编码方式: cmake_minimum_required(VERSION 3.5)project(untitled LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)set(CMA…...
comfyui精准作图之gligen
简介 在 Stable Diffusion(SD)中,GLIGEN 是一种用于增强文本到图像生成模型可控性的技术。它通过在现有的预训练扩散模型(如 Stable Diffusion)基础上,引入额外的定位输入(如边界框、关键点或参…...
再次梳理ISP的大致流程
前言: 随着智能手机的普及,相机与我们的生活越来越紧密相关。在日常生活中,我们只需要轻轻按下手机上的拍照按钮,就能记录下美好时刻。那么问题来了:从我们指尖按下拍照按钮到一张色彩丰富的照片呈现在我们面前&#x…...
系统思考与因果智慧
“众生畏果,菩萨畏因”,这句话蕴藏着深厚的因果智慧,与系统思考不谋而合。 众生畏果,体现了大多数人的行为模式:关注的是眼前的问题与结果,比如失败、冲突、痛苦。正如在系统思考中,我们称之为…...
k8s排错集:zk集群的pod报错 Init:CrashLoopBackOff无法启动
zk三节点集群,zk-0无法启动 statefulset 进到该node节点上查看容器的报错日志,发现在初始化container的时候一个命令有问题 查看正常zk集群的pod的资源配置文件 解决办法: 修改资源配置文件 应该修改为 chown -R 1000:1000 /zkenv kubec…...
商品详情API接口数据解析,API接口系列(示例返回数据(JSON格式))
商品详情API接口是用于获取特定商品详细信息的编程接口。它通常返回JSON格式的数据,包含商品的各种属性,如名称、价格、描述、库存状态、图片URL等。以下是一个典型的商品详情API接口数据解析示例,以及如何调用和使用这些数据的基本步骤。 示…...
Qt官方下载地址
1. 最新版本 Qt官方最新版本下载地址:https://www.qt.io/download-qt-installer 当前最新版本Qt6.8.* 如下图: 2. 历史版本 如果你要下载历史版本安装工具或者源码编译方式安装,请转至此链接进行下载:https://download.qt.i…...
Python自学 - 类进阶(可调用对象)
返回目录 1 Python自学 - 类进阶(可调用对象) 可调用对象在Python中有很重要的作用,那什么是可调用对象呢? 可以简单的理解为,凡是对象可以加括号给参数的都叫可调用对象,如:obj(x)中obj就是可调用对象,因…...
键盘过滤驱动
文章目录 概述注意源码参考资料 概述 irp请求会从io管理器中传递到设备栈中依次向下发送,当到达底层真实设备处理完成后,会依次返回,这时如果在设备栈中有我们自己注册的设备,就可以起到一个过滤的功能。键盘过滤驱动就是如此&am…...
Type-C单口便携显示器-LDR6021
Type-C单口便携显示器是一种新兴的显示设备,它凭借其便携性、高性能和广泛的应用场景等优势,正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式: 一、连接与传输 1. **设备连接**:Type-C单口便携显示器通过Type-C接…...
ClickHouse vs StarRocks 选型对比
一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了,Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件,发明各种的解决方案技术栈,一方面确实帮助很多用户解决了问题,但另一方面因为繁杂的技术栈与高昂的维护成本&…...
服务器数据恢复—raid5故障导致上层ORACLE无法启动的数据恢复案例
服务器数据恢复环境&故障: 一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统,部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动,ORACLE数据库也无法启动。 服…...
鼠标过滤驱动
文章目录 概述代码参考资料 概述 其编写过程大体与键盘过滤驱动相似,只需要切换一下附加的目标设备以及创建的设备类型等。但在该操作后依然无法捕获到Vmware创建的win7操作系统的鼠标irp信息,于是通过在获取鼠标驱动,遍历其所有的设备进而附…...
SQL进阶实战技巧:LeetCode2201. 统计可以提取的工件?
目录 0 题目描述 1 数据准备 2 问题分析 第一步:生成每个工件的所有单元格 第二步:标记被挖掘的单元格...
Supermaven 加入 Cursor:AI 编码新篇章
引言 2024 年 11 月 11 日,我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor! 这一合作标志着 AI 编程工具进入了一个新的发展阶段,为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…...
金融项目实战 01|功能测试分析与设计
前置内容:金融项目准备的内容笔记可直接看如下笔记 只看:一、投资专业术语 和 二、项目简介 两部分文章浏览阅读2.3k次,点赞70次,收藏67次。安享智慧理财金融系统测试项目,测试用例,接口测试,金…...
阿里云直播互动Web
官方文档:互动消息Web端集成方法_视频直播(LIVE)-阿里云帮助中心 以下是代码实现: <!-- 引入阿里云互动文件 --> <script src"https://g.alicdn.com/code/lib/jquery/3.7.1/jquery.min.js"></script> <script src&quo…...
python【输入和输出】
Python 有三种输出值的方式: 表达式语句print() 函数使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。 ① 将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现: str(): 函数返回一个用户易…...
网络安全建设方案,信息安全风险评估报告,信息安全检测文档(Word原件完整版)
一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细…...
nexus搭建maven私服
说到maven私服每个公司都有,比如我上一篇文章介绍的自定义日志starter,就可以上传到maven私服供大家使用,每次更新只需deploy一下就行,以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…...
Redis为 List/Set/Hash 的元素设置单独的过期时间
一.业务简介 我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。 这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。但这样并不…...
高比例压缩:Linux 中的压缩命令与技巧
文章目录 高比例压缩:Linux 中的压缩命令与技巧1. 压缩格式的选择2. gzip 命令示例:压缩文件示例:解压文件 3. bzip2 命令示例:压缩文件示例:解压文件 4. xz 命令示例:压缩文件示例:解压文件 5.…...
73.矩阵置零 python
矩阵置零 题目题目描述示例 1:示例 2:提示: 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…...
工业互联网项目开发工作流及各阶段核心关注点
工业互联网项目开发全流程V3.0 工业互联网项目开发工作流程及核心问题 一、需求分析 1、共享平台需求分析 这个平台要解决什么问题? 这个平台的用户群体是谁? 这个平台应该具备哪些主要功能? 这个平台的使用场景是什么? 这个平…...
简单易用的PDF工具箱
软件介绍 PDF24 Creator是一款简单易用的PDF工具箱,而且完全免费,没有任何功能限制。既可以访问官网在线使用各种PDF工具,也可以下载软件离线使用各种PDF工具。 软件功能 1、PDF转换 支持将多种文件格式(Word、PowerPoint、Exc…...
氧化铌在光学领域的独特贡献与应用拓展-京煌科技
在当今科技日新月异、各领域不断寻求突破创新的时代背景下,众多材料因其独特的性能而备受关注,氧化铌便是其中极具代表性的一种。作为铌的氧化物,其化学式为 Nb₂O₅,以无色或白色固体的形态存在,正凭借着优良的热稳定…...
EXCEL技巧
1. EXCEL技巧 1.1. 截取表格内某个字符之前的所有字符 1.1.1.样例 在单元格内输入函数: # 截取A1单元格内“分”字符左边的所有字符 LEFT(A1,FIND("分",A1)-1)1.1.2.截图...
Java 将RTF文档转换为Word、PDF、HTML、图片
RTF文档因其跨平台兼容性而广泛使用,但有时在不同的应用场景可能需要特定的文档格式。例如,Word文档适合编辑和协作,PDF文档适合打印和分发,HTML文档适合在线展示,图片格式则适合社交媒体分享。因此我们可能会需要将RT…...
shell的变量
在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌 握的一个非常基础的概念。只有理解变量的使用方法,才能设计出良好的程序。本节将介绍Shell中变量 的相关知识。 1、什么是变量 顾名思义,变量就是程序…...
【STM32】利用SysTick定时器定时1s
1.SysTick简单介绍 SysTick定时器是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。 SysTick定时器用于在每隔一定的时间产生一个中断,即使在系统睡眠模式下也能工作。 关于SysTic…...
halcon3d 如何计算平面法向量!确实很简单
这个问题其实一直困扰了我很长时间,之前是怎么算的呢 对于一个平面,我会先求它的fit_primitives_object_model_3d去将它拟合,接下来用surface_normals_object_model_3d 算子生成它的法线,后用get_object_model_3d_params (ObjectModel3DNormals, ‘point_normal_x’, GenP…...
计算机网络_物理层
2.1物理层的基本概念 传输媒体 导引型传输媒体 双绞线 同轴电缆 光纤 非导引型传输媒体 微波通信 2~40GHz 物理层协议的主要任务 机械特性 电器特性 功能特性 过程特性 物理层概述 物理层考虑是怎样才能在连接各种计算机的传输媒体上传输数据比特流…...
Springboot——钉钉(站内)实现登录第三方应用
文章目录 前言准备1、创建钉钉应用,并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台,增加第三方应用&a…...
libusb学习——简单介绍
文章目录 libusb 简介libusb 编译libusb 源码目录介绍核心代码文件平台支持例子 API使用libusb初始化和去初始化libusb设备处理和枚举libusb 杂项libusb USB描述符libusb 设备热插拔事件通知libusb 异步设备I/Olibusb 同步设备I/Olibusb 轮询与定时 libusb 涉及技术参考 libusb…...
Vue进阶(贰幺叁)node 版本切换
文章目录 一、前言1.1 什么是nvm? 二、查看已安装好的 node 版本三、下载 node 版本四、切换 node 版本五、查看在用 node 版本六、拓展阅读 一、前言 项目开发阶段,会涉及多node版本切换应用场景,可应用nvm实现node版本切换。 1.1 什么是nvm? nvm是…...