当前位置: 首页 > news >正文

LoadRunner性能测试实战:从脚本开发到瓶颈定位的完整指南

1. 项目概述:从“跑起来”到“跑得好”的性能工程实践

在软件交付的冲刺阶段,最让测试和开发团队头疼的,往往不是功能缺陷,而是那些“平时好好的,一上线就崩”的性能问题。我见过太多项目,功能测试全绿,一到压测环节,响应时间飙升、错误率激增,整个团队陷入救火状态。性能测试与调优,本质上是一场与系统承载极限的对话,而LoadRunner正是这场对话中最经典、最强大的“翻译官”和“压力施加器”。它不仅仅是一个录制脚本、回放请求的工具,更是一套完整的性能工程方法论载体。基于LoadRunner的性能分析与调优,目标明确:通过模拟真实用户行为,对系统施加可控压力,精准定位瓶颈,并提供数据驱动的优化方案,最终确保系统在预期负载下稳定、高效运行。无论你是刚接触性能测试的新手,还是希望深化调优经验的老兵,这套从压力构造到根因分析,再到验证闭环的完整流程,都是构建高可用性系统的必备技能。

2. 性能工程核心思路:从监控到优化的闭环

性能调优不是漫无目的的“猜谜游戏”,而是一个基于数据的、严谨的推理和验证过程。一个高效的性能工程闭环,通常包含以下几个核心阶段。

2.1 明确性能目标与测试策略

在打开LoadRunner之前,必须想清楚:我们为什么要做这次性能测试?目标是什么?没有明确目标的性能测试,就像没有终点的赛跑,结果毫无意义。

核心目标通常包括:

  • 基准测试:确定系统在无压力或单用户情况下的性能表现,作为后续测试的对比基线。
  • 负载测试:验证系统在预期正常负载(如日均并发用户数)下的表现,确保响应时间和成功率达标。
  • 压力测试:探索系统的性能极限,找到最大吞吐量和并发用户数,以及系统崩溃的临界点。
  • 稳定性测试(耐力测试):在一定的压力下,长时间运行(如8小时、24小时),检查系统是否存在内存泄漏、资源耗尽等问题。

制定测试策略的关键输入:

  1. 业务指标:最重要的输入。需要与产品、运营团队沟通,明确关键业务场景(如登录、下单、支付)的预期性能指标。例如:“95%的用户登录响应时间需小于2秒”,“在500用户并发下单时,事务成功率需大于99.9%”。
  2. 系统架构图:了解被测系统的技术栈(如Nginx + Tomcat + MySQL + Redis),明确压力入口(通常是Web服务器或API网关)。
  3. 生产数据:如果可能,获取生产环境的日志,分析真实用户的访问模式、高峰时段、典型业务比例(如浏览:下单 ≈ 10:1)。这是设计最贴近真实场景测试脚本的基础。

注意:切忌拍脑袋定目标。一个常见的误区是直接要求“支持10000并发”。这个“并发”可能指每秒请求数(RPS),也可能指在线用户数(Vuser),两者差异巨大。必须将其转化为LoadRunner可执行、可衡量的脚本和场景设计。

2.2 LoadRunner在闭环中的角色定位

理解了目标,我们再看LoadRunner如何融入这个闭环:

  • 脚本开发(Virtual User Generator):将业务场景转化为可重复执行、可参数化、可关联的自动化脚本。这是模拟用户行为的“剧本”。
  • 场景设计与执行(Controller):这是性能测试的“导演台”。在这里,你定义有多少“演员”(虚拟用户)以何种节奏(加压策略)执行“剧本”,并指定从哪些“位置”(负载生成器)发起压力。
  • 监控与数据收集(Controller + 被监控服务器):在场景执行的同时,LoadRunner通过代理或协议,从服务器(如Windows性能计数器、Linux的/proc信息、应用服务器的JMX)实时收集CPU、内存、磁盘I/O、网络、应用队列长度等关键资源指标。
  • 结果分析与问题定位(Analysis):测试结束后,这是“破案”的关键环节。Analysis工具将性能计数器数据与事务响应时间、吞吐量等数据在时间轴上对齐、合并、分析。通过图表关联(Correlate),你可以直观地看到“当数据库服务器CPU使用率达到80%时,下单事务的响应时间从200ms陡增至2000ms”,从而建立现象与根因的关联。

这个闭环的终点不是生成一份报告,而是基于分析结果,提出并验证优化建议,然后再次测试,确认优化是否生效。如此迭代,直到达到性能目标。

3. 脚本开发:打造逼真的“虚拟用户”

脚本是性能测试的基石。一个粗糙、不真实的脚本,会导致测试结果失真,甚至误导调优方向。LoadRunner VUG(Virtual User Generator)的核心任务,就是录制并优化出能够高度模拟真实用户行为的脚本。

3.1 协议选择与录制技巧

LoadRunner支持上百种协议,选对协议是第一步。对于当今主流的Web和API应用,HTTP/HTMLWeb - HTTP/HTML协议是最常用的。对于更底层的Socket通信或特定中间件,可能需要选择WebSocketJava over HTTPODBC等。

录制关键步骤与技巧:

  1. 浏览器与录制配置:建议使用LoadRunner内置的浏览器或指定干净的浏览器进行录制,避免插件干扰。在开始录制前,在VUG中设置好录制选项,如将非HTML资源(如JS、CSS、图片)的请求设置为“仅录制”而非“回放”,以提升脚本效率和专注业务逻辑。
  2. 操作流程录制:像真实用户一样,完整地走一遍待测试的业务流程(如:打开首页 -> 登录 -> 搜索商品 -> 加入购物车 -> 下单 -> 登出)。LoadRunner会捕获所有HTTP请求。
  3. 脚本生成与初步优化:录制结束后,你会得到一个包含大量web_urlweb_submit_data等函数的脚本。第一步优化是删除不必要的请求。通常,静态资源(图片、样式表、脚本文件)的加载对服务器压力很小,且可以被浏览器缓存。在脚本中,可以将这些请求注释掉或删除,让脚本聚焦于动态的、消耗服务器资源的业务请求(如API调用、表单提交)。

3.2 脚本增强:参数化、关联与检查点

一个直接回放的录制脚本是“死”的,所有用户行为一模一样。为了让虚拟用户更“活”,必须进行脚本增强。

1. 参数化(Parameterization):这是模拟不同用户输入的核心。例如,登录用户名和密码不能所有用户都用同一个。

  • 操作:在脚本中选中一个常量值(如用户名“testuser”),右键选择“Replace with a Parameter”。
  • 数据源:可以创建.dat文件,每行存储一组数据(如user1,pass1;user2,pass2)。在参数属性中,设置取值方式为“Unique”(唯一)或“Sequential”(顺序),确保虚拟用户能取到不同的值。
  • 实战心得:对于需要唯一性约束的数据(如注册邮箱、订单号),务必使用唯一取值方式,并设置足够大的数据池,防止因数据重复导致业务逻辑失败。我曾遇到一个测试,因为只准备了100组账号,却用500个用户循环登录,导致大量用户因“账号已登录”而失败,测试结果完全失真。

2. 关联(Correlation):动态值处理是性能测试脚本的难点和重点。服务器返回的会话ID(如JSESSIONID)、令牌(Token)、防重提交的随机值等,每次请求都可能变化,必须在后续请求中回传。

  • 自动关联:LoadRunner提供自动关联功能,可以扫描脚本,找出可能需要进行关联的动态值。但自动关联并非万能,有时会漏关联或错关联。
  • 手动关联(必备技能):更可靠的方式是手动关联。方法是:对比录制时和回放时服务器响应的差异,找到那个变化的、且对后续请求有影响的字符串。使用web_reg_save_param_ex(或类似函数)在收到响应的代码前注册一个“边界提取器”,将这个动态值捕获到一个参数中。然后在后续需要用到该值的请求中,用这个参数(如{CorrelationParameter})替换原来的硬编码值。
  • 排查技巧:如果回放脚本时遇到错误,首先检查日志中服务器返回的响应内容,并与录制时的响应做对比,动态值不匹配是首要怀疑对象。

3. 检查点(Checkpoint):用于验证业务逻辑是否正确执行,而不仅仅是服务器返回了HTTP 200状态码。例如,登录成功后,页面会显示“欢迎,[用户名]”。

  • 操作:使用web_reg_findweb_find函数(后者需要开启内容检查选项),在页面响应中搜索特定的文本字符串。
  • 作用:如果检查点失败,LoadRunner会将该事务标记为失败,并在结果中明确体现。这能有效区分“网络请求成功”和“业务逻辑成功”,对于性能调优中分析错误原因至关重要。

一个经过良好参数化、关联和添加了检查点的脚本,才是一个健壮的、可用于正式压测的脚本。

4. 场景设计与执行:施加精准的压力

脚本准备好后,需要在Controller中设计场景,定义“如何施压”。这是将性能目标转化为具体行动方案的一步。

4.1 场景类型与负载生成器管理

LoadRunner支持两种主要场景类型:

  • 面向目标的场景:你设定一个目标(如每秒事务数、响应时间),LoadRunner自动调整虚拟用户数来尝试达到该目标。适用于探索性测试。
  • 手动场景:更常用,也更灵活。你可以完全控制虚拟用户的行为。我们需要重点设计这里的加压策略。

负载生成器(Load Generator)管理:如果你的测试需要模拟大量并发用户,单台机器可能无法生成足够压力或成为瓶颈。这时需要配置多台负载生成器。在Controller中,添加这些机器的IP,并确保LoadRunner Agent进程在这些机器上正常运行且网络互通。压力会被分布式地施加,Controller负责集中控制和收集数据。

4.2 加压策略设计:模拟真实的用户行为模型

虚拟用户(Vuser)不是同时启动,同时做同样的事情。一个真实的加压策略需要考虑:

  1. 渐进加压(Ramp Up):设置一个“逐步启动”时间,例如在10分钟内启动1000个用户。这避免了给系统带来瞬时巨大冲击,更符合实际情况,也便于观察系统性能随负载增加的变化曲线。
  2. 持续运行时间(Duration):用户全部启动后,保持压力运行一段时间(如30分钟)。这是测试系统稳定性的关键阶段,可以观察内存使用是否持续增长、响应时间是否平稳。
  3. 渐进减压(Ramp Down):压力测试结束时,让用户逐步退出,而不是瞬间停止。这有助于系统平稳释放资源,也便于观察恢复过程。
  4. 思考时间(Think Time)与步调(Pacing):这是模拟用户真实操作间隔的关键。录制脚本时,用户操作间的等待时间会被记录为思考时间。在场景中,可以设置“忽略思考时间”来测试系统极限吞吐,但更真实的测试是“按录制回放”或设置一个随机范围的思考时间(如3-8秒)。步调则控制一个用户执行完一遍脚本后,隔多久开始下一遍。

一个典型的手动场景设计示例:

  • 计划:模拟高峰时段500用户并发登录、浏览、下单的场景。
  • 脚本组:创建三个脚本组:“登录浏览”、“核心下单”、“混合场景”,并分配不同的虚拟用户数量比例(如 300:100:100)。
  • 加压计划:
    • “登录浏览”组:15分钟内启动300个用户,持续运行30分钟。
    • “核心下单”组:5分钟内启动100个用户,持续运行20分钟(模拟下单高峰)。
    • “混合场景”组:10分钟内启动100个用户,持续运行25分钟。
  • 全局设置:启用随机思考时间(50%-150%的录制值),设置迭代间隔(步调)为30-60秒随机。

这样的设计,比简单设置“500用户同时运行”要真实得多,得到的数据也更有参考价值。

5. 深度监控与瓶颈定位分析

场景执行过程中和结束后,真正的挑战开始了:从海量数据中找出系统瓶颈。LoadRunner Analysis提供了强大的图表化分析能力,但需要正确的分析思路。

5.1 核心性能指标解读

首先,要明确关注哪些核心指标,并理解其含义:

  • 事务响应时间:这是用户体验的直接体现。重点关注平均响应时间、90百分位或95百分位响应时间(表示90%或95%的用户体验在这个时间以内)。后者更能反映长尾延迟。
  • 每秒事务数(TPS):系统处理能力的核心指标。TPS上不去或随着压力增加而下降,是典型瓶颈信号。
  • 虚拟用户数:正在运行、成功、失败的虚拟用户数量。
  • 每秒点击率:反映客户端向服务器发送请求的频率。
  • 吞吐量:服务器每秒接收和发送的数据量(字节)。
  • 错误率:HTTP错误(4xx, 5xx)或业务检查点失败的比例。即使TPS很高,但错误率也高,系统也是不可用的。

5.2 关联分析:建立现象与根因的桥梁

孤立地看任何一个指标都没有意义。Analysis最强大的功能是关联(Merge Graphs)和叠加(Overlay Graphs)图表

经典瓶颈定位流程:

  1. 观察现象:在“事务响应时间”图表中,你发现“支付”事务的响应时间在测试开始10分钟后突然从500ms飙升到5秒。
  2. 关联资源:将“支付”事务的响应时间图与“Windows资源-处理器(%Processor Time)”图进行关联(Overlay)。你发现,当支付响应时间飙升时,数据库服务器的CPU使用率也同步达到了100%。
  3. 深入下钻:这强烈暗示数据库是瓶颈。但为什么?继续关联“每秒事务数”图,发现此时TPS已经停止增长甚至下降。
  4. 检查错误:查看“错误统计”图,是否出现了大量的数据库连接超时或死锁错误。
  5. 定位SQL:如果应用服务器有监控(如通过JMX监控JDBC连接池),可以查看此时最耗时的SQL语句是什么。或者,直接登录数据库服务器,使用topvmstatiostat等命令,或查询数据库慢日志,定位到具体的慢查询。

常见瓶颈模式:

  • CPU瓶颈:响应时间增加,TPS达到平台期或下降,对应服务器的CPU使用率持续高于80%-90%。可能原因:低效算法、死循环、频繁GC(对于Java应用)、SQL未用索引导致全表扫描。
  • 内存瓶颈:响应时间逐渐变慢,TPS可能缓慢下降,操作系统开始使用Swap空间,磁盘I/O(swap in/out)增加。可能原因:内存泄漏、缓存设置过大挤占应用内存、JVM堆内存不足导致频繁Full GC。
  • 磁盘I/O瓶颈:响应时间波动大,TPS上不去,磁盘利用率(%Disk Time)高,磁盘队列长度(Avg. Disk Queue Length)持续大于2。可能原因:大量日志写入、数据库临时表操作、磁盘本身性能差。
  • 网络瓶颈:响应时间慢,但服务器资源(CPU、内存、磁盘)都很空闲。网络吞吐量接近带宽上限,或有大量重传。可能原因:带宽不足、网络设备(交换机、防火墙)性能瓶颈、不合理的应用架构(如频繁传输大文件)。
  • 应用配置瓶颈:响应时间慢,但底层资源未耗尽。可能原因:Web服务器(如Tomcat)线程池配置过小,连接池配置过小,导致大量请求在队列中等待;应用代码中存在同步锁竞争。

5.3 服务器端监控集成

LoadRunner自带的Windows性能计数器监控是基础。对于Linux服务器和Java应用,需要额外配置:

  • Linux服务器:可以在服务器上安装rstatdnmon等工具,LoadRunner通过它们来获取CPU、内存、磁盘、网络等指标。更专业的做法是使用统一的监控平台(如Prometheus+Grafana),在压测时同步观察。
  • Java应用(JVM):这是调优的重点区域。通过配置JMX,LoadRunner可以监控JVM堆内存使用情况、各代GC次数和耗时、线程状态等。一个频繁发生Full GC的应用,其响应时间必然会出现周期性尖峰。

6. 性能调优实战:从分析到行动

定位到瓶颈后,就进入了调优阶段。调优是一个“假设-验证”的循环过程。

6.1 数据库层调优

数据库往往是性能瓶颈的重灾区。

  • SQL优化:分析慢查询日志,使用EXPLAIN命令查看执行计划。常见的优化手段包括:为查询条件字段添加索引、避免SELECT *、优化JOIN语句、避免在WHERE子句中对字段进行函数操作。
  • 连接池调优:检查应用服务器(如Tomcat的DBCP, HikariCP)的数据库连接池配置。连接数设置过小会导致请求排队等待连接;设置过大会耗尽数据库连接资源。需要根据压测结果找到一个平衡点。
  • 架构优化:考虑引入读写分离、分库分表(对于数据量巨大的表)、或使用缓存(如Redis)来减轻数据库的实时查询压力。

6.2 应用服务器与代码层调优

  • JVM调优:这是Java应用性能调优的核心。关键参数包括堆内存大小(-Xms,-Xmx)、新生代/老年代比例(-XX:NewRatio)、垃圾收集器选择(如G1 GC)。目标是减少STW(Stop-The-World)的停顿时间,特别是Full GC的频率和时长。监控GC日志是必须的。
  • 线程池调优:调整Web服务器(如Tomcat的maxThreads)和应用内部业务线程池的大小。线程数过多会导致频繁的上下文切换,消耗CPU;线程数过少则无法充分利用CPU,请求排队。
  • 代码优化:通过分析工具(如Arthas, JProfiler)找出热点方法。常见问题包括:不必要的同步锁、低效的算法(如多层嵌套循环)、创建大量临时对象、未关闭的流或连接等。

6.3 系统与中间件调优

  • 操作系统参数:对于Linux服务器,可能需要调整文件描述符数量(ulimit -n)、TCP内核参数(如net.ipv4.tcp_tw_reuse,net.core.somaxconn)来支持高并发网络连接。
  • Web服务器调优:调整Nginx/Apache的worker进程数、连接超时时间、缓冲区大小等。
  • 缓存策略:合理使用本地缓存(如Guava Cache)和分布式缓存(如Redis),能极大提升读性能。但要注意缓存穿透、雪崩、击穿问题,以及缓存数据的一致性。

调优后的验证:任何一项调优措施实施后,必须重新执行一次相同场景的性能测试,对比调优前后的关键指标(响应时间、TPS、错误率、资源利用率)。只有数据证明优化有效,这项调优才算完成。有时,一项优化可能会暴露出另一个更深层次的瓶颈,这就需要我们进入下一个分析-调优的循环。

7. 报告编写与常见问题排查

性能测试的最终产出是一份清晰、有说服力的报告,以及一套应对常见问题的排查清单。

7.1 性能测试报告核心要素

一份好的报告不应是Analysis图表的大杂烩,而应讲述一个“故事”:

  1. 测试概述:测试目标、测试范围、测试环境(硬件、软件版本、网络拓扑)、测试时间。
  2. 测试策略与场景:详细描述设计了哪些场景,虚拟用户模型、加压策略、监控指标是什么。
  3. 测试结果摘要:用表格形式清晰列出每个场景下,核心事务的响应时间(平均、90%)、TPS、通过率,并与预设的性能目标进行对比。
  4. 关键图表分析:选取最能说明问题的2-3张关联图表(如响应时间与CPU使用率叠加图),附上简要的文字分析,指出瓶颈点。
  5. 结论与建议:明确给出结论(如“系统在200并发用户下满足性能要求,但在300用户时数据库CPU成为瓶颈”),并给出具体的、可操作的优化建议(如“优化SQL:SELECT * FROM orders WHERE create_time > ?, 为create_time字段添加索引”)。
  6. 风险与限制:说明测试的局限性(如未测试第三方接口依赖、网络环境与生产有差异等)。

7.2 常见问题排查速查表

在性能测试执行和分析过程中,以下问题非常普遍:

问题现象可能原因排查方向与解决思路
虚拟用户大量失败,错误为“Action.c(xx): Error -27796: Failed to connect to server”1. 负载过大,服务器拒绝连接。
2. 负载生成器或网络问题。
3. 服务器连接数(如Tomcat maxConnections)已满。
1. 检查服务器日志(如Tomcat的catalina.out),看是否有连接拒绝错误。
2. 在Controller中检查负载生成器状态是否正常。
3. 监控服务器网络连接数(`netstat -an
事务响应时间随用户数增加线性增长,但TPS上不去系统存在资源竞争或串行化瓶颈。1. 检查应用服务器线程池是否已满,请求在队列中等待。
2. 检查数据库连接池是否已满。
3. 检查代码中是否存在全局锁或同步块,导致请求被串行处理。
4. 使用jstack(Java)或类似工具分析线程转储,看大量线程是否阻塞在同一个锁上。
测试中途TPS突然骤降,错误率飙升1. 应用或中间件崩溃、重启。
2. 数据库连接耗尽或死锁。
3. 内存耗尽,触发OOM(Out Of Memory)。
1. 立即检查服务器应用日志和系统日志(/var/log/messages)。
2. 检查数据库状态,查看是否有大量死锁或慢查询堆积。
3. 监控JVM堆内存,看是否已满并频繁Full GC。
平均响应时间达标,但90%或95%响应时间非常差存在“长尾请求”。少数请求因某些原因(如查询大表、缓存未命中、依赖外部慢接口)处理极慢。1. 分析事务的细分时间(网络、服务器处理、前端渲染),看时间消耗在哪里。
2. 检查数据库,是否存在个别极慢的SQL(查询缺少索引、锁等待)。
3. 检查是否有请求依赖了不稳定的外部服务或接口。
Windows资源监控计数器无法连接1. 目标服务器防火墙未关闭或未开放相应端口。
2. 远程注册表服务未启动。
3. 权限不足。
1. 确保服务器防火墙允许LoadRunner监控(通常涉及135等端口,但建议在测试环境临时关闭防火墙)。
2. 在服务中启动“Remote Registry”服务。
3. 使用具有管理员权限的账户进行监控配置。

性能调优是一门结合了技术、经验和严谨方法的艺术。基于LoadRunner的实践,提供了一个从压力模拟、数据收集到根因分析的标准框架。但工具只是手段,真正的核心在于测试人员对系统架构的理解、对数据的敏感度以及不断追问“为什么”的探索精神。每一次性能测试和调优,都是对系统韧性的一次深度体检和强化。

http://www.jsqmd.com/news/1054422/

相关文章:

  • XXMI Launcher:一站式游戏模组管理器终极指南
  • 深圳福田区黄金回收怎么卖得高?三个硬指标拆解 - 上门黄金回收
  • 西安新城区卖金指南:当前金价高位,把握回收时机 - 上门黄金回收
  • 3步彻底解决TranslucentTB开机不自启问题:Windows任务栏透明工具启动终极指南
  • 清远黄金回收全攻略:6家靠谱店铺推荐与避坑指南 - 余生黄金回收
  • 3分钟学会:LaTeX2Word-Equation终极公式转换指南
  • 基于模块化适配架构的魔兽争霸3跨版本兼容性解决方案技术分析
  • Django生产部署:Ubuntu+Postgres+Nginx+Gunicorn完整实践
  • 三维可视轨迹复盘 赋能港口应急处置、事故溯源与预案优化
  • 西宁城东区黄金回收指南:三个硬指标与六家机构实测对比 - 上门黄金回收
  • WarcraftHelper:5个关键技巧让魔兽争霸3在现代电脑上流畅运行
  • 2026亨得利官方售后网点深度实地走访调研报告,实现中国境内60余家品牌授权服务门店核查 - 亨得利中国服务中心
  • Mermaid Live Editor:3步掌握免费在线图表编辑的终极技巧
  • 青岛黄金回收全攻略:6月行情解读与6家正规机构横向评测 - 余生黄金回收
  • 2026青甘大环线最佳出游季节|分时节游玩推荐|西北7日大环线全域攻略 - 纯玩旅游攻略指南
  • 终极Zotero插件市场完整指南:如何在Zotero中一键管理所有插件
  • ViGEmBus虚拟游戏手柄驱动:终极指南解决Windows游戏控制器兼容性问题
  • 如何为Unity游戏构建智能实时翻译系统:XUnity.AutoTranslator深度解析
  • Ubuntu 20.04 安装 Composer 正确姿势:PHAR 校验与安全部署
  • 杭州上城区黄金回收五维测评及6家机构解析 - 上门黄金回收
  • 2026 年 6 月万国中国官方售后维修网点全面整改升级 全新专线咨询电话正式上线 - 万国中国服务中心
  • 台州评价高的贴汽车膜、贴车衣、防晒车窗膜哪家好,膜一姐怎么样,可以选吗?高性价比,口碑出众! - 汽车新知百晓生
  • TRK-USB-MPC5604B开发板全解析:从入门到自定义硬件设计
  • Ubuntu 20.04升级本质:GNOME 3.36、systemd-resolved与Python 3.8迁移实战
  • 2026韶关黄金回收市场实地评测:六家正规门店信息与避坑要点 - 余生黄金回收
  • 3分钟解密网易云音乐NCM格式:ncmdumpGUI图形化工具完整指南
  • 2026安庆市萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商务
  • Wireshark实战:HTTP登录抓包分析,揭示网络通信安全风险
  • 昆明盘龙区黄金回收五维测评指南与六家机构详情 - 上门黄金回收
  • 2026马鞍山美度市萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商贸