项目中的性能问题是如何发现、定位并推动解决的?

考查重点:慢路径证据与改进推进。从监控或用户反馈定位慢路径,trace与profile验证瓶颈,带数据协调上下游改动,再同负载复测并监控是否转移瓶颈

本题目录

参考答案

回答思路

围绕一条具体慢请求,讲清怎样发现、哪段证据指向瓶颈、自己改了什么、怎样推动上下游配合,以及如何确认改动有效。先区分首个有效输出与完整结果的等待时间,再沿请求时间线找关键路径;并行支路的耗时不能直接相加,父步骤与子步骤也不能重复计算。

下面沿用四个假设的行业案例,性能排查与改动是尚未实测的方法示例。

门店经营分析助手Python

基于 shopkeeper-agent

核心回答示例

对“多门店、多指标查询很慢”这类反馈,我会先保留问题、时间范围和请求标识,按关键词抽取、三路召回、元数据合并、模型生成与数据库执行分段计时,区分复杂问题本来就多做了工作,还是同类请求出现了异常等待。

我负责指标与上下文适配,重点检查合并节点补字段、补主外键时的数据库往返。三路召回本来就并行,因此继续检查并行之后的合并节点。只有记录显示逐项元数据查询占据慢路径,才把缺失字段和候选表先收集去重,增加批量查询接口,并保持原来需要的指标依赖与连接字段。

推进时,我会把同一请求的查询次数、等待时间和合并前后资料交给数据接入同事,共同核对批量接口;如果慢的是最终经营 SQL,则带 SQL、参数和执行计划找数据库负责人。改完用相同数据、问题与负载复测,既看完整结果耗时,也对照人工 SQL 检查退款口径、跨表关系和门店范围,确认没有用少查资料换速度。

怎样把“数据库慢”再分清

电商问数同时访问元数据 MySQL 和经营数据 MySQL。前者为模型补充字段、表与指标说明,后者执行最终 SQL;这两类耗时要分别记录。

当前 merge_retrieved_info 对缺失字段逐个查询,并按候选表分别补主外键和表信息。这是可以验证的往返开销线索,不等于已经证明它是瓶颈。可以对照简单单表问题与多指标跨表问题,记录缺失字段数、候选表数、查询次数和合并节点时间,检查它们是否随工作量一起增长。批量改造后,比较 table_infos、metric_infos 是否仍包含相同的必要信息,再看节省的往返是否反映到端到端耗时。

如果模型阶段更慢,继续区分表过滤、指标过滤、SQL 生成和失败后的纠错调用,检查输入长度、调用次数与模型服务等待;如果最终 SQL 更慢,再检查扫描、关联、排序或锁等待。底座虽然执行了 EXPLAIN,目前只用它检查能否解析,没有分析返回的执行计划。排障时需要另读计划;使用支持该功能的 MySQL 版本做 EXPLAIN ANALYZE 时,它会真实执行语句,应在可控数据与负载下使用。

怎样确认优化有效

固定数据库快照、指标定义、模型配置与请求比例,分别跑相同的单表和跨表问题;冷启动与预热后的结果分开比较。保留每轮样本量、完整结果耗时分布、成功率与失败明细;样本足够时,由单条端到端耗时计算 P95,也就是耗时的 95 分位,不能把各阶段的 P95 相加。成功结果、超时和失败分别记录,避免遗漏慢请求。

SSE 的“开始检索”只是进度,不是查询结果。提前发进度可以单独改善等待体验,查询提速仍要看正确结果何时返回。元数据批量查询变快后,还要检查模型或经营库是否成为新的主要等待点。

设备售后知识助手Java

基于 Ragent

核心回答示例

对“单人查手册还可以,多人同时提问就变慢”的情况,我会先比较相同故障问题在不同并发下的表现,再把设备匹配、各检索通道、融合、重排和生成串成一条时间线。通道任务从提交到开始执行的排队时间,要与真正查询的时间分开。

我负责设备与手册匹配及检索适配。以重排服务排队为排查场景,我会提供相同问题、候选数量与文本长度,和模型服务负责人一起核对服务端排队及执行时间,再比较受控并发与容量调整。先保留候选和模型条件,才能判断等待是否因资源不足而产生;直接缩小候选池,只能算待验证的质量取舍。

推进不止是提交一条“检索慢”的工单。我会附上慢请求、正常请求、负载条件和预期复测项,明确业务侧补计时、检索侧查队列、模型侧查重排服务。优化前后按同一请求比例复测首段有效回答和完整回答的耗时、超时率及正确证据召回,确认旧版手册没有混入,也没有因大量丢弃通道结果而显得更快。

为什么不能把各路时间相加

本例复用 Ragent ff93871 的固定知识问答流程。底座已有多通道并行检索,向量通道的定向检索与补充检索也有并行,两路共用一次问题向量;融合去重、重排候选限额同样是已有能力。

定位时从实际开始、结束时间找出阻塞后续融合的支路,再检查它是在等线程、外部服务,还是执行检索。若其他通道早已结束,它们的耗时不会再顺次加到最慢通道之后。若时间集中在重排,则保留融合前后候选数、送入重排的文本长度与模型请求,进一步区分应用等待和模型服务处理;只有服务端也提供计时,才能把一次外部调用拆得更细。

通道超时也要单独看。该版本通过超时放弃结果,后台任务仍可能继续执行;降低超时值会让当前请求更早往下走,却可能损失证据并持续占用线程。需要跟踪超时后的任务数量、队列和下游负载,取消是否生效要另行验证。

推动与复测保留哪些约束

设备适用范围是业务条件,不是提速开关。主路、补充路及其他实际通道都要遵守同样的允许手册范围;底座的通用检索作用域不会自动完成设备版本限制。

给模型或检索负责人提供可复现的请求及候选,比只给一张总体 P95 图更容易协作。一次先验证一类调整,例如重排服务容量或调用并发,记录配置、资源成本与回退条件。复测保持手册、模型、候选预算和负载一致,覆盖普通故障、同故障不同型号、长手册、无证据及通道超时;同时看吞吐、时延、错误率和有依据的回答比例。更早失败或少回答一部分问题,不能当成质量不变的提速。

产业情报研读平台Python

基于 deepsearch-agents

核心回答示例

对“研究任务一直有进度,报告却迟迟不出来”的反馈,我会以一次完整研究任务为单位,记录主智能体委派、来源工具请求、助手返回、证据整理、报告生成和文件导出的时间。先判断时间花在搜集、交接还是生成,不把 WebSocket 推送成功当成任务已经变快。

我负责来源产物到报告之间的证据组织。针对同一企业、同一事实被反复搜集的情况,会把子问题、工具参数和已取得材料关联起来,检查后续调用是在补缺口,还是重复同一次查询。确认重复后,在任务内按实体、事件、时间范围与来源条件复用已核对的材料,把后续任务收敛到尚缺的证据;需要独立核实的来源继续保留。

推进时,把重复调用样例交给助手编排负责人,把单次工具慢请求交给对应来源服务负责人,分别验证任务拆分和工具适配。复测固定题目、材料快照、模型与调用预算,比较完整报告交付时间和调用次数,同时检查关键子问题、独立来源、冲突与引用。调用少了但漏掉关键证据,就不能算优化成功。

调度开销与来源工具开销怎样区分

深度研搜注册了网络、数据库和 RAGFlow 三类助手,但注册三个助手不保证一次任务会并发使用它们。应先看真实调用时间及依赖:先查到产品名才能继续查进展的任务不能直接并行;互不依赖的搜集任务才适合在来源限速与资源预算内比较受控并发。

来源工具内部也不只是一次检索。当前 RAGFlow 工具会查助手、创建临时会话、读取流式回答,再删除会话;这些调用应分别计时。工具最终只返回回答文本,没有结构化来源信息。任务内证据复用需要先扩展来源输出,保存原文位置、日期及来源条件,不能仅凭两段摘要相似就认定重复,更不能让复用绕过新材料或冲突核验。

主智能体汇总、Markdown 生成和 PDF 转换另记时间。来源助手已经返回而 PDF 仍在转换,与来源检索慢应交给不同模块处理。若希望先交付 Markdown、随后提供 PDF,要明确改变的是交付顺序,仍需分别报告初稿可用与完整文件交付的时间。

复测怎样避免“少查所以快”

先回放固定来源结果,比较任务拆分、重复调用和整理开销;再做相同查询负载下的真实来源调用,观察外部限速和波动。开放网络材料会变化,单独记录取得的来源和日期,不能与固定回放混成同一组提速结论。

除了任务完成率与耗时,还检查是否保留原题要求的子问题、证据日期和未解决分歧;长任务加入超时、取消与断连,观察是否留下继续消耗资源的工具调用。这里的复用是待实现的任务内证据设计,不是底座已有跨任务缓存。

设备售后知识助手RAGFlow 集成

基于 RAGFlow

核心回答示例

对“批量更新手册时问答变慢”的情况,我会先把外部业务服务和 RAGFlow 分开测:设备匹配耗时、检索请求往返、返回片段核对、生成首段内容及完整答复各占多少。平台检索的整体耗时升高,只能说明要继续查平台侧,不能直接认定是向量库或模型慢。

我负责外部 Python 适配服务,会带着设备输入、允许文档、检索参数、慢请求时间和导入批次找平台维护者,对照检索服务与后台解析、Embedding 和索引写入的资源使用。只有确认共享资源竞争,才比较调整导入并发、安排导入窗口或分配独立资源;生成慢则用相同片段与模型输入另查生成服务。

复测保持问答负载和导入压力一致,分别看检索耗时、完整答复耗时、失败率及新手册可检索所需时间。不能靠暂停所有资料更新来掩盖吞吐损失,也不能为了更快返回而丢掉适用手册或无证据处理。改动要同时满足查询质量和业务约定的资料更新时效。

跨平台怎样提供够用的定位证据

这条路线复用 RAGFlow v0.27.2 的片段检索,设备匹配与生成上下文由外部业务服务处理。业务服务将匹配结果作为 dataset_ids、document_ids 传入,返回后核对来源,再进入生成。平台侧另有后台文档处理任务,承担解析、Embedding 等入库工作;它们是否与在线请求争用资源,取决于实际部署与负载。

因此,对外部检索调用的计时只表示“业务服务等待平台返回多久”,其中包含网络和平台处理,不能直接当成平台内部某个阶段的耗时。可以用请求标识关联两侧记录;无法共享标识时,提供精确时间、问题、范围与参数帮助平台方匹配日志。平台有内部计时再继续拆检索与重排,没有时先保留整体边界,不编造分段结论。可按 OpenTelemetry 的 trace、span 与上下文传播方式关联调用,但需要实际接入后才有这些证据。

无导入压力的对照有助于检验资源竞争假设;比较改动前后时,两边都应带同一批导入任务和查询流量。调整导入窗口还要记下资料延迟,避免只在离线工作停下时看到漂亮的查询时延。

哪些变化不能算成有效提速

模型、候选预算、片段长度、设备范围与索引版本都可能影响结果,应在比较中保持一致或单独说明变化。若确实要调候选数,需同时检查关键故障证据是否保留、引用是否完整,不能只展示更小参数带来的耗时下降。

没有适用手册时,应在业务服务停止。该版本在无额外过滤时可能把空文档列表解释为不加文档限制;为了得到回答放宽到其他型号,会改变业务条件。正常可回答、正确返回缺口、平台超时和调用失败分别记录,不能将它们混成一个平均响应时间。

对应教程

参考资料

相关面经

7 篇

腾讯

后端开发工程师
日常实习一面
查看原面经 →
该项目真实瓶颈在哪里?哪些不是瓶颈?

虎牙

全栈开发
秋招二面
查看原面经 →
追问
你自己会关注哪些指标?如果这些指标达不到要求,如何评估问题并优化?

波克、比亚迪、客路、CVTE、石犀科技

面经合集
查看原面经 →
前端数据看板越来越慢,从发现问题到最终定位到多次查询、重复扫描导致性能问题,这个排查过程是怎样的?

百度

AI智能体算法
一面、二面、三面
查看原面经 →
如果一个接口同时受到 CPU 和数据库 IO 的限制,你会怎样拆解瓶颈?

公司未注明

后端开发工程师
查看原面经 →
看到你做过离线消息的拉取,我想问你如果离线消息拉起来某个接口超时或者耗时很长很严重,你会想到怎么去排查、加索引、怎么优化呢?
展开剩余 2 篇面经

水滴

AI全栈
校招一面
查看原面经 →
数据导入链路中,真正耗时的节点在哪里?你是如何定位和验证的?

字节跳动

后端开发工程师
一面
查看原面经 →
项目追问
之前的性能问题是怎样发现并推进解决的?

收录题集

1 个来源,共2 份题集

相关题目

4 题