ActiveMQ 生产环境问题排查与调优指南(一)
一、引言
在当今复杂的分布式系统架构中,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其丰富的特性、良好的稳定性和易用性,在众多企业的生产环境中占据了一席之地。它基于 JMS(Java Message Service)规范,为应用程序提供了可靠的异步通信能力,能够有效地实现系统解耦、异步处理、流量削峰以及消息分发等关键功能。
在大型电商系统中,订单处理、库存管理、物流配送等模块之间的通信就可以借助 ActiveMQ 实现解耦。当用户下单后,订单信息通过 ActiveMQ 发送到各个相关系统,各个系统可以按照自己的节奏进行处理,而不需要实时等待其他系统的响应,大大提高了系统的灵活性和可扩展性。在高并发的秒杀场景下,ActiveMQ 可以作为流量削峰的利器,将大量瞬间涌入的请求转化为有序的消息流,避免后端系统因承受不住突发的高流量而崩溃。
然而,如同任何复杂的软件系统一样,ActiveMQ 在生产环境中运行时也难免会遇到各种各样的问题。消息堆积导致内存溢出,使得系统性能急剧下降,甚至服务中断;网络连接不稳定,造成消息发送或接收失败,影响业务的连续性;性能瓶颈限制了系统的吞吐量,无法满足日益增长的业务需求。这些问题如果不能及时有效地解决,将会给企业带来严重的损失,不仅影响用户体验,还可能导致业务数据的丢失或不一致。
对 ActiveMQ 进行问题排查与调优就显得尤为必要。通过深入了解 ActiveMQ 的工作原理、内部机制以及常见问题的根源,我们能够运用一系列有效的工具和方法,快速定位问题所在,并采取针对性的措施进行优化。这不仅可以确保 ActiveMQ 在生产环境中稳定可靠地运行,还能充分发挥其性能优势,为企业的业务发展提供坚实的技术支持。接下来,本文将详细介绍 ActiveMQ 生产环境中常见问题的排查方法以及实用的调优策略,希望能为广大开发者和系统运维人员提供有益的参考。
二、ActiveMQ 基础回顾
2.1 什么是 ActiveMQ
ActiveMQ 是 Apache 软件基金会所研发的一款开源消息中间件,它基于 Java 语言开发,并且完全支持 JMS1.1 和 J2EE 1.4 规范,这使得它在 Java 企业级应用中如鱼得水。其核心价值在于提供了可靠的消息传递机制,能够在分布式系统中实现不同组件之间的异步通信。
从功能特性上看,ActiveMQ 支持多种消息传输协议,像 OpenWire、Stomp、REST、WS Notification、XMPP、AMQP 等 ,这为不同类型的应用程序集成提供了极大的便利。在一个大型企业的混合技术架构中,可能存在使用不同语言和协议开发的模块,ActiveMQ 凭借其对多种协议的支持,能够无缝地连接这些模块,实现它们之间的消息交互。ActiveMQ 支持多种传送协议,包括 in - VM、TCP、SSL、NIO、UDP、Jgroups、JXTA 等,这使得它可以适应不同的网络环境和应用场景。无论是在局域网内的高速通信,还是在广域网中的安全传输,ActiveMQ 都能胜任。
ActiveMQ 还具备强大的消息持久化能力,它支持通过 JDBC 和 journal 提供高速的消息持久化,确保即使在系统崩溃或故障的情况下,消息也不会丢失。在金融交易系统中,每一笔交易信息都至关重要,通过 ActiveMQ 的消息持久化功能,交易消息可以被可靠地存储和处理,保证了交易数据的完整性和一致性。对 Spring 的良好支持也是 ActiveMQ 的一大亮点,它可以很容易地内嵌到使用 Spring 的系统里面去,并且支持 Spring2.0 的特性,进一步简化了企业级应用的开发和部署过程。
2.2 ActiveMQ 核心组件
- Broker:Broker 是 ActiveMQ 的核心组件,它就像是一个智能的消息中转站,负责接收、存储和发送消息。在一个分布式系统中,可能存在多个 Producer 和 Consumer,Broker 起到了协调和管理的作用,它维护着消息队列和主题,确保消息能够准确无误地被路由到目标消费者。当一个电商系统中的订单模块产生新订单消息时,Broker 会接收这些消息,并根据配置将它们存储到相应的队列中,等待物流模块的 Consumer 来获取并处理。
- Producer:Producer 即消息生产者,是消息的源头。它负责创建消息,并将这些消息发送到 Destination(消息目的地,如队列或主题)。在一个内容管理系统中,当用户发布一篇新文章时,系统中的 Producer 组件会创建包含文章内容和相关元数据的消息,并将其发送到指定的消息队列,以便后续的审核、发布等流程能够及时处理。
- Consumer:Consumer 是消息的接收者和处理者,它从 Destination 中获取消息,并进行相应的业务逻辑处理。在一个订单处理系统中,Consumer 会监听订单队列,一旦有新的订单消息到达,它就会立即获取并解析消息,然后进行库存检查、订单确认等一系列操作。
- Destination:Destination 是消息的目的地,它可以是 Queue(队列)或者 Topic(主题)。Queue 遵循点对点的消息传递模式,一个消息只能被一个消费者消费,就像快递包裹只能被一个收件人接收一样;而 Topic 采用发布 / 订阅模式,一个消息可以被多个订阅了该主题的消费者接收,类似于广播通知,所有订阅者都能收到。在一个新闻发布系统中,新闻稿件可以通过 Topic 发布,所有订阅了该新闻主题的用户端(Consumer)都能获取到最新的新闻消息。
三、生产环境常见问题及排查
3.1 消息积压
在生产环境中,消息积压是 ActiveMQ 常见的问题之一。当消息的产生速度远远超过其被消费的速度时,就会导致消息在队列中不断堆积。这种情况一旦发生,队列中的未处理消息数量会持续攀升,占用大量的内存和磁盘空间,严重时甚至会引发内存溢出,导致 ActiveMQ 服务崩溃,进而使整个依赖该消息系统的业务流程陷入停滞。
消息积压的原因是多方面的。生产者发送速度过快是一个常见因素,在电商大促活动期间,订单生成的消息量会在短时间内呈爆发式增长,如果生产者以极高的频率向 ActiveMQ 发送订单消息,而消费者的处理能力无法跟上,就必然会造成消息积压。消费者消费能力不足也是关键原因,消费者的业务逻辑过于复杂,需要进行大量的数据库查询、复杂的计算或者外部系统调用,这会导致单个消息的处理时间变长,从而降低了整体的消费速度。当系统并发消费者数量设置不合理,无法充分利用系统资源进行消息处理时,也会出现消费能力跟不上生产速度的情况。
网络延迟同样不可忽视,不稳定的网络连接会导致消息在传输过程中出现延迟或中断,使得消息不能及时被消费者接收和处理。在分布式系统中,生产者、消费者和 ActiveMQ 服务器可能分布在不同的地理位置,网络传输的不确定性增加了消息积压的风险。如果网络带宽不足,大量消息同时传输时会造成网络拥塞,进一步加剧消息的延迟。
持久化存储也可能对消息处理速度产生影响。当消息设置为持久化时,ActiveMQ 需要将消息写入磁盘以确保数据的可靠性,但磁盘 I/O 操作相对较慢,尤其是在高并发情况下,频繁的磁盘写入会成为性能瓶颈,导致消息处理延迟,进而引发消息积压。
排查消息积压问题时,可以借助一些监控工具,如 JMX(Java Management Extensions),它提供了对 ActiveMQ 内部运行状态的详细监控指标,通过 JMX 可以实时获取队列中的消息数量、消息的入队和出队速率等关键信息,从而直观地判断是否存在消息积压以及积压的严重程度。ActiveMQ Web Console 也是一个实用的工具,它以图形化界面展示了 ActiveMQ 的各种运行参数和队列状态,方便运维人员进行监控和管理。
日志分析也是排查问题的重要手段。通过查看生产者和消费者的日志,可以了解消息的发送和接收情况,判断是否存在异常。生产者日志中频繁出现发送失败的记录,可能意味着网络问题或者 ActiveMQ 服务器负载过高;消费者日志中出现大量的处理超时或异常信息,则可能表明消费者的处理逻辑存在问题。
3.2 服务宕机
ActiveMQ 服务宕机是一个严重的问题,它会导致消息的发送和接收完全中断,使依赖消息通信的各个业务模块之间的协作无法正常进行。在金融交易系统中,ActiveMQ 服务宕机可能导致交易订单无法及时处理,资金流转出现异常,给用户和企业带来巨大的经济损失;在电商系统中,可能导致订单丢失、库存更新不及时等问题,严重影响用户体验和业务的正常运营。
服务宕机的原因较为复杂,资源不足是常见的因素之一。服务器的 CPU、内存、磁盘 I/O 等资源是有限的,当 ActiveMQ 运行过程中对这些资源的需求超过了服务器的供给能力时,就可能引发服务宕机。在高并发场景下,大量的消息处理任务会占用大量的 CPU 资源,如果 CPU 使用率持续过高且长时间得不到缓解,系统可能会因为无法正常调度任务而出现卡顿甚至宕机。同样,内存不足也会导致 ActiveMQ 无法正常存储和处理消息,当内存被耗尽时,系统会触发 OOM(Out Of Memory)错误,使服务崩溃。
内存溢出也是导致服务宕机的重要原因。ActiveMQ 在处理消息时需要使用内存来缓存消息、维护队列状态等,如果内存管理不当,例如存在内存泄漏问题,随着时间的推移,内存中的对象不断累积,最终会耗尽所有可用内存,导致服务无法继续运行。当消息堆积严重时,大量的未处理消息会占用大量内存,也容易引发内存溢出。
GC(Garbage Collection,垃圾回收)问题也不容忽视。GC 是 Java 虚拟机用于回收不再使用的内存空间的机制,但如果 GC 的频率过高或者 GC 的停顿时间过长,会影响 ActiveMQ 的正常运行。频繁的 GC 会消耗大量的 CPU 资源,导致系统性能下降;而长时间的 GC 停顿会使 ActiveMQ 在这段时间内无法响应消息的发送和接收请求,如果这种情况持续发生,可能会导致服务失去响应,最终宕机。
配置错误同样可能引发服务宕机。ActiveMQ 的配置文件中包含了众多的参数,如线程池大小、连接池配置、持久化策略等,如果这些参数设置不合理,就可能导致服务运行异常。线程池大小设置过小,在高并发情况下,线程资源会很快被耗尽,导致新的消息处理任务无法得到执行;连接池配置不当可能会导致连接泄漏或者连接超时,影响 ActiveMQ 与生产者、消费者之间的通信。
排查服务宕机问题时,首先要检查服务器的资源使用情况,可以使用 top、vmstat 等系统命令来查看 CPU、内存、磁盘 I/O 等资源的实时使用状态,分析是否存在资源耗尽的情况。分析 GC 日志也是关键步骤,通过 GC 日志可以了解 GC 的执行情况,包括 GC 的频率、停顿时间、回收的内存大小等信息,从而判断是否存在 GC 问题。可以通过调整 JVM 的 GC 参数来优化 GC 性能,如选择合适的 GC 收集器、调整堆内存大小等。仔细排查 ActiveMQ 的配置文件,确保各项参数设置正确合理,也可以参考官方文档和最佳实践来进行配置优化。
3.3 消息丢失
消息丢失是 ActiveMQ 在生产环境中可能出现的另一个严重问题,它对业务的影响是不可忽视的。在订单处理系统中,订单消息的丢失可能导致订单无法被及时处理,进而影响库存管理、物流配送等后续环节,给企业带来经济损失;在支付系统中,支付消息的丢失可能导致支付状态不一致,引发用户纠纷和资金风险。
消息丢失的原因有多种,非持久化消息的处理方式是其中之一。当消息被设置为非持久化时,它们仅存储在内存中,如果此时 ActiveMQ 服务发生故障,如宕机、重启等,内存中的非持久化消息将会丢失。在一些对消息可靠性要求不高的场景中,可能会使用非持久化消息以提高消息处理的效率,但这也增加了消息丢失的风险。
网络异常也是导致消息丢失的常见原因。在消息传输过程中,如果网络出现中断、延迟过高或者丢包等情况,消息可能无法成功到达目的地,从而导致丢失。在分布式系统中,生产者、消费者和 ActiveMQ 服务器之间通过网络进行通信,网络的不确定性使得消息丢失的问题难以完全避免。当网络抖动时,消息可能在传输途中被丢弃,而生产者和消费者可能由于没有正确处理网络异常,无法及时重发或接收消息。
事务未正确处理也可能引发消息丢失。在使用 ActiveMQ 进行消息处理时,如果涉及到事务操作,如在一个事务中发送多条消息或者在事务中进行消息的发送和业务逻辑处理,如果事务没有正确提交或回滚,可能会导致部分消息丢失。当事务提交失败时,已经发送但未确认的消息可能会被 ActiveMQ 视为无效消息而丢弃;当事务回滚时,如果没有正确处理已发送的消息,也可能导致消息丢失。
排查消息丢失问题时,可以通过抓包分析来了解消息在网络传输过程中的情况。使用 Wireshark 等抓包工具,可以捕获网络数据包,分析消息的发送和接收情况,判断是否存在网络异常导致的消息丢失。检查事务配置也是必要的步骤,需要确认事务的开启、提交和回滚逻辑是否正确,以及事务的隔离级别是否设置合理,避免因事务问题导致消息丢失。
四、性能瓶颈分析
4.1 网络瓶颈
在分布式系统中,网络作为 ActiveMQ 与生产者、消费者之间通信的桥梁,其性能对 ActiveMQ 的整体表现有着显著的影响。网络延迟和带宽限制是导致网络瓶颈的两大主要因素,它们会直接导致消息传输缓慢,进而影响整个系统的性能和响应速度。
当网络延迟较高时,消息在生产者、ActiveMQ 服务器和消费者之间传输所需的时间会显著增加。在一个跨地域的分布式电商系统中,位于北京的生产者向位于上海的 ActiveMQ 服务器发送订单消息,再由位于广州的消费者接收处理。如果网络延迟过大,消息从生产者发出后,可能需要数秒甚至更长时间才能到达 ActiveMQ 服务器,再经过同样长的时间才能被消费者接收。这不仅会导致订单处理的时效性大大降低,还可能引发一系列连锁反应,如库存更新不及时、物流配送延迟等。
网络延迟产生的原因是多方面的。网络拥塞是常见的因素之一,当网络中同时传输的数据包过多时,就会造成网络拥堵,使得消息传输受阻。在电商大促期间,大量的订单消息、支付消息、物流消息等同时在网络中传输,很容易导致网络拥塞,从而增加消息的传输延迟。网络设备故障,路由器、交换机等出现故障或性能下降,也会影响网络的正常通信,导致延迟增加。
带宽限制同样不容忽视。带宽是指在单位时间内网络能够传输的数据量,如果带宽不足,当大量消息同时需要传输时,就会出现数据传输缓慢的情况。在一个视频直播平台中,直播过程中产生的大量实时消息需要通过 ActiveMQ 进行分发,如果网络带宽有限,这些消息就无法及时被传输到各个客户端,导致直播卡顿、延迟等问题,严重影响用户体验。
为了更直观地理解带宽限制对消息传输的影响,我们可以将网络带宽比作一条公路,消息则是行驶在公路上的车辆。当公路的宽度(带宽)有限时,车辆的通行数量就会受到限制,车辆行驶的速度也会变慢。如果公路上的车辆过多,就会出现交通堵塞(网络拥塞),进一步降低车辆的通行效率(消息传输速度)。
4.2 磁盘 I/O 瓶颈
磁盘 I/O 性能在 ActiveMQ 的消息持久化和存储过程中起着关键作用,它直接关系到消息的处理效率和系统的稳定性。当磁盘读写速度较慢时,会对消息持久化和存储产生诸多不利影响,尤其在高并发场景下,磁盘 I/O 很容易成为性能瓶颈。
ActiveMQ 支持多种消息持久化方式,如 KahaDB、LevelDB 和 JDBC 等,无论采用哪种方式,都离不开磁盘的读写操作。以 KahaDB 为例,它基于日志文件进行消息存储,当生产者发送消息时,消息会被追加写入到 db-*.log 文件中,同时在 db.data 文件中创建对应的 B 树索引。在这个过程中,如果磁盘的写入速度较慢,就会导致消息持久化的延迟增加。在一个订单处理系统中,大量的订单消息需要持久化到磁盘,如果磁盘 I/O 性能不佳,消息写入磁盘的时间会变长,这不仅会影响新消息的接收和处理,还可能导致消息堆积在内存中,增加内存的压力。
磁盘读取速度同样重要。当消费者需要从磁盘中读取消息时,如果磁盘读取速度慢,会导致消息的消费延迟。在一个实时监控系统中,消费者需要及时读取传感器发送的监控消息进行分析处理,如果磁盘读取消息的速度跟不上消息产生的速度,就会导致监控数据的处理滞后,无法及时发现和处理潜在的问题。
在高并发情况下,磁盘 I/O 成为性能瓶颈的原因主要有以下几点。高并发会导致磁盘的读写请求剧增,磁盘的 I/O 资源被大量占用。当多个生产者同时发送大量消息时,磁盘需要同时处理多个写入请求,而磁盘的 I/O 带宽是有限的,这就容易导致读写操作的排队等待,从而降低了整体的 I/O 性能。频繁的磁盘读写操作还会导致磁盘碎片的增加,进一步降低磁盘的读写速度。磁盘碎片是指磁盘上的文件被分散存储在不连续的物理块中,当读取或写入文件时,磁盘磁头需要频繁地移动到不同的位置,这会增加磁盘的寻道时间,降低 I/O 效率。
4.3 内存瓶颈
内存是 ActiveMQ 运行过程中不可或缺的资源,它用于缓存消息、维护队列状态、存储对象等。JVM 内存设置不合理和内存泄漏是导致内存瓶颈的主要原因,它们会对 ActiveMQ 的性能产生严重影响,甚至导致系统不稳定。
JVM 内存设置不合理可能表现为堆内存过小或过大。如果堆内存设置过小,当 ActiveMQ 处理大量消息时,可能会出现内存不足的情况,导致频繁的垃圾回收(GC)。频繁的 GC 会消耗大量的 CPU 资源,使得系统的性能下降。在一个消息量较大的电商系统中,若 JVM 堆内存设置过小,随着消息的不断产生和处理,堆内存很快被耗尽,JVM 会频繁触发 GC 操作来回收内存。在 GC 过程中,应用程序的线程会被暂停,这会导致消息的处理中断,消费者无法及时接收和处理消息,从而影响系统的正常运行。
堆内存设置过大也并非好事。过大的堆内存会增加 GC 的停顿时间,因为 GC 需要扫描和处理更大的内存空间。长时间的 GC 停顿会使 ActiveMQ 在这段时间内无法响应消息的发送和接收请求,导致系统的响应延迟增加。如果堆内存设置过大,还可能导致系统启动时间变长,占用过多的系统资源。
内存泄漏是指程序中已经不再使用的对象占用的内存空间无法被及时释放,随着时间的推移,这些未释放的内存会不断累积,最终耗尽所有可用内存,导致系统崩溃。在 ActiveMQ 中,如果存在内存泄漏问题,会使得内存中的对象数量不断增加,内存使用率持续攀升。当内存被耗尽时,系统会触发 OOM 错误,ActiveMQ 服务将无法继续运行。
内存泄漏的原因通常是代码中存在对象的引用未被正确释放。在 ActiveMQ 的生产者或消费者代码中,如果存在对消息对象或其他资源的不当引用,即使这些对象已经不再使用,它们所占用的内存也无法被 GC 回收。一个生产者在发送消息后,没有及时释放对消息对象的引用,随着消息的不断发送,这些未释放的消息对象会占用越来越多的内存,最终导致内存泄漏。
相关文章:
ActiveMQ 生产环境问题排查与调优指南(一)
一、引言 在当今复杂的分布式系统架构中,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其丰富的特性、良好的稳定性和易用性,在众多企业的生产环境中占据了一席之地。它基于 JMS(…...
深入理解 JavaScript 中的 FileReader API:从理论到实践
文章目录 深入理解 JavaScript 中的 FileReader API:从理论到实践前言什么是 FileReader?核心特性 FileReader 的常用方法事件监听实际案例案例 1:读取文本文件内容案例 2:图片预览(Data URL)案例 3&#x…...
Google LLM prompt engineering(谷歌提示词工程指南)
文章目录 基本概念AI输出配置:调整AI的回答方式输出长度温度(Temperature)Top-K和Top-P 提示技术:让AI更好地理解你零样本提示(Zero-shot)少样本提示(Few-shot)系统提示(…...
前端npm包发布流程:从准备到上线的完整指南
无论是使用第三方库还是创建和分享自己的工具,npm都为我们提供了一个强大而便捷的平台,然而很多开发者在将自己的代码发布到npm上时往往面临各种困惑和挑战,本篇文章将从准备工作到发布上线,探讨如何让npm包更易发布及避免常见的坑…...
【MySQL】表空间结构 - 从何为表空间到段页详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
OB Cloud 云数据库V4.3:SQL +AI全新体验
OB Cloud 云数据库V4.3:SQL AI全新体验 简介 OB Cloud云数据库全新升级至V4.3版本,为用户带来了SQLAI的最新技术体验,强化数据库的传统功能,深度融合了人工智能技术,引入先进的向量检索功能和优化的SQL引擎,…...
【Linux系统】第四节—详解yum+vim
hello 我是云边有个稻草人 Linux—本节课所属专栏—欢迎订阅—持续更新中~ 目录 画板—本节课知识点详解 一、软件包管理器 1.1 什么是软件包 1.2 Linux软件⽣态 1.3 yum具体操作 【查看软件包】 【安装软件】 【卸载软件】 【注意事项】 1.4 安装源 二、vim 2.1 …...
Git的核心作用详解
一、版本控制与历史追溯 Git作为分布式版本控制系统,其核心作用是记录代码的每一次修改,形成完整的历史记录。通过快照机制,Git会保存每次提交时所有文件的完整状态(而非仅记录差异),确保开发者可以随时回…...
Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦!!谢谢大家!!! 在这篇博客中,我们将分析一个极其有趣和互动性的组件 - Experience.jsx,该组件用于在主页中呈现个人的工作经历。 这个组件…...
3D虚拟工厂vue3+three.js
1、在线体验 3D虚拟工厂在线体验 2、功能介绍 1. 全屏显示功能2. 镜头重置功能3. 企业概况信息模块4. 标签隐藏/显示功能5. 模型自动旋转功能6. 办公楼分层分解展示7. 白天/夜晚 切换8. 场景资源预加载功能9. 晴天/雨天/雾天10. 无人机视角模式11. 行人漫游视角模式12. 键盘…...
[Java实战]Spring Boot 解决跨域问题(十四)
[Java实战]Spring Boot 解决跨域问题(十四) 一、CORS 问题背景 什么是跨域问题? 当浏览器通过 JavaScript 发起跨域请求(不同协议、域名、端口)时,会触发同源策略限制,导致请求被拦截。 示例场…...
嵌入式硬件篇---CAN
文章目录 前言1. CAN协议基础1.1 物理层特性差分信号线终端电阻通信速率总线拓扑 1.2 帧类型1.3 数据帧格式 2. STM32F103RCT6的CAN硬件配置2.1 硬件连接2.2 CubeMX配置启用CAN1模式波特率引脚分配过滤器配置(可选) 3. HAL库代码实现3.1 CAN初始化3.2 发…...
(2025)图文解锁RAG从原理到代码实操,代码保证可运行
什么是RAG RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤: 数据预处理 加载:从不同格式(PDF、Markdown等)中提取文本分块:将长文本分割成短序列(通常100-500个标记),作为检索单元…...
TWAS、GWAS、FUSION
全基因组关联研究(GWAS,Genome-Wide Association Study)是一种统计学方法,用于在全基因组水平上识别与特定性状或疾病相关的遗传变异。虽然GWAS可以识别与性状相关的遗传信号,但它并不直接揭示这些遗传变异如何影响生物…...
大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比
文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调(Fine-tun…...
FHE 之 面向小白的引导(Bootstrapping)
1. 引言 FHE初学者和工程师常会讨论的一个问题是; “什么是引导(bootstrapping)?” 从理论角度看,这个问题的答案很简单: 引导就是套用 Gentry 提出的思想——在加密状态下同态地执行解密操作ÿ…...
安装:Kali2025+Docker
安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...
什么是深拷贝什么是浅拷贝,两者区别
什么是深拷贝什么是浅拷贝,两者区别 1.深拷贝 递归复制对象的所有层级,嵌套的引用类型属性,最后生成一个完全独立的新对象,与原对象无任何引用关联。 特点: 新对象和原对象的所有层级属性是独立的(修改…...
A2A大模型协议及Java示例
A2A大模型协议概述 1. 协议作用 A2A协议旨在解决以下问题: 数据交换:不同应用程序之间的数据格式可能不一致,A2A协议通过定义统一的接口和数据格式解决这一问题。模型调用:提供标准化的接口,使得外部应用可以轻松调…...
第七章 数据库编程
1 数据库编程基础 1.1 数据库系统概述 数据库系统是由数据库、数据库管理系统(DBMS)和应用程序组成的完整系统。其主要目的是高效地存储、管理和检索数据。现代数据库系统通常分为以下几类: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等&#x…...
电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
调色详情 电影感户外哑光人像自拍摄影 Lr 调色,是借助 Lightroom 软件,针对户外环境下拍摄的人像自拍进行后期处理。旨在模拟电影画面的氛围与质感,通过调色赋予照片独特的艺术气息。强调打造哑光效果,使画面色彩不过于浓烈刺眼&a…...
C++--类的构造函数与初始化列表差异
一,引言 在类中成员函数的构造函数担任其将对象初始化的作用,而初始化列表也有着相似的作用。大部分人建议都是初始化列表进行初始化,本文主要进行讲解二者的区别。 首先看一下构造函数的初始化方式: #define _CRT_SECURE_NO…...
深入浅出之STL源码分析4_类模版
1.引言 我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么&#x…...
Lambda表达式解读
本文通过具体案例演示函数式接口Function<T,R>的三种实现方式演变过程。 一、传统匿名内部类实现 Integer resInt1 t1(new Function<String, Integer>() {Overridepublic Integer apply(String s) {int i Integer.parseInt(s);return i;} });实现特点࿱…...
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)
文章目录 类简介方法总览关键说明示例代码 类简介 QMarginsF 用于定义四个浮点型边距(左、上、右、下),描述围绕矩形的边框尺寸。所有边距接近零时 isNull() 返回 True,支持运算符重载和数学运算。 方法总览 方法名/运算符参数返…...
Android方法耗时监控插件开发
需求:自定义一个Gradle插件,这个Gradle插件可以统计方法的耗时,并当方法耗时超过阈值时,可以通过打印Log日志在控制台,然后可以通过Log定位到耗时方法的位置,帮助我们找出耗时方法和当前线程名,…...
TWAS / FUSION
FUSION 是一套用于执行转录组范围和调控组范围关联研究(TWAS 和 RWAS)的工具。它通过构建功能/分子表型的遗传成分的预测模型,并使用 GWAS 汇总统计数据预测和测试该成分与疾病的关联,目标是识别 GWAS 表型与仅在参考数据中测量的…...
C++中的static_cast:类型转换的安全卫士
C中的static_cast:类型转换的安全卫士 在C编程中,类型转换是不可避免的操作,而static_cast作为C四大强制类型转换运算符之一,是最常用且相对安全的一种转换方式。今天我们就来深入探讨一下这个重要的类型转换工具。 一、static_…...
uniapp-商城-51-后台 商家信息(logo处理)
前面对页面基本进行了梳理和说明,特别是对验证规则进行了阐述,并对自定义规则的兼容性进行了特别补充,应该说是干货满满。不知道有没有小伙伴已经消化了。 下面我们继续前进,说说页面上的logo上传组件,主要就是uni-fil…...
04 mysql 修改端口和重置root密码
当我们过了一段时间,忘了自己当初创建的数据库密码和端口,或者端口被占用了,要怎么处理呢 首先,我们先停止mysql。 一、修改端口 打开my.ini文件,搜索port,默认是3306,根据你的需要修改为其他…...
多线程 2 - 死锁问题
死锁 死锁,是多线程代码中的一类经典问题。加锁能够解决线程安全问题,但如果加锁方式不当,就很可能产生死锁。 出现死锁的三种场景 1、一个线程一把锁 就像上篇文章讲过的,如果对同一个线程上了两把锁,而且上的锁是…...
网络原理(Java)
注:此博文为本人学习过程中的笔记 在网络初始中谈到TCP/IP五层模型,接下来我们将介绍这里面涉及到的网络协议。 应用层是程序员接触最多的层次,程序员写的代码只要涉及到网络通信都可以视为是应用层的一部分。应用层里的东西和程序员直接相…...
HDFS 常用基础命令详解——快速上手分布式文件系统
简介: 本文面向刚接触 Hadoop HDFS(Hadoop 分布式文件系统)的读者,结合 CSDN 博客风格,系统梳理最常用的 HDFS 客户端命令,并配以示例和注意事项,帮助你在开发和运维中快速掌握 HDFS 的文件管理…...
Unity Shaders and Effets Cookbook
目录 作者简介 审稿人简介 前言 我是偏偏 Unity Shaders and Effets Cookbook 第一章:Diffuse Shading - 漫反射着色器 第二章:Using Textures for Effects - 着色器纹理特效的应用 第三章:Making Your Game Shine with Specular - 镜…...
Markdown—LaTeX 数学公式
目录 一、字母1. 希腊大写字母2. 希腊小写字母3. 花体字母 二、上标和下标1. 上标2. 下标3. 其他 三、括号四、数学符号1. 基本数学符号1)运算符2)常见函数3)分式、根号、累加/乘4)极限5)积分 2. 三角函数与几何符号1&…...
AI 驱动的开发工具
🔧 主流 AI 前端开发工具 1. GitHub Copilot 由 GitHub 与 OpenAI 联合开发,集成在 Visual Studio Code、JetBrains 等主流 IDE 中,提供智能代码补全、函数生成等功能,极大地提高了开发效率。 (CSDN博客) 2. Cursor 一款 AI 驱…...
【入门】数字走向I
描述 输入整数N,输出相应方阵。 输入描述 一个整数N。( 0 < n < 10 ) 输出描述 一个方阵,每个数字的场宽为3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int i1;i<n*n;i){cout…...
Kubernetes生产实战(十三):灰度发布与蓝绿发布实战指南
在微服务架构中,如何安全高效地发布新版本是每个团队必须掌握的技能。本文将深入讲解Kubernetes中两种主流发布策略的落地实践,附带生产环境真实案例。 一、金丝雀发布(灰度发布):渐进式验证新版本 核心思想…...
数孪实战笔记(1)数字孪生的含义、应用及技术体系
一、含义 数字孪生(Digital Twin)是一种通过数字化模型在虚拟世界中实时映射和模拟物理实体、系统或过程的技术。它的核心目的是通过对现实对象的建模、感知、分析和预测,实现对物理世界的全面感知、智能控制和优化决策。数字孪生 实体对象 …...
深入浅出之STL源码分析5_类模版实例化与特化
在 C 中,类模板的实例化(Instantiation)和特化(Specialization) 是模板编程的核心概念,而 显式实例化(Explicit Instantiation)和隐式实例化(Implicit Insta…...
JDBC演进之路:从基础操作到高效连接池
文章目录 一、JDBC 1.0:手动管理的起点1.1 核心特点1.2 代码示例:1.3 痛点分析 二、JDBC 2.0:配置化的升级2.1 核心改进2.2 代码示例2.3 优势与不足 三、JDBC 3.0:连接池的革命3.1 核心改进3.2 代码示例3.3 核心优势 四、版本对比…...
远程调试---在电脑上devtools调试运行在手机上的应用
1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…...
街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)27
目录 0、Emeditor软件1、Place Pluse 2.0数据集2、街景主观感知大框架2.1 街景主观感知:自建数据集2.2 街景主观感知:两两对比程序2.3 街景主观感知:Trueskill评分2.4 街景主观感知:训练模型,Resnet或EfficientNet或V…...
进阶二:基于HC-SR04和LCD1602的超声波测距
一、实验目的 掌握HC-SR04超声波测距模块的工作原理和使用方法。学会使用LCD1602液晶显示屏显示测量数据。熟悉89C51单片机与外设的接口电路设计和编程方法。二、实验原理 1. HC-SR04超声波测距模块原理 HC-SR04超声波测距模块可提供2cm - 400cm的非接触式距离感测功能,测距精…...
单因子实验 方差分析
本文是实验设计与分析(第6版,Montgomery著傅珏生译)第3章单因子实验 方差分析python解决方案。本文尽量避免重复书中的理论,着于提供python解决方案,并与原书的运算结果进行对比。您可以从 下载实验设计与分析(第6版&a…...
《Python星球日记》 第53天:卷积神经网络(CNN)入门
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、图像表示与通道概念1. 数字图像的本质2. RGB颜色模型3. 图像预处理 二、卷积…...
基于人工智能的个性化 MySQL 学习路径推荐研究
基于人工智能的个性化 MySQL 学习路径推荐研究 摘要: 随着信息技术的飞速发展,数据库在各行业应用广泛,MySQL 作为主流数据库之一,学习需求庞大。然而,不同学习者在知识水平、学习进度和目标上存在差异,传统统一的学习路径难以满足个性化需求。本研究通过运用人工智能技…...
阿里云OSS-服务端加签直传说明/示例(SpringBoot)
目录 概述 OSS文件上传方式 1. OSS控制台上传 2. 客户端直传 3. 后端上传 4. 加签直传 服务端加签方式 1. 服务端生成PostObject所需的签名和Post Policy 2.服务端生成STS临时访问凭证 3. 服务端生成PutObject所需的签名URL 实现1:生成PostObject所需的签…...
《向上生长》读书笔记day5
哎,好像有点坚持不下去了,有点松懈了 不咋想继续写读书笔记😂,不过我不可能这么轻易放弃的,起码要做完这一本书,话不多说,开始进入的读书📒笔记 今天读了两个章节,穷人翻…...
优选算法——队列+BFS
目录 1. N叉树的层序遍历 2. 二叉树的锯齿层序遍历 3. 二叉树最大宽度 4. 在每个树行中找最大值 1. N叉树的层序遍历 题目链接:429. N 叉树的层序遍历 - 力扣(LeetCode) 题目展示: 题目分析: 层序遍历即可~仅…...