JMeter分布式压测实战:突破单机瓶颈的原理与落地

news2026/5/22 7:38:55
1. 为什么单台JMeter跑不动你的压测任务你是不是也遇到过这样的场景在本地用JMeter跑一个5000并发的HTTP请求CPU直接飙到98%内存告急响应时间曲线像心电图一样乱跳结果还没导出JMeter自己先弹出了“OutOfMemoryError”——不是脚本写错了是机器扛不住了。这不是个别现象而是JMeter作为纯Java应用的天然边界它本质是个单进程多线程的负载生成器所有线程共享同一JVM堆内存、同一套网络栈、同一个GUI或CLI调度器。当线程数超过3000线程上下文切换开销、GC压力、Socket连接池争用、甚至JVM内部锁竞争都会让压测数据严重失真——你看到的TPS下降可能80%不是被测系统瓶颈而是JMeter自身资源耗尽导致的假衰减。我去年帮一家电商做大促前压测原始脚本模拟2万用户登录购物车提交本地跑起来连1000并发都卡顿。当时团队第一反应是“升级笔记本”换了32G内存i9处理器结果只是把崩溃点从2000推到3500依然无法逼近真实业务峰值。后来我们切到分布式模式用4台8核16G的云服务器非高配机轻松稳定支撑2.5万并发平均响应时间波动控制在±5%以内。关键不在于硬件堆砌而在于把“生成压力”的职责从单点拆解为协同网络每台机器只专注执行一部分线程彼此无状态、无依赖主控机只做任务分发和结果聚合。这就像让10个快递员各自负责一个片区送件远比让1个人骑着电动车满城跑效率高得多——分布式压测不是“更高级的单机压测”而是对压力生成范式的重构。这个案例的核心价值不在于教你敲几行命令而在于帮你建立三个底层认知第一JMeter分布式不是“可选功能”而是突破单机物理极限的必经路径第二它的通信机制RMI决定了网络延迟、防火墙策略、主机名解析会成为比脚本逻辑更致命的故障源第三结果聚合的时序对齐方式直接决定你能否准确识别“慢请求到底是服务端问题还是某台slave节点时钟漂移导致的误判”。接下来我会用一次真实落地的压测项目从环境准备、通信原理、脚本改造、结果校验四个维度带你把这套机制摸透。适合已经能写出基础JMX脚本、但卡在“并发上不去”或“结果不准”的中级测试/性能工程师也适合想理解分布式系统压力建模逻辑的开发同学。2. 分布式架构的本质RMI通信与主从协同机制JMeter分布式压测的骨架由一台Master主控机和若干台Slave执行机构成。但很多人误以为这是类似Kubernetes的容器编排其实完全不是——JMeter分布式没有中心化调度器没有服务发现没有自动扩缩容它本质上是一个基于Java RMIRemote Method Invocation的轻量级远程过程调用网络。Master不管理Slave生命周期不监控Slave健康状态它只做两件事把JMX脚本和测试数据CSV文件序列化后推送给各Slave然后监听Slave通过RMI回调返回的采样结果。Slave拿到脚本后完全独立启动自己的JVM进程执行执行完毕后主动把结果流式回传给Master。整个过程没有心跳检测没有重试机制也没有断线续传——这就是为什么网络抖动会导致结果缺失而Slave宕机Master根本不会报错只会安静地等它“永远不回来”。2.1 RMI通信的三大隐性门槛RMI看似简单实则暗藏三道必须跨过的坎90%的分布式失败都卡在这里第一道坎主机名解析必须双向可达RMI默认使用java.rmi.server.hostname参数指定对外暴露的IP。如果Slave配置的是localhost或127.0.0.1Master发起RMI调用时会尝试连接本地回环地址必然失败。正确做法是在每台Slave的jmeter.properties中显式设置# 必须填Slave机器对外可访问的真实IP非内网IP除非Master也在同内网 java.rmi.server.hostname172.16.10.25同时Master和所有Slave的/etc/hosts文件里必须互相映射对方的主机名和IP。比如Slave主机名为jmeter-slave-01IP为172.16.10.25那么Master的hosts文件里要加一行172.16.10.25 jmeter-slave-01。反向亦然。我曾见过团队因DNS服务器故障导致Master解析jmeter-slave-01超时整个压测卡在“Waiting for test to start”长达15分钟日志里却只有一行模糊的Connection refused。第二道坎RMI注册端口与数据传输端口必须放行RMI通信实际占用两个端口一个是固定的RMI Registry端口默认1099另一个是动态分配的数据传输端口范围默认1024-65535。很多运维同事只开了1099端口结果Slave启动后能注册成功但执行时Master收不到结果。解决方案有两个推荐方案在Slave的jmeter.properties中固定数据端口范围例如# 将动态端口锁定在50000-50010之间便于防火墙精确放行 server.rmi.localport50000 server.rmi.port50000备选方案在Slave启动命令中强制指定jmeter-server -Djava.rmi.server.hostname172.16.10.25 -Dserver.rmi.localport50000 -Dserver.rmi.port50000提示生产环境务必用-Dserver.rmi.localport而非-Dserver.rmi.port后者仅影响Registry端口前者才真正控制数据通道端口。第三道坎JVM安全策略与SSL配置冲突JMeter 5.0默认启用SSL RMI通信但若未配置证书Slave启动时会报java.rmi.ConnectException: Connection refused to host。最稳妥的解法是关闭SSL压测环境无需加密在Slave的jmeter.properties中添加# 彻底禁用RMI SSL避免证书配置复杂度 server.rmi.ssl.disabletrue同时确保Master的jmeter.properties中也有相同配置。这个参数必须两端一致否则Master用SSL连Slave用非SSL回握手直接失败。2.2 主从协同的时序真相为什么结果时间戳可能错乱很多人以为Master聚合结果时会自动根据各Slave上报的时间戳排序。错。JMeter Master收到结果后不做任何时间校准直接按接收顺序写入结果文件。这意味着如果Slave A的网络延迟是10msSlave B是50ms而B实际执行完成比A早1msMaster写入的顺序却是A的结果在前、B的结果在后——最终生成的.jtl文件里B的请求时间戳会显示比A晚49ms造成“B比A慢”的假象。我们曾因此误判过一次数据库慢查询监控显示某SQL平均耗时突增200ms但排查发现是其中一台Slave节点NTP服务异常时钟比其他节点快了180秒。该Slave上报的所有结果时间戳都比真实执行时间大180秒导致Master把这批“未来数据”全归到压测后期结论变成“服务越压越慢”。解决方法只有两个强制所有Slave开启NTP时间同步生产环境必须项# Ubuntu系统安装并启用NTP sudo apt-get install ntp sudo systemctl enable ntp sudo systemctl start ntp在Master端用--nongui模式启动时添加时间戳偏移补偿高级技巧jmeter -n -t test.jmx -r -l result.jtl -e -o report/ --jmeterproperty time.offset180000这个time.offset参数会将所有结果时间戳统一减去180秒但需提前知道偏移量适合已知时钟偏差的场景。3. 从单机脚本到分布式不可忽视的五处改造细节把本地能跑通的JMX脚本直接扔进分布式环境99%会失败。不是脚本逻辑有问题而是分布式引入了新的约束条件。以下是我在23个真实项目中总结出的必须改造的五个关键点漏掉任何一个轻则结果不准重则压测中断。3.1 CSV数据文件必须确保绝对路径与内容一致性单机模式下你可能习惯把CSV文件放在JMX同目录用相对路径引用data/users.csv。但在分布式环境下Master只把JMX文件和CSV文件本身推送到Slave不会推送CSV所在目录的其他文件。如果CSV里有图片引用、或依赖同目录的配置文件Slave执行时必然报FileNotFoundException。更隐蔽的问题是数据分片逻辑。JMeter默认的CSV Data Set Config组件在分布式模式下每个Slave会独立读取整个CSV文件导致所有Slave重复使用同一组用户数据。比如你有1000行用户数据4台Slave每台都会循环读这1000行实际并发用户数不是4000而是1000因为用户ID重复。正确解法是启用Sharing Mode在CSV Data Set Config中将Sharing mode改为All threads默认→Current thread group→ 或更精准的All threads in current thread group on this machine但最可靠的方式是预分片用Python脚本把users.csv按Slave数量拆成users_01.csv、users_02.csv…然后在JMX中用${__P(slave_id)}动态拼接文件名# users_01.csv内容Slave 1使用 user_id,token 1001,abc123 1002,def456 ...!-- JMX中CSV组件配置 -- stringProp namefilenameusers_${__P(slave_id)}.csv/stringProp启动时在Master端指定jmeter -n -t test.jmx -r -l result.jtl -Gslave_id01这样每台Slave只读自己的数据分片用户ID全局唯一真实模拟海量用户行为。3.2 计数器与随机函数避免全局ID冲突单机脚本常用__counter()生成递增ID或__RandomString()生成随机码。但在分布式下所有Slave的计数器从1开始独立计数必然产生大量重复ID。比如支付订单号生成逻辑// 错误写法每个Slave都从1开始计数 order_id: ORD${__counter(TRUE,)}${__time(yyyyMMddHHmmss,)}结果4台Slave同时生成ORD120231015142233下游系统直接报“订单号重复”。解决方案是用Slave ID做前缀隔离// 正确写法将slave_id注入到变量中 order_id: ORD${__P(slave_id)}${__counter(TRUE,)}${__time(yyyyMMddHHmmss,)}这样Slave 01生成ORD01120231015142233Slave 02生成ORD02120231015142233彻底规避冲突。同理__RandomString()生成的验证码、Token等也建议加上slave_id前缀增强唯一性。3.3 响应断言与JSON提取器警惕跨线程数据污染JMeter的JSON Extractor默认作用域是“当前线程”但在分布式下如果多个线程组共用同一份JMX且某个线程组的JSON Extractor提取了access_token存入JMeter属性props.put(token, value)其他线程组可能误读到错误的token值。这是因为JMeter属性props是JVM级别共享的而每个Slave只有一个JVM。解决方案是强制使用线程局部变量将JSON Extractor的“Reference Name”设为token_${__threadNum}在后续请求中用${token_1}、${token_2}引用确保每个线程独占自己的token或改用vars.put(token, value)vars是线程级变量避免props的跨线程污染注意vars变量不能跨线程组传递如需跨线程组共享必须用props但此时必须加slave_id前缀props.put(token_ props.get(slave_id), value)3.4 定时器与思考时间分布式下的节奏失真单机模式下Constant Timer设置500ms意味着每个线程每请求间隔500ms。但分布式后如果4台Slave各跑1000线程总并发是4000但每台Slave的1000线程仍按500ms间隔执行实际请求洪峰会呈现“四波脉冲”而非平滑流量。这对测试缓存击穿、限流熔断等场景极为不利。正确做法是用Uniform Random Timer替代设置Random Delay Maximum为1000msConstant Delay Offset为0这样每个线程的思考时间在0~1000ms间随机4000线程叠加后整体请求分布更接近泊松过程符合真实用户行为模型。3.5 监控指标采集如何让结果文件真正反映分布式实情单机.jtl文件里elapsed字段是请求耗时latency是网络延迟connect是TCP建连时间。但在分布式下这些值都来自Slave本地时钟而Slave的JVM GC停顿、磁盘IO等待、甚至CPU频率调节都会污染elapsed值。我们曾发现某次压测中elapsed平均值突然升高300ms排查后发现是其中一台Slave触发了Full GCSTWStop-The-World长达280ms所有请求耗时都被拉长。此时单纯看elapsed会误判服务端性能退化。真正的解法是双维度监控Slave维度在每台Slave上部署jstat实时监控GC# 每5秒输出一次GC统计 jstat -gc pid 5s服务端维度用Arthas或Prometheus抓取服务端真实的处理耗时排除网络和客户端干扰然后对比两者差值若Slave elapsed - 服务端耗时 200ms且jstat显示GC频繁则问题在Slave资源而非服务端。这个思路比盲目优化脚本有效十倍。4. 实战压测全流程从环境搭建到结果可信度验证现在我们以一个真实电商登录接口压测为例完整走一遍分布式落地流程。目标模拟2万用户在5分钟内完成登录验证认证服务在峰值下的稳定性。环境配置1台Master8核16G4台Slave均为4核8G云服务器CentOS 7.6。4.1 环境准备三步封顶式检查清单在启动任何JMeter命令前必须完成以下三步检查缺一不可第一步网络连通性白名单在所有Slave上执行# 检查Master能否telnet到Slave的1099和50000端口 telnet 172.16.10.25 1099 telnet 172.16.10.25 50000 # 检查Slave能否反向telnet到Master的1099端口RMI回调必需 telnet 172.16.10.10 1099注意这里172.16.10.10是Master IP172.16.10.25是Slave IP。很多团队只测正向忽略反向导致Slave能注册但无法回传结果。第二步JDK与JMeter版本强一致所有节点MasterSlave必须使用完全相同的JDK版本和JMeter版本。我们曾因Master用JDK 11.0.15Slave用11.0.16导致RMI序列化失败报java.io.InvalidClassException。验证命令# 所有节点执行 java -version jmeter -v # 输出必须一字不差包括build号JMeter官方明确要求Master和Slave的JMeter版本差异不能超过小版本号如5.4.1和5.4.3可5.4和5.5不可。第三步Slave资源预热与基线测试在每台Slave上先运行一个极简脚本仅1个HTTP请求100线程持续1分钟观察top命令中%CPU是否稳定在70%以下超过80%说明CPU已饱和free -h中available内存是否大于2G低于1G易触发OOMiostat -x 1中%util是否低于60%高于80%说明磁盘IO成瓶颈这一步能提前发现硬件配置不足的Slave避免压测中途掉队。我们曾用此法筛出一台SSD老化、%util常年95%的Slave替换后整场压测稳定性提升40%。4.2 脚本改造与启动带参数的标准化命令链基于前述改造原则我们的登录脚本login.jmx已完成CSV数据分片为users_01.csv~users_04.csv所有__counter()函数添加slave_id前缀JSON Extractor使用线程局部变量定时器替换为Uniform Random Timer0~1000ms启动流程如下Step 1在所有Slave上后台启动jmeter-server# 进入JMeter bin目录 cd /opt/jmeter/bin # 启动Server指定IP和端口 nohup ./jmeter-server -Djava.rmi.server.hostname172.16.10.25 -Dserver.rmi.localport50000 -Dserver.rmi.port50000 -Dserver.rmi.ssl.disabletrue /dev/null 21 Step 2在Master上执行分布式压测# 关键参数说明 # -r : 运行所有remote servers自动读取jmeter.properties中的remote_hosts # -G : 设置全局属性所有Slave共享 # -R : 指定remote hosts列表覆盖jmeter.properties jmeter -n -t login.jmx -r -l login_result.jtl -e -o login_report/ \ -Gslave_id01 -R172.16.10.25,172.16.10.26,172.16.10.27,172.16.10.28 \ -Dserver.rmi.ssl.disabletrue注意-R参数中的IP列表必须与Slave实际IP完全一致且用英文逗号分隔不能有空格。曾经有同事写了-R172.16.10.25, 172.16.10.26逗号后有空格导致第二台Slave始终无法连接。4.3 结果可信度验证三重交叉校验法压测结束后不要急着看HTML报告。先用以下三重校验法确认结果是否真实可信校验一Slave执行日志完整性进入每台Slave的/opt/jmeter/bin/jmeter-server.log搜索关键词# 应该看到类似日志表明脚本已加载并开始执行 INFO o.a.j.e.DistributedRunner: Starting remote engines INFO o.a.j.e.StandardJMeterEngine: Running the test! # 检查是否有ERROR或WARN grep -i error\|warn jmeter-server.log | grep -v WARN o.a.j.u.JMeterUtils: Setting Locale to如果某台Slave日志中没有Running the test!或存在java.net.ConnectException说明该节点未参与压测结果需剔除。校验二结果文件行数与预期并发匹配用wc -l login_result.jtl查看总请求数。理论值 Slave数量 × 单台线程数 × 循环次数。例如4台Slave × 500线程 × 10次循环 20000行。如果实际只有18500行说明有1500次请求因网络超时丢失此时TPS数据不可信必须重跑。校验三响应时间分布合理性打开HTML报告中的Response Time Percentiles图表重点看90%和95%线若90%线蓝色与95%线橙色间距过大如90%为200ms95%为1200ms说明存在少量超长尾请求需检查是否为网络抖动或Slave GC导致若所有百分位线都呈阶梯状突变如50%~80%线平缓85%线突然跳升大概率是某台Slave时钟漂移需结合NTP日志确认。我们曾用此法发现一台Slave的NTP服务被防火墙拦截时钟每天快12秒导致其上报的95%响应时间虚高300ms剔除该节点数据后整体P95从850ms修正为520ms这才是真实的服务能力。4.4 故障排查黄金路径从报错日志反推根因分布式压测最常见的5类报错及其精准定位路径报错现象日志关键词根因定位路径解决方案Master卡在Waiting for test to startRemoteTest.java:132① 检查Slavejmeter-server.log是否有Created remote object②telnet测试Master到Slave 1099端口③ 查/etc/hosts双向解析确保java.rmi.server.hostname正确hosts文件双向映射Slave启动报Connection refusedRemoteClientImpl.java:120①ps aux | grep jmeter确认jmeter-server进程是否存在②netstat -tuln | grep 1099确认端口监听③journalctl -u firewalld查防火墙日志开放1099和50000端口关闭firewalld或添加规则结果文件中大量Non HTTP response message: Read timed outHttpClient4Impl.java:720①jstat -gc pid查Slave GC频率②dmesg | tail查OOM Killer日志③iostat -x 1查磁盘util降低单台Slave线程数或升级Slave内存/磁盘HTML报告中Samples总数远小于预期DistributedRunner.java:215①wc -l result.jtl确认文件行数② 检查Slave日志中Shutting down时间点③ 对比各Slave的result.jtl行数差异若某台Slave行数极少检查其网络延迟和CPU负载响应时间曲线出现周期性尖峰StandardJMeterEngine.java:450①sar -u 1 60查CPU使用率周期②sar -b 1 60查磁盘IO周期③cat /proc/sys/vm/swappiness查交换分区启用状态关闭swapsudo swapoff -a调整swappiness1经验之谈每次压测前我都会在Master上运行一个check-distributed.sh脚本自动执行上述5类检查的前3步并生成检查报告。脚本核心逻辑就是telnet、jstat、wc -l的组合10分钟就能扫清90%的环境隐患。5. 高阶实战技巧让分布式压测真正服务于业务决策做到上面四步你已经能稳定跑通分布式压测。但真正的价值不在于“跑起来”而在于“跑得明白”。以下是我在多个大型项目中沉淀的三个高阶技巧它们不改变JMeter基本操作却能极大提升压测结果对业务的解释力。5.1 动态权重分配模拟真实流量分层真实业务中不同用户群体的请求权重不同VIP用户占比5%但贡献30%的订单新用户占比40%但平均停留时长只有老用户的1/3。单靠调整线程数无法精准建模。我们的解法是在JMX中嵌入权重路由逻辑用JSR223 PreProcessorGroovy生成随机权重// 根据用户类型分配不同概率 def weightMap [vip:0.05, gold:0.15, silver:0.30, new:0.50] def rand Math.random() def cumulative 0.0 def userType weightMap.each { k, v - cumulative v if (rand cumulative) { userType k return } } vars.put(user_type, userType)在HTTP请求中用${user_type}动态拼接URL或Header例如GET /api/login?level${user_type} HTTP/1.1同时在CSV数据文件中为不同user_type准备差异化数据如VIP用户token有效期更长新用户需短信验证码。这样4台Slave共同执行时整体流量分布严格符合预设权重压测结论可直接对应到运营策略调整。5.2 失败请求智能归因区分服务端错误与客户端超时JMeter默认把所有超时、连接拒绝都记为KO但KO背后原因天差地别服务端503错误需扩容客户端超时可能是网络丢包。我们在JSR223 PostProcessor中加入归因逻辑if (prev.isSuccessful() false) { def responseCode prev.getResponseCode() def responseMessage prev.getResponseMessage() if (responseCode Non HTTP response code: java.net.SocketTimeoutException) { vars.put(failure_type, CLIENT_TIMEOUT) } else if (responseCode.startsWith(5)) { vars.put(failure_type, SERVER_ERROR) } else if (responseCode.startsWith(4)) { vars.put(failure_type, CLIENT_ERROR) } else { vars.put(failure_type, UNKNOWN) } }然后在结果文件中用Backend Listener将failure_type写入InfluxDB最终在Grafana中绘制failure_type分布饼图。某次压测中我们发现87%的KO是CLIENT_TIMEOUT进一步排查发现是SLB负载均衡器连接数限制而非后端服务问题——这个发现直接避免了一次错误的扩容决策。5.3 压测即监控构建端到端可观测性闭环最高阶的实践是把压测过程本身变成监控数据源。我们在Master端部署了一个轻量级代理服务拦截所有发往Slave的RMI调用在jmeter-server启动时注入Java Agent# 启动命令增加Agent参数 ./jmeter-server -javaagent:/opt/agent/trace-agent.jarreporterinfluxdb,host172.16.10.30,port8086 ...该Agent自动采集每台Slave的JVM内存使用率、GC次数、线程数RMI调用耗时Master到Slave的网络延迟每个HTTP请求的客户端耗时分解DNS、Connect、SSL、Send、Wait、Receive这些数据实时写入InfluxDB与服务端Prometheus指标、前端Sentry错误日志在Grafana中构建统一仪表盘。当压测中TPS骤降时我们不再需要人工排查“是服务端崩了还是Slave挂了还是网络断了”而是直接看仪表盘若Slave JVM Heap Used突增至95%且GC Count飙升 → 问题在Slave资源若RMI Latency从5ms跳到200ms → 问题在网络层若Service P95 Latency同步飙升 → 问题在服务端这种端到端可观测性让压测从“事后分析”升级为“实时诊断”这才是性能工程的终极形态。最后分享一个小技巧每次压测结束后我都会用jmeter -g result.jtl -o report/生成HTML报告但绝不直接发给开发。而是先把报告里的Errors表格导出为CSV用Python脚本统计错误码分布再把高频错误码如503 Service Unavailable对应的请求路径、错误消息单独截图标注附上一句“这三个接口在2万并发下错误率超15%建议优先排查”。这样一份报告比10页技术文档更有推动力。压测的价值从来不在工具本身而在于你如何用它讲清楚业务问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2634074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

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> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…