JMeter分布式压测五大核心故障点与RMI通信调优指南

news2026/5/23 19:01:34
1. 为什么分布式压测不是“多开几台JMeter就能搞定”的事很多人第一次接触Jmeter分布式压测脑子里浮现的画面是主控机上点一下“启动”十几台从机瞬间火力全开TPS哗哗往上飙监控曲线平滑漂亮——结果一跑起来不是报错连不上从机就是聚合报告里全是0再一看从机日志满屏java.net.ConnectException: Connection refused或者java.rmi.UnmarshalException。我带过三届测试团队每届都有至少两个人在“分布式”这道门槛上卡超过三天最后发现根本不是脚本写得不对而是连最基础的通信链路都没理清楚。Jmeter分布式压测的本质是一套基于RMIRemote Method Invocation的主从协同架构不是简单的“远程执行”。主控机Controller不生成任何请求流量它只做三件事下发测试计划.jmx文件、下发启动/停止指令、回收从机Agent执行后的.jtl结果数据。所有HTTP/SOAP/JDBC请求全部由从机本地JVM发起。这意味着网络通、端口开、权限对、时钟准、版本齐——五者缺一不可任何一个环节出问题整个链路就断在第一步。这个机制直接决定了它的脆弱性它不像K6或Gatling那样用HTTP长连接管理节点也不像Locust那样自带Web UI协调它依赖Java原生RMI而RMI又极度依赖主机名解析、防火墙策略、JVM安全策略和系统时间同步。所以你看到的“连接超时”90%以上不是网络物理不通而是RMI注册表Registry没起来、或者java.rmi.server.hostname没设对、又或者从机防火墙把1099RMI默认端口和随机端口RMI回调端口全拦了。关键词Jmeter分布式性能压测、RMI通信、端口映射、hostname配置、时钟同步。这篇文章不讲怎么写脚本、不讲怎么加监听器就死磕这五个硬骨头——因为只要它们稳了剩下的就是调参数的事而一旦它们崩了你调再好的线程组、再优的CSV数据都只是在本地空转。我建议所有刚上手的人先别急着跑业务接口用一个最简脚本比如单个HTTP GET请求到http://httpbin.org/get 两台干净虚拟机一台主、一台从把通信链路打通再说。这不是浪费时间是省下后面排查三天的日志翻查功夫。下面我们就从环境准备开始一层层剥开这个看似简单、实则暗坑密布的分布式架构。2. 环境准备阶段五步验证法绕过80%的“连不上”报错分布式压测失败绝大多数卡在环境初始化阶段。很多团队习惯性跳过验证步骤直接跑脚本结果报错信息五花八门让人无从下手。我总结了一套“五步验证法”每一步都对应一个核心故障点按顺序执行能快速定位是哪一环断了。这套方法我在三个不同客户现场实测有效平均排查时间从4小时压缩到25分钟以内。2.1 第一步确认主从JMeter版本与JDK版本严格一致这是最容易被忽略、但后果最严重的前提。Jmeter 5.4.1 和 5.4.3 虽然只差一个小版本号但内部RMI序列化协议可能有细微差异JDK 11 和 JDK 17 的安全管理器策略也完全不同。一旦主从版本不一致RMI反序列化会直接失败报错通常是java.io.InvalidClassException或ClassNotFoundException但错误堆栈藏得很深容易被误判为网络问题。提示不要只看jmeter -v输出的版本号要进到/bin目录下检查jmeter.properties里的jmeter.version字段以及/lib/ext目录下ApacheJMeter_core.jar的MANIFEST.MF文件双重确认。JDK版本则必须用java -version命令且确保JAVA_HOME环境变量指向同一路径。实操建议在从机上执行以下命令将输出结果与主控机逐行比对# 检查JMeter版本 jmeter -v | head -n 1 # 检查JDK版本注意必须用JAVA_HOME下的java $JAVA_HOME/bin/java -version # 检查JMeter核心jar包时间戳关键 ls -la $JMETER_HOME/lib/ext/ApacheJMeter_core.jar如果时间戳相差超过1分钟基本可以判定jar包不是同一构建产物。我曾遇到一个案例运维同事手动更新了从机的JMeter但忘了同步/lib/junit目录下的依赖jar导致RMI调用时org.apache.jorphan.collections.HashTree类加载失败——这个类在5.4.x中被重构过旧版jar里没有新方法签名。2.2 第二步验证主从机之间基础网络连通性与端口可达性RMI通信需要两个端口固定端口1099RMI Registry端口和一个随机端口RMI Server端口。很多人只开了1099却忘了随机端口——这是“能ping通但连不上”的头号元凶。验证方法分三层ICMP层ping 从机IP确认基础网络可达TCP层固定端口telnet 从机IP 1099或nc -zv 从机IP 1099确认Registry服务已监听TCP层随机端口这才是关键。JMeter从机启动时会在日志里打印类似Created remote object: UnicastRef [liveRef: [endpoint:[192.168.1.100:54321](local),objID:[-11f1a2b3c4d5e6f7:12345678:0]]]的信息其中54321就是实际使用的随机端口。你需要在主控机上执行nc -zv 从机IP 54321来验证该端口是否开放。注意这个随机端口每次重启JMeter都会变不能写死防火墙规则。正确做法是在从机jmeter-server启动脚本中强制指定RMI Server端口避免随机性。修改jmeter-server脚本Linux或jmeter-server.batWindows在java命令后添加-Djava.rmi.server.hostname从机真实IP \ -Dserver_port11000 \然后在防火墙中永久开放1099和11000两个端口。这样既可控又避免了端口扫描的麻烦。2.3 第三步验证hostname解析与java.rmi.server.hostname配置RMI的致命弱点在于它默认用InetAddress.getLocalHost().getHostName()获取主机名再用该主机名去反向DNS解析IP。如果从机的/etc/hosts里没有把本机IP映射到一个可解析的域名或者DNS服务器无法反向解析RMI注册表就会绑定到127.0.0.1或一个无效地址导致主控机连过去时实际连的是自己localhost。验证方法在从机上执行# 查看JMeter获取的hostname $JAVA_HOME/bin/java -cp $JMETER_HOME/lib/ext/ApacheJMeter_core.jar org.apache.jmeter.util.JMeterUtils getProp java.rmi.server.hostname # 查看系统hostname hostname # 查看hosts文件是否包含本机IP映射 cat /etc/hosts | grep $(hostname -I | awk {print $1})理想状态是java.rmi.server.hostname输出值 /etc/hosts中该IP对应的域名 hostname命令输出值且该域名能被主控机nslookup解析。实操技巧最稳妥的方案是跳过DNS全部用IP硬编码。在从机启动脚本中强制设置-Djava.rmi.server.hostname从机真实IP \ -Djava.rmi.registry.host从机真实IP \同时在主控机的jmeter.properties中设置remote_hosts从机真实IP:1099这样彻底绕过hostname解析环节是我在线上环境唯一允许的配置方式。2.4 第四步验证JVM安全策略与防火墙放行JDK 17 默认启用了更严格的安全策略会阻止RMI动态代码下载。如果你用的是JDK 17或更高版本从机启动时必须显式禁用该策略否则RMI连接会静默失败。验证方法查看从机jmeter-server.log搜索SecurityManager或AccessControlException。如果有相关报错说明安全策略拦截了。解决方案在从机jmeter-server脚本中添加JVM参数-Djava.security.managerallow \ -Djava.security.policy/dev/null \注意是双等号表示覆盖默认策略文件/dev/null是Linux写法Windows请用NUL。防火墙方面除了前面说的1099和11000端口还要确认从机防火墙是否放行了入站连接很多人只开了出站如果使用云服务器如阿里云、腾讯云安全组规则是否同时放行了1099和11000端口的TCP入方向主控机到从机的路由是否经过NAT设备NAT是否做了端口映射这种情况需在jmeter-server中额外配置-Djava.rmi.server.hostname为公网IP并在安全组中开放对应端口。2.5 第五步验证系统时间同步精度RMI通信中部分认证流程依赖时间戳。如果主从机时间偏差超过5分钟某些JDK版本会直接拒绝连接报错为java.security.cert.CertificateExpiredException即使你没用SSL。这个坑特别隐蔽因为Linux系统默认NTP同步可能不准。验证方法在主从机上分别执行date -R # 查看RFC2822格式时间 ntpq -p # 查看NTP同步状态要求两台机器输出的date -R结果秒级误差必须小于30秒。实操建议在所有压测节点上统一配置chrony服务指向同一个内网NTP服务器# /etc/chrony.conf server 192.168.1.1 iburst makestep 1.0 3然后重启服务systemctl restart chronyd。我坚持这条是因为去年一个金融客户压测时因时间偏差2分17秒导致所有从机在凌晨3点自动断连——他们用的是自签名证书有效期校验失败。这五步做完90%的“Connection refused”、“Cannot connect to server”类报错都会消失。记住分布式压测不是功能测试它对基础设施的要求比业务系统本身还苛刻。宁可花一小时把环境钉死也不要花三小时猜日志。3. 启动与运行阶段从日志里读出真相的四个关键信号环境验证通过后下一步是启动jmeter-server并观察日志。很多人以为只要看到Starting the JMeter Server...就万事大吉其实真正的战斗才刚开始。JMeter从机日志jmeter-server.log里藏着大量诊断线索读懂它比看监控图表更有价值。我归纳了四个最关键的日志信号每个信号背后都对应一类典型问题。3.1 信号一“Created remote object”行缺失或IP异常正常启动成功的日志末尾一定会有类似这样的两行Created remote object: UnicastRef [liveRef: [endpoint:[192.168.1.100:11000](local),objID:[-11f1a2b3c4d5e6f7:12345678:0]]] JMeterServer: Starting on port 1099第一行中的[192.168.1.100:11000]就是RMI Server实际绑定的IP和端口第二行说明Registry已监听1099。如果缺失第一行说明RMI Server创建失败常见原因java.rmi.server.hostname未设置或设置错误如设成了localhost指定的server_port如11000被其他进程占用JVM内存不足无法创建RMI对象-Xms和-Xmx太小。如果第一行IP显示为127.0.0.1或0.0.0.0说明hostname解析失败RMI Server绑定到了回环地址或所有接口主控机无法从外部访问。此时必须回溯到2.3节修正java.rmi.server.hostname。实操心得我习惯在从机启动后立刻用netstat -tuln | grep :11000确认端口监听状态。如果看到127.0.0.1:11000说明绑定错了如果看到*:11000说明绑定到了所有接口不安全但能连上只有192.168.1.100:11000才是理想状态。3.2 信号二“ERROR o.a.j.r.RmiUtils: Could not find rmi registry”反复出现这个错误意味着从机尝试连接自己的RMI Registry失败。它通常出现在两种场景从机启动时jmeter-server脚本里没有正确设置-Djava.rmi.registry.host导致它试图连接localhost:1099但Registry实际监听在真实IP:1099防火墙或SELinux阻止了本机对1099端口的loopback访问少见但CentOS 7默认开启SELinux时会发生。验证方法在从机上执行telnet 127.0.0.1 1099如果连不上说明Registry没监听localhost再执行telnet 真实IP 1099如果能连上说明Registry监听正常只是从机自身配置错了。解决方案在jmeter-server脚本中明确指定Registry host-Djava.rmi.registry.host从机真实IP \同时确保-Djava.rmi.server.hostname也设为同一IP。这两个参数必须一致否则RMI Server和Registry的地址视图不统一。3.3 信号三主控机“Remote engines started: 0”且无后续日志当你在主控机点击“Run → Remote Start → 从机IP”后控制台输出Remote engines started: 0且从机日志没有任何新内容说明指令根本没发出去。这不是从机问题而是主控机配置错误。核心原因只有一个主控机jmeter.properties中的remote_hosts配置项IP或端口格式错误。常见错误格式remote_hosts192.168.1.100缺少端口号默认是1099但有时会被忽略remote_hosts192.168.1.100:1099,192.168.1.101混用端口和无端口JMeter会整体解析失败remote_hosts192.168.1.100:1099, 192.168.1.101:1099IP间有空格逗号后不能有空格。正确格式必须是remote_hosts192.168.1.100:1099,192.168.1.101:1099且该配置必须在jmeter.properties文件中不能只在GUI界面里临时填写。因为GUI里填的remote_hosts只影响当前会话而jmeter-server启动时读取的是配置文件。提示修改jmeter.properties后必须重启JMeter GUI才能生效。很多人改完配置不重启一直以为是网络问题。3.4 信号四从机日志出现“java.lang.OutOfMemoryError: Java heap space”这是压测中后期最常见的崩溃信号。它不是启动失败而是运行中内存耗尽。JMeter从机的内存消耗有两大来源结果数据缓存和响应体保存。默认情况下JMeter会把每个请求的响应体Response Data完整缓存在内存里直到测试结束才写入.jtl文件。如果你的接口返回一个2MB的JSON线程数设为100那么仅响应体就占200MB内存再加上HashTree结构、监听器缓存、JVM自身开销很容易OOM。验证方法在从机jmeter-server.log中搜索OutOfMemoryError同时用jstat -gc pid实时监控GC情况。如果FGCFull GC次数频繁且heap usage长期95%就是内存瓶颈。根治方案有三关闭响应体保存在测试计划中右键线程组 → “Add → Listener → View Results Tree”选中它 → 取消勾选“Save Response Data”降低结果采样率在jmeter.properties中设置sample_result_save_threshold1000只保存响应时间1秒的样本增大JVM堆内存在jmeter-server脚本中调整-Xms和-Xmx例如-Xms4g -Xmx4g注意-Xms和-Xmx必须相等避免GC时动态扩容耗时。我推荐组合使用方案1和方案3。曾经一个电商项目从机配置32GB内存但因开启了View Results Tree的响应体保存1000并发就OOM关掉后同样配置跑到了5000并发。读懂这四个信号你就掌握了分布式压测的“听诊器”。它不靠猜不靠重启只靠日志里白纸黑字的线索。下次再遇到问题先打开jmeter-server.log按这四条信号扫一遍80%的问题当场定位。4. 数据回收与结果分析为什么你的聚合报告全是0三个被忽视的根源压测跑完了主控机上点“Save Response Data as…”导出.jtl文件兴冲冲打开Aggregate Report却发现Sample Count为0Average为090% Line为0——所有指标都是0。这不是脚本没跑而是结果数据根本没传回来。这个问题困扰了太多人他们反复检查脚本、检查监听器却忽略了数据传输链路上的三个关键断点。4.1 断点一.jtl文件未生成或为空主控机根本没收到数据JMeter分布式模式下从机不直接写.jtl文件到主控机磁盘而是通过RMI流式传输数据块。主控机收到数据后再统一写入本地.jtl文件。所以.jtl文件为空本质是数据流中断。根本原因有两个从机内存溢出OOM导致进程崩溃如3.4节所述OOM发生时JVM进程退出RMI连接断开未发送的数据永远丢失主控机磁盘空间不足或权限不足主控机在写.jtl时如果目标目录磁盘满了或JMeter进程没有写入权限会静默失败日志里只有一行WARN o.a.j.s.ResultCollector: Error writing results to file极易被忽略。验证方法在从机上检查jmeter-server.log末尾是否有OutOfMemoryError或java.lang.OutOfMemoryError在主控机上检查.jtl文件所在目录的磁盘使用率df -h和文件权限ls -ld dir最直接的方法在主控机启动JMeter时加上-l output.jtl参数强制指定输出路径并确保该路径可写。实操技巧我习惯在主控机上用tail -f jmeter.log实时监控主控日志。当点击“Remote Start”后正常流程应该看到类似INFO o.a.j.e.ClientJMeterEngine: sent test to 192.168.1.100:1099然后是INFO o.a.j.r.RmiUtils: Bound RMI registry on port 1099最后是INFO o.a.j.s.ResultCollector: Starting saving results to output.jtl。如果中间某一步卡住或报错就是断点所在。4.2 断点二时间戳错乱导致数据被丢弃JMeter主控机在合并多个从机的.jtl数据时依赖每个样本的timeStamp字段进行排序和聚合。这个timeStamp是从机本地生成的毫秒级时间戳。如果主从机时间不同步如2.5节所述或者从机系统时间在压测过程中被NTP突然校正跳变就会导致大量样本的timeStamp落在主控机当前时间窗口之外被ResultCollector主动丢弃。现象.jtl文件里有数据用head -n 10 output.jtl能看到XML或CSV格式的样本但Aggregate Report里Sample Count为0。验证方法用文本编辑器打开.jtl文件看前几行的timeStamp值。正常应是递增的毫秒数如1712345678901如果看到timeStamp0或极小的值如12345说明从机时间异常如果timeStamp值远大于主控机当前时间如主控机是1712345678901从机样本是1712345678901000说明从机时间被设成了微秒级罕见但某些嵌入式系统驱动会导致。解决方案严格同步主从机时间2.5节在jmeter.properties中设置time_correction_ms0禁用JMeter内置的时间校正逻辑它默认会尝试补偿网络延迟但反而容易出错压测前用date %s%3N命令在主从机上各执行一次确认毫秒级时间差100ms。4.3 断点三监听器配置冲突导致数据未采集很多人为了“看得清楚”在测试计划里加了多个监听器View Results Tree、Summary Report、Backend Listener对接InfluxDB、Simple Data Writer。但他们不知道JMeter的监听器是同步阻塞式采集的。当线程数很高如1000时View Results Tree这种重量级监听器会严重拖慢线程执行速度导致采样率暴跌而Simple Data Writer如果配置了“Write results to file”但文件路径不存在会抛出异常并中断整个结果收集链。现象压测过程中GUI界面卡顿CPU使用率飙升.jtl文件增长缓慢甚至停滞。验证方法在主控机JMeter GUI中打开“Options → Toggle Thread Group”查看各线程组的实际活动线程数。如果远低于设置值如设了1000实际只有200说明监听器拖慢了执行检查jmeter.log搜索ERROR或WARN重点关注o.a.j.l监听器包相关的报错。根治方案生产级压测禁用所有GUI监听器View Results Tree、View Results in Table、Graph Results一律删除。它们只适合调试不适合压测只保留轻量级结果写入器用Simple Data WriterCSV格式或Backend Listener对接时序数据库配置Simple Data Writer时务必勾选“Write headers”和“Save configuration”并确保目标目录存在且可写设置合理的采样率在jmeter.properties中sample_variables留空不记录自定义变量resultcollector.action_if_file_existsAppend追加模式避免覆盖。我见过最典型的案例一个团队在1000并发压测时保留了View Results Tree结果实际QPS只有设计值的1/5他们还以为是接口性能差花了两天优化代码最后发现删掉监听器QPS立刻翻倍。这三个断点每一个都足以让你的压测结果“看起来成功实则无效”。它们不体现在报错弹窗里而是以“0”这种最安静的方式告诉你数据丢了。所以压测结束后第一件事不是看TPS而是打开.jtl文件用wc -l数行数再用head看时间戳——这是结果可信度的第一道安检。5. 进阶避坑那些文档里不会写的实战经验与硬核技巧上面四章解决了90%的常见问题但真正上生产环境压测时还会遇到一些“文档里找不到答案、社区里搜不到解法”的边缘场景。这些坑往往源于JMeter源码级的行为、操作系统底层限制或是特定云环境的特殊策略。我把这些年踩过的、验证过的、能直接抄作业的硬核技巧浓缩成五个进阶避坑指南。5.1 技巧一解决“从机CPU跑满但TPS上不去”的线程饥饿问题现象从机top命令显示CPU使用率95%但JMeter GUI里Active Threads稳定在设定值TPS却远低于预期。用jstack pid看线程堆栈发现大量线程卡在java.net.SocketInputStream.socketRead0或org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer。根因不是CPU不够而是网络I/O线程被阻塞。JMeter默认使用HttpClient 4.x其连接池PoolingHttpClientConnectionManager的maxTotal和defaultMaxPerRoute默认值极低maxTotal20,defaultMaxPerRoute2。当并发线程数超过20后续线程只能排队等待连接造成CPU空转。验证方法在从机jmeter-server.log中搜索Connection pool shut down或Connection request timeout或用ss -s命令查看socket连接数如果total接近maxTotal值就是连接池瓶颈。解决方案在测试计划中为每个HTTP Sampler添加HTTP Request Defaults在Advanced标签页里设置Implementation:HttpClient4Connection Pool Size:200根据从机CPU核心数×10估算Max Connections per Route:100或者全局修改jmeter.propertieshttpclient4.max_total_connections200 httpclient4.max_per_route100重启从机生效。这个参数调优后我们一个4核从机的TPS从800提升到3200提升4倍。5.2 技巧二绕过“云服务器安全组无法开放随机端口”的终极方案公有云如AWS EC2、阿里云ECS的安全组规则只允许你开放指定端口范围无法开放“所有高端口”。而JMeter默认的RMI Server随机端口32768-65535恰恰落在这个范围导致你开了1099却连不上。常规方案是如2.2节所述强制指定server_port。但有些客户环境安全组策略极其严格连11000这种端口都要走审批流程耗时3天。我的替代方案用SSH隧道做端口映射完全绕过云平台的端口限制。操作步骤主控机执行# 将本地1099端口通过SSH隧道映射到从机的1099 ssh -L 1099:localhost:1099 -L 11000:localhost:11000 user从机公网IP -N -f # 然后在主控机jmeter.properties中remote_hosts设为 remote_hosts127.0.0.1:1099原理SSH隧道把主控机的127.0.0.1:1099请求加密转发到从机的localhost:1099RMI通信完全走SSH加密通道无需开放任何额外端口。我用这个方案在一个金融客户的等保三级环境中30分钟内完成了分布式部署。5.3 技巧三处理“超大CSV数据文件导致从机OOM”的内存映射方案当测试数据量极大如1000万行用户ID用CSV Data Set Config读取时JMeter会把整个文件加载到内存。从机即使有32GB内存也会因GC压力过大而崩溃。解决方案用__StringFromFile函数 文件分片。步骤将大CSV文件按行数切分成多个小文件如每10万行一个split -l 100000 users.csv users_part_在测试计划中用__StringFromFile(users_part_${__threadNum}.csv,,)函数读取${__threadNum}确保每个线程读不同文件设置CSV Data Set Config的Recycle on EOF?为FalseStop thread on EOF?为True。这样每个线程只加载自己那份10万行文件内存占用下降90%。我们压测一个千万级用户库时用此方案从机内存稳定在8GB以内。5.4 技巧四修复“高并发下JMeter GUI假死”的非GUI模式强制切换很多人习惯在GUI里点“Remote Start”但GUI本身是AWT/Swing应用高并发时事件队列堵塞界面卡死你以为压测挂了其实从机还在跑。正确姿势所有生产压测必须用非GUI模式-n。主控机执行jmeter -n \ -t /path/to/test.jmx \ -R 192.168.1.100:1099,192.168.1.101:1099 \ -l /path/to/result.jtl \ -e -o /path/to/report/参数说明-n: 非GUI模式无界面资源占用极低-R: 指定远程从机列表注意这里用逗号分隔不用空格-l: 指定结果文件-e -o: 自动生成HTML报告。这个命令会启动一个轻量级控制器全程无GUI不会卡死。我所有线上压测都用这个命令封装成Shell脚本一键执行。5.5 技巧五应对“压测中从机意外宕机”的优雅降级策略分布式压测最怕中途掉节点。JMeter默认行为是某个从机断连主控机会报错RemoteTest failed并停止整个测试。这导致你跑了2小时最后10分钟因一台从机宕机而前功尽弃。解决方案修改JMeter源码实现“容忍单点故障”。修改/src/core/src/main/java/org/apache/jmeter/engine/ClientJMeterEngine.java文件在runTest方法中找到rmiObj.runTest(testPlan);这一行将其包裹在try-catch中try { rmiObj.runTest(testPlan); } catch (RemoteException e) { log.warn(Remote engine {} failed, continuing with others, host, e); }然后重新编译JMetermvn clean package -DskipTests用新生成的jar包替换所有节点的ApacheJMeter_core.jar。效果当一台从机宕机主控机只打印WARN日志继续指挥其他从机运行。测试结束后.jtl文件里会缺少该从机的数据但整体不中断。这个改动已在我们三个长期项目中稳定运行18个月。这些技巧没有一条来自官方文档全部来自深夜排查日志、翻源码、抓网络包的真实战场。它们不保证“永远正确”但保证“在我压测过的环境里100%有效”。技术没有银弹只有适配具体场景的硬核解法。最后再分享一个小技巧每次压测前我都会在从机上运行一个守护脚本实时监控JMeter进程和端口#!/bin/bash while true; do if ! nc -z 127.0.0.1 11000; then echo $(date): RMI Server down! Restarting... /var/log/jmeter-monitor.log pkill -f jmeter-server nohup $JMETER_HOME/bin/jmeter-server /dev/null 21 fi sleep 10 done它不能解决所有问题但能让你少熬一个通宵。压测不是炫技是工程。稳才是最高级的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2638590.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…