生产环境问题排查:日志分析与性能瓶颈定位(一)
引言
在当今数字化时代,各类应用系统如潮水般涌现,支撑着我们生活和工作的方方面面。从日常使用的电商平台、社交网络,到企业内部复杂的业务系统,它们的稳定运行和高效性能至关重要。而在生产环境中,日志分析与性能瓶颈定位就如同守护系统稳定运行的 “幕后英雄”,发挥着不可替代的关键作用。
当系统出现故障或性能下降时,日志就像是一份详细的 “系统病历”,记录着系统运行过程中的点点滴滴。通过深入分析日志,我们能够追溯系统的执行流程,发现其中隐藏的问题,如错误信息、异常事件等,从而快速定位故障根源,为解决问题提供有力的依据。而性能瓶颈定位则像是为系统进行一次全面的 “体检”,找出那些限制系统性能提升的关键因素,比如数据库查询效率低下、服务器资源不足等,进而有针对性地进行优化,提升系统的整体性能和响应速度 ,避免因性能问题导致用户流失或业务受损。
日志分析:开启问题排查之门
日志是什么,为什么重要
日志,简单来说,就是系统或应用程序在运行过程中记录的一系列事件信息。它就像是一个忠实的记录者,默默地记下系统中发生的每一个重要事件,包括用户的操作、系统的状态变化、错误信息等 。每一条日志记录通常包含了事件发生的时间、产生事件的组件或模块、事件的详细描述以及可能的相关数据等关键信息。例如,在一个电商系统中,日志可能会记录用户的登录时间、浏览的商品页面、添加到购物车的商品信息,以及下单和支付的操作过程等。当系统出现问题时,这些详细的记录就成为了我们追溯问题根源的关键线索。
日志的重要性不言而喻,在排查问题方面,日志是我们定位系统故障的关键工具。当系统出现异常行为,如崩溃、报错或性能下降时,通过仔细分析日志,我们能够快速确定问题发生的时间、位置以及可能的原因。比如,当一个 Web 应用程序突然无法访问时,查看服务器的日志可能会发现是由于某个数据库查询超时导致的,从而帮助我们针对性地解决数据库性能问题。在审计追踪方面,日志提供了系统操作的完整记录,这对于合规性检查和安全审计至关重要。企业可以通过分析日志来确保系统的使用符合相关法规和内部政策,同时也能够发现潜在的安全威胁,如未经授权的访问尝试或数据泄露事件 。在性能优化方面,日志还可以帮助我们了解系统的运行状况,识别出性能瓶颈和潜在的优化点。通过分析日志中的响应时间、资源利用率等指标,我们可以针对性地进行优化,提升系统的整体性能和用户体验。
常见日志格式与工具
在实际应用中,常见的日志格式多种多样。其中,文本日志格式是最直观、最易读的一种,它以纯文本的形式记录事件信息,每一行代表一条日志记录,通常包含时间戳、日志级别、模块名称和具体的日志内容等字段。例如:[2024-10-10 10:10:10] INFO [UserService] User logged in successfully: user1 ,通过这种格式,我们可以一目了然地了解到事件发生的时间、所属模块以及具体内容。
JSON 格式的日志则以 JSON 对象的形式组织数据,具有良好的结构化和扩展性。每个日志记录都是一个 JSON 对象,其中的字段可以根据实际需求进行灵活定义,方便进行数据解析和处理。例如:
{
"timestamp": "2024-10-10 10:10:10",
"level": "INFO",
"module": "UserService",
"message": "User logged in successfully: user1",
"extra_info": {"user_id": 123, "ip_address": "192.168.1.1"}
}
这种格式特别适合在需要对日志进行复杂分析和处理的场景中使用,因为它可以方便地与各种数据处理工具和数据库进行集成。
为了更好地管理和分析海量的日志数据,业界涌现出了许多优秀的日志管理和分析工具,ELK Stack 就是其中的佼佼者。它由 Elasticsearch、Logstash 和 Kibana 三个组件组成,Elasticsearch 是一个分布式的搜索引擎,具有强大的索引和搜索功能,能够快速地存储和检索海量的日志数据。Logstash 则是一个数据处理管道,负责从各种数据源收集日志数据,对其进行过滤、转换和格式化处理,然后将处理后的数据发送到 Elasticsearch 中进行存储。Kibana 则为用户提供了一个直观的可视化界面,通过它,我们可以方便地对存储在 Elasticsearch 中的日志数据进行查询、分析和可视化展示,创建各种仪表盘和报表,以便更直观地了解系统的运行状况和发现潜在的问题。
Fluentd 也是一款备受欢迎的开源日志收集器,它具有高度的灵活性和可扩展性,能够轻松地收集、转换和转发各种类型的日志数据。Fluentd 支持多种输入和输出插件,可以与各种数据源和数据存储服务进行无缝对接,如文件系统、数据库、消息队列等。同时,它还提供了丰富的数据处理功能,包括数据过滤、格式化、聚合等,能够满足不同场景下的日志处理需求。在一个大型的分布式系统中,可能存在多种不同类型的数据源和日志格式,Fluentd 可以通过配置相应的插件,将这些分散的日志数据统一收集起来,并进行标准化处理,然后发送到指定的存储或分析平台,为后续的日志分析工作提供了极大的便利。
实战:从日志中揪出问题
下面我们通过一个实际案例来深入了解如何从日志中筛选、过滤关键信息,从而定位和分析问题。假设我们负责维护一个在线商城系统,近期收到用户反馈,称在下单过程中经常出现卡顿和超时的问题。为了解决这个问题,我们首先需要从系统的日志中寻找线索。
我们登录到服务器,进入日志存储目录,该系统使用的是文本格式的日志文件,每天生成一个日志文件,文件名格式为mall_yyyyMMdd.log。我们找到问题出现当天的日志文件mall_20241010.log,由于日志文件通常非常庞大,直接查看全部内容显然是不现实的,因此我们需要使用一些工具和技巧来筛选关键信息。我们使用grep命令来搜索与下单操作相关的日志记录,命令如下:grep 'order placement' mall_20241010.log > order_placement.log,这条命令会在mall_20241010.log文件中搜索包含order placement关键词的行,并将这些行输出到order_placement.log文件中 。
通过查看order_placement.log文件,我们发现了一些可疑的日志记录,其中有大量记录显示在下单时调用库存服务的接口出现了超时错误 :
[2024-10-10 14:20:10] ERROR [OrderService] Failed to call inventory service during order placement: TimeoutException
[2024-10-10 14:25:30] ERROR [OrderService] Failed to call inventory service during order placement: TimeoutException
为了进一步分析问题,我们需要了解这些超时错误发生的具体时间和频率,以及相关的上下文信息。我们可以使用awk命令对order_placement.log文件进行进一步处理,提取出时间戳和错误信息字段,并统计每个错误出现的次数,命令如下:awk '{print $1, $2, $NF}' order_placement.log | sort | uniq -c,这条命令会提取日志记录中的时间戳、日志级别和最后一个字段(即错误信息),然后对结果进行排序,并统计每个错误信息出现的次数。
通过上述命令的输出,我们发现从下午 2 点到 3 点之间,库存服务接口超时错误出现了 50 多次,这显然是导致下单卡顿和超时的主要原因。接下来,我们需要深入了解库存服务的运行状况,查看库存服务的日志文件,以确定是库存服务本身出现了性能问题,还是网络等其他因素导致的接口超时。经过对库存服务日志的分析,我们发现是由于库存服务所在服务器的 CPU 使用率过高,导致处理请求的速度变慢,从而引发了接口超时。通过进一步排查,我们发现是因为当天有一个定时任务出现了异常,占用了大量的 CPU 资源。我们及时调整了定时任务的配置,解决了 CPU 使用率过高的问题,下单卡顿和超时的问题也随之得到了解决。
通过这个案例,我们可以看到,在面对复杂的系统问题时,通过合理地运用日志分析工具和技巧,从海量的日志数据中筛选、过滤出关键信息,并进行深入分析,就能够快速定位问题的根源,从而有效地解决问题。
性能瓶颈定位:系统的 “体检”
性能瓶颈的表现与影响
性能瓶颈就像是系统运行过程中的 “绊脚石”,一旦出现,会在多个方面表现出明显的症状 。系统响应缓慢是最直观的感受,当用户在电商平台上点击购买按钮后,需要等待数秒甚至数十秒才能看到响应结果,这不仅会极大地降低用户体验,还可能导致用户直接放弃操作,转向其他竞争对手的平台。在一些对实时性要求极高的系统中,如在线游戏、金融交易系统等,响应延迟可能会造成玩家游戏卡顿、交易失败等严重后果,给用户带来直接的经济损失。
吞吐量降低也是性能瓶颈的常见表现之一,一个原本能够每秒处理 thousands 级请求的 Web 服务器,在出现性能瓶颈后,可能每秒只能处理 hundreds 级请求,这对于业务量较大的系统来说,会严重限制其业务的发展。想象一下,在电商购物节期间,大量用户同时涌入平台进行购物,如果系统吞吐量不足,就会导致大量用户无法正常下单,这不仅会影响销售额,还会对品牌形象造成极大的损害。系统资源利用率异常也是性能瓶颈的重要信号,CPU 使用率长时间居高不下,接近 100%,这意味着 CPU 已经满负荷运行,无法再有效地处理更多的任务。内存使用率过高,导致系统频繁进行内存交换,甚至出现内存溢出的错误,这会使系统的稳定性受到严重威胁,随时可能出现崩溃的情况。
性能监控指标与工具
为了及时发现性能瓶颈,我们需要密切关注一系列关键的性能监控指标。CPU 使用率是衡量 CPU 工作负荷的重要指标,它反映了 CPU 在一段时间内处理任务所花费的时间比例。当 CPU 使用率持续超过 80% 时,就需要警惕是否存在 CPU 瓶颈的问题。例如,在一个大数据分析系统中,进行复杂的数据计算时,如果 CPU 使用率一直保持在高位,可能是算法不够优化,或者是没有充分利用多核 CPU 的优势。
内存使用率则表示系统当前使用的内存占总内存的比例,过高的内存使用率可能导致系统性能下降,甚至出现内存泄漏的情况。在 Java 应用程序中,我们可以通过 JVM 的相关工具来监控内存的使用情况,如堆内存、非堆内存的占用情况,以及垃圾回收的频率和耗时等。
磁盘 I/O 指标包括磁盘读写速率、I/O 等待时间等,磁盘读写速率过慢会导致数据读取和写入的延迟增加,影响系统的整体性能。在一个文件存储系统中,如果磁盘 I/O 性能不佳,用户上传和下载文件的速度就会明显变慢。网络 I/O 指标主要关注网络带宽利用率、网络延迟等,网络带宽不足会导致数据传输缓慢,而网络延迟过高则会影响系统的实时性。在分布式系统中,各个节点之间的通信依赖于网络,如果网络 I/O 出现问题,就会导致节点之间的协作出现故障。
为了有效地监控这些性能指标,我们可以借助各种强大的监控工具。Prometheus 是一款开源的系统监控和报警工具包,它采用拉取式的监控方式,能够定期从被监控目标中获取指标数据,并存储在自己的时间序列数据库中。Prometheus 支持丰富的查询语言,我们可以通过编写查询语句来灵活地获取和分析各种性能指标。例如,使用 Prometheus 查询语句rate(node_cpu_seconds_total{mode="idle"}[5m]),可以获取过去 5 分钟内 CPU 的空闲率,从而判断 CPU 的负载情况。
Grafana 则是一款优秀的数据可视化工具,它可以与 Prometheus 等多种数据源集成,将监控数据以直观的图表、仪表盘等形式展示出来。通过 Grafana,我们可以创建各种自定义的监控面板,实时监控系统的各项性能指标,并设置阈值报警,当指标超出正常范围时,及时发送通知,以便我们能够快速响应和处理问题。
New Relic 是一个全栈可观察性平台,它不仅可以监控应用程序的性能指标,还能深入分析代码的执行情况,帮助我们快速定位性能瓶颈所在的具体代码位置。New Relic 提供了丰富的插件和集成选项,能够与各种主流的开发框架和云平台无缝对接,方便我们在不同的环境中使用。
定位性能瓶颈的方法与技巧
定位性能瓶颈需要从多个层面入手,进行全面而深入的分析。从系统资源层面来看,我们可以通过操作系统自带的工具,如 Linux 系统中的top、vmstat、iostat等命令,来实时监控 CPU、内存、磁盘 I/O 等资源的使用情况。使用top命令可以查看当前系统中各个进程的资源占用情况,找出占用 CPU 或内存最多的进程,进一步分析该进程是否存在异常。如果发现某个 Java 进程占用了大量的 CPU 资源,我们可以使用jstack命令获取该进程的线程堆栈信息,查看是否存在死循环、线程阻塞等问题。
从代码层面来看,代码审查是发现潜在性能问题的重要手段。我们需要仔细检查代码中的算法复杂度、循环嵌套层数、资源的创建和释放等情况。在一个数据处理程序中,如果使用了复杂度较高的算法,可能会导致计算时间过长,影响系统性能。此时,我们可以考虑优化算法,选择更高效的数据结构和算法来实现相同的功能。
对于数据库层面,慢查询分析是定位性能瓶颈的关键。我们可以通过数据库的慢查询日志,找出执行时间较长的 SQL 语句,分析其查询条件、索引使用情况等,进行针对性的优化。例如,为频繁查询的字段添加合适的索引,优化查询语句的结构,避免全表扫描等操作,从而提高数据库查询的效率。
火焰图是一种非常直观的性能分析工具,它以可视化的方式展示了 CPU 的使用情况,帮助我们快速定位 CPU 瓶颈所在的函数或代码片段。火焰图的每一层代表一个函数调用,越宽的部分表示该函数占用的 CPU 时间越长。通过分析火焰图,我们可以一目了然地看到哪些函数是性能瓶颈的关键所在,从而有针对性地进行优化。
在实际的性能瓶颈定位过程中,我们还需要结合多种方法和工具,进行综合分析。通过监控工具发现性能指标的异常,再利用火焰图、代码审查、慢查询分析等方法逐步深入排查,最终确定性能瓶颈的根源,并采取有效的优化措施,提升系统的整体性能。
相关文章:
生产环境问题排查:日志分析与性能瓶颈定位(一)
引言 在当今数字化时代,各类应用系统如潮水般涌现,支撑着我们生活和工作的方方面面。从日常使用的电商平台、社交网络,到企业内部复杂的业务系统,它们的稳定运行和高效性能至关重要。而在生产环境中,日志分析与性能瓶…...
go语言的八股文
1.go语言触发异常的场景有哪些 运行时错误 1.空指针解引用:尝试访问一个未初始化的指针指向的内存,会导致程序崩溃并触发异常。 2.数组越界访问:试图访问数组中不存在的索引,比如数组长度为5,却尝试访问索引为10的元素…...
Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取
关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式: …...
组态软件工业化自动领域的可视化配置利器
组态软件是工业自动化领域的可视化配置利器,在工业生产中发挥着至关重要的作用,以下从定义、特点、功能、应用场景、市场现状及发展趋势等方面进行详细介绍: 定义 组态软件,又称组态监控系统软件,是用于数据采集和过程…...
Ansys electronics安装多版本simulink打开s-function冲突解决方法
安装了Ansys Electronics 2022 R1和2024 R1,想通过simplorer和simulink中的S-function进行联合仿真,结果注册表一直是2024 R1,修改方法如下: 1. WINR打开cmd,注意要用管理员权限打开 2. 输入 "D:\ANSYS\AnsysE…...
ubuntu--安装双系统
教程 BIOS设置 启动盘生成和ubuntu安装 boot option #1设置USB为第一启动项 rufus下载 官网: 链接 点击“链接”下面的按钮,即可下载。(注意查看自己的电脑是x64还是x84) 网盘下载: 链接...
快速搭建 Cpolar 内网穿透(Mac 系统)
1、Cpolar快速入门教程(官方) 链接地址:Cpolar 快速入门 2、官方教程详解 本地安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个是从 git 上拉取的&#x…...
【pytorch】torch.nn.Unfold操作
说明 一个代码里涉及到了unfold的操作,看了半天官网都没整明白维度怎么变化的,参考这个链接搞明白了: https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 维度计算 输入( N,…...
使用PyTorch实现图像增广与模型训练实战
本文通过完整代码示例演示如何利用PyTorch和torchvision实现常用图像增广方法,并在CIFAR-10数据集上训练ResNet-18模型。我们将从基础图像变换到复杂数据增强策略逐步讲解,最终实现一个完整的训练流程。 一、图像增广基础操作 1.1 准备工作 #matplotli…...
PyTorch实现糖尿病预测的CNN模型:从数据加载到模型部署全解析【N折交叉验证、文末免费下载】
本文将详细介绍如何使用PyTorch框架构建一个卷积神经网络(CNN)来预测糖尿病,包含完整的代码实现、技术细节和可视化分析。 1. 项目概述 本项目使用经典的Pima Indians Diabetes数据集,通过5折交叉验证训练一个1D CNN模型,最终实现糖尿病预测…...
红队专题-漏洞挖掘-代码审计-反序列化
漏洞挖掘-代码审计-反序列化 加固/防御命令执行相关日志Tools-JNDIExploitJNDI Java Naming and Directory Interface Java命名目录接口注入原理payload参数渗透测试-php命令执行-RCE+Struts2拿webshell普通权限 命令执行 拿 webshellCMD echo 写入一句话 php文件菜刀连接Strut…...
【2025软考高级架构师】——计算机系统基础(7)
摘要 本文主要介绍了计算机系统的组成,包括硬件和软件两大部分。硬件由处理器、存储器、总线、接口和外部设备等组成,软件则涵盖系统软件和应用软件。文章还详细阐述了冯诺依曼计算机的组成结构,包括 CPU、主存储器、外存等,并解…...
【网络原理】TCP协议如何实现可靠传输(确认应答和超时重传机制)
目录 一. TCP协议 二. 确定应答 三. 超时重传 一. TCP协议 1)端口号 源端口号:发送方端口号目的端口号:接收方端口号 16位(2字节)端口号,可以表示的范围(0~65535) 源端口和目的…...
Java synchroinzed和ReentrantLock
synchronized —— JVM亲儿子的暗黑兵法 核心思想:“锁即对象,对象即锁!” 底层三板斧 对象头里的锁密码 每个Java对象头里藏了两个骚东西: Mark Word:32/64位的比特修罗场,存哈希码、GC年龄࿰…...
【Linux】vim配置----超详细
目录 一、插件管理器准备 二、目录准备 三、安装插件 一、插件管理器准备 Vim-plug 是一个Vim插件管理器,利用异步并行可以快速地安装、更新和卸载插件。它的安装和配置都非常简单,而且在操作过程中会给出很多易读的反馈信息,是一个自由、…...
驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…...
如何使用人工智能大模型,免费快速写工作计划?
如何使用人工智能大模型,免费快速写工作计划? 具体视频教程https://edu.csdn.net/learn/40406/666579...
延长(暂停)Windows更新
延长(暂停)Windows更新 因为不关闭更新有时候就会出现驱动或者软硬件不兼容,导致蓝屏出现。 注:为什么选择延长更新而不是用软件暂停更新,因为使用软件暂停更新会出现一下问题,比如微软商店打不开等等 键…...
QT实现串口透传的功能
在一些产品的开发的时候,需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…...
分布类相关的可视化图像
目录 一、直方图(Histogram) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 二、密度图(Density Plot) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 三、箱线图(Box Plo…...
【android bluetooth 框架分析 02】【Module详解 12】【 BidiQueue、BidiQueueEnd、Queue介绍】
1. BidiQueue 和 BidiQueueEnd 蓝牙协议栈里面有很多 BidiQueue ,本节就专门来梳理这块内容。 2. BidiQueue 介绍 BidiQueue,是 Host 与 Controller 层通信的中枢之一, acl_queue_、sco_queue_、iso_queue_ 都是 BidiQueue 类型。让我们一起看一下这个…...
c++通讯录管理系统
通讯录是一个可以记录亲人,好友的信息工具。 功能包括: 1,添加联系人:向通讯录添加新人,包括(姓名,性别年龄,联系电话,家庭住址) 2,显示联系人…...
React 打包
路由懒加载 原本的加载方式 #使用lazy()函数声明的路由页面 使用Suspense组件进行加载 使用CDN优化...
day1 python训练营
变量与输出 print(1,2,3,sep\n,endsep用来区分两个变量,end会紧跟最后一个变量) print(1,2,3,sepaaa,endsep用来区分两个变量,3后面不会再输出aaa) 格式化字符串 变量名值 print(f"变量名{变量名}") 变量的基础运算 ,-*,/ 注意*不要忘写。比如2j就不…...
C语言状态字与库函数详解:概念辨析与应用实践
C语言状态字与库函数详解:概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中,"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念,理解它们的区别是掌握系统编程的基础。 1. 状态字&…...
软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
软件测试笔记 认识测试 软件测试是啥? 说白了,就是检查软件的功能和效果是不是用户真正想要的东西。比如用户说“我要一个能自动算账的软件”,测试就是看这个软件到底能不能准确算账、有没有漏掉功能。 软件测试定义:软件测试就…...
Python多进程同步全解析:从竞争条件到锁、信号量的实战应用
1. 进程同步的必要性 在多进程编程中,当多个进程需要访问共享资源时,会出现竞争条件问题。例如火车票售卖系统中,如果多个售票窗口同时读取和修改剩余票数,可能导致数据不一致。 1.1 竞争条件示例 from multiprocessing import…...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
Spring源码中关于抽象方法且是个空实现这样设计的思考
Spring源码抽象方法且空实现设计思想 在Spring源码中onRefresh()就是一个抽象方法且空实现,而refreshBeanFactory()方法就是一个抽象方法。 那么Spring源码中onRefresh方法定义了一个抽象方法且是个空实现,为什么这样设置,好处是什么。为…...
Pandas数据可视化
在当今这个数据驱动的时代,数据可视化已经成为数据分析不可或缺的一部分。通过图形化的方式展示数据,我们能够更直观地理解数据的分布、趋势和关系,从而做出更加精准的决策。Pandas,作为Python中最为流行的数据处理库,…...
string类(详解)
【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类? 1.1 C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供…...
零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…...
【上位机——MFC】MFC入门
MFC库中相关类简介 CObject MFC类库中绝大部分类的父类,提供了MFC类库中一些基本的机制。 对运行时类信息的支持。对动态创建的支持。对序列化的支持。 CWinApp 应用程序类,封装了应用程序、线程等信息。 CDocument 文档类,管理数据 F…...
ASP.NET Core 最小 API:极简开发,高效构建(下)
在上篇文章 ASP.NET Core 最小 API:极简开发,高效构建(上) 中我们添加了 API 代码并且测试,本篇继续补充相关内容。 一、使用 MapGroup API 示例应用代码每次设置终结点时都会重复 todoitems URL 前缀。 API 通常具有…...
【leetcode100】一和零
1、题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:…...
代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长
105.有向图的完全可达性 题目链接:101. 孤岛的总面积 文章讲解:代码随想录 视频讲解:图论:岛屿问题再出新花样 | 深搜优先搜索 | 卡码网:101.孤岛总面积_哔哩哔哩_bilibili 思路: 1.确认递归函数&…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
Python中的短路运算
近期在学习python的过程中遇到此问题,遂总结记录 在”and“逻辑判定布尔类型时: 若判定对象均为True,则输出最后一个判别为True的对象 若判定对象的数据类型中有布尔类型,且最终结果为False,则输出布尔类型False 若判定对象的…...
Java8-遍历list取出两个字段重新组成list集合
在Java 8中,可以使用Stream API遍历List并提取两个字段重新组合成新的List。 以下是几种常见方法: 方法1:使用自定义类 定义一个包含目标字段的类:public class FieldHolder {private final String field1;private final int field2;public FieldHolder(String field1, i…...
【C++ 程序设计】实战:C++ 实践练习题(31~40)
目录 31. 数列:s 1 + 2 + 3 + … + n 32. 数列:s 1 - 2 - 3 - … - n 33. 数列:s 1 + 2 - 3 + … - n 34. 数列:s 1 - 2 + 3 - … &#…...
【笔记】SpringBoot实现图片上传和获取图片接口
上传图片接口 接口接收图片文件和布尔类型的是否生成缩略图参数。 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\file\cover\202504”,如果文件夹已存在则不生成。接下来拼接文件名,生成30位的随机数拼接到原文件名防止文件名相同的…...
Linux 下依赖库的问题
假设你在 某用户 user_name 下安装了一个 rquests库。 然后你在命令行使用 python3 -c (...)验证。发现没有任何问题。 然后你使用python3 xxx.py 发现执行验证也没有问题。 这个时候你信心慢慢的写了一个C的代码在代码中system调用这个.py文件。 然…...
STM32 HAL 水位传感器驱动程序
工作原理是输出模拟量电压值,只需要使用stm32adc读取电压再转换一下即可 本代码中,水位传感器连接在PA0,可通过宏定义快速设置电压区间和水位之间的关系 water_level.c /***************************************************************…...
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs DeepSeek R1 7b,Langchain 实现 RAG 知识库DeepSeek R1Chat via ConsoleChat via Browser LangchainFAQs GitHub https://github.com/hailiang-wang/ollama-get-started DeepSeek R1 7b,La…...
【C语言】char unsigned char signed char
在C语言中,char 和 unsigned char 虽然都是1字节(通常8位)的数据类型,但它们在符号处理、数值范围和用途上有显著区别。以下是详细对比: 1. 核心区别 特性charunsigned char符号性可能是signed或unsigned(由编译器决定)明确无符号(仅非负数)数值范围通常 -128 到 1270…...
硬件电路(24)-NE555振荡电路
一、概述 NE555 是一款能产生高精度定时脉冲的双极性集成电路。内部包括阈值比较器、触发比较器、RS触发 器、输出电路等四部分电路构成。它可通过外接少量的阻容器件,组成定时触发电路、脉宽调制电路、音 频振荡器等等电路。广泛应用于玩具、信号交通、自动化控制等…...
Transformer系列(二):自注意力机制框架
自注意力机制框架 一、K-Q-V的自注意力机制二、位置表征1. 通过学习嵌入来进行位置表征2. 通过直接改变 α \alpha α来进行位置表征 三、逐元素非线性变换四、未来掩码(future mask)五、总结 上篇博客:NLP中放弃使用循环神经网络架构讲解了循环神经网络…...
安全技术和防火墙
传输层4.7层防火墙 传输层(4)四层防火墙:ip地址 mac地址 协议 端口号来控制数据流量 应用层防火(7)墙/代理服务器: ip地址 mac地址 协议 端口号来控制数据流量 真实传输的数据(把前面的ip地址…...
深度可分离卷积与普通卷积的区别及原理
1. 普通卷积 普通卷积使用一个滤波器在输入特征图的所有通道上滑动,同时对所有通道进行加权求和,生成一个输出通道。如果有多个滤波器,则生成多个输出通道。假设上一层的特征图有 n 个通道,每个通道是一个二维的图像(…...
STM32时钟树
1、认识时钟树 H:high 高 L:low 低 S:speed 速度 I:internal 内部 E:external 外部 HSE就是高速外部时钟源 HSI就是告诉内部时钟源 外部时钟一般需要接一个时钟源,也就是晶振,这个需要外接&…...