1. 这三个词不是玄学,是系统能力的“血压计”和“心率仪”
刚入行那会儿,我常听老同事说“这接口TPS上不去”“压测QPS崩了”“吞吐量卡在500就打不动”,当时只觉得是黑话连篇。直到自己第一次独立负责一个订单结算模块的性能调优,凌晨三点盯着监控面板上跳动的数字发呆——明明代码逻辑没改,数据库连接池也调大了,可并发一上来,响应时间就从200ms直线飙到2秒,错误率瞬间破15%。翻日志、查慢SQL、看线程堆栈,折腾半天毫无头绪。最后发现,问题根本不在代码,而在对这三个基础指标的理解偏差:我把“每秒处理1000个请求”当成硬性目标,却没意识到,这个“1000”到底是QPS还是TPS?它背后对应的是用户点击下单的“动作”,还是下单成功后扣减库存、生成支付单、发通知的“事务链路”?更关键的是,这个数字是在什么资源水位下跑出来的?CPU 30%时的1000,和CPU 95%时的1000,价值天壤之别。
TPS、QPS、吞吐量,这三个词绝不是教科书里干巴巴的定义,它们是系统真实运行状态的“生命体征”。QPS(Queries Per Second)衡量的是入口流量的脉搏频率,就像医院门口的叫号机,每秒叫出多少个号;TPS(Transactions Per Second)则是业务价值的完成度刻度,它不关心你叫了多少号,只关心最终有多少人真正完成了挂号、问诊、开药这一整套流程;而吞吐量(Throughput)是个更宽泛的“总产出”概念,它不绑定单位时间,而是聚焦于系统在特定约束下能稳定交付的总量,比如“单次压测周期内成功处理10万笔订单”。很多人混淆它们,本质是混淆了“输入”、“有效输出”和“总产能”这三个不同维度。搞不清这个,所有性能优化都是蒙眼拉磨——你可能把叫号机调得飞快(QPS飙升),但诊室只有两个医生(TPS上不去),最后大厅挤满人(吞吐量受限),还误以为是叫号机坏了。这篇文章,就是帮你把这三根“生命体征监测线”从监控图表里拎出来,看清它们各自代表什么、怎么测、怎么解读、为什么经常打架,以及当它们同时报警时,你该先摸哪个“脉”。
2. 核心概念解剖:从字面到骨髓的三层穿透
2.1 QPS:流量入口的“计数器”,但计什么数很关键
QPS,每秒查询数,听起来最直白,实则陷阱最多。它的核心在于“Query”这个词——到底什么是“一次查询”?这个定义权完全在你手里,也直接决定了QPS数字的含金量。
最窄口径(推荐用于网关/负载均衡层):一次完整的HTTP请求。无论GET还是POST,无论返回200还是500,只要请求抵达你的反向代理(如Nginx)或API网关,就算1次QPS。这是最客观、最不易被业务逻辑干扰的统计方式,反映的是网络层的接入能力。某次压测中,我们看到Nginx日志显示QPS稳定在8000,但后端应用日志里只有4000条有效请求记录,差额全是404和401错误。这说明前端路由配置有误,大量无效流量冲垮了网关,此时盯着8000这个数字优化后端毫无意义。
中间口径(常用在业务API层):一次成功的、有业务意义的API调用。通常指返回HTTP状态码2xx的请求。这比网关层更贴近业务,但它依然不关心这个“成功”背后做了多少事。比如一个“提交订单”API,它可能内部调用了库存服务、优惠券服务、支付服务三次远程调用,但对外只算1次QPS。这就引出了关键点:QPS高不等于系统忙,它可能只是“轻量级”的入口验证;QPS低也不等于系统闲,它可能卡在某个重IO操作上,导致请求堆积。
最宽口径(需谨慎使用):将一次用户操作拆解为多个子请求后的总和。例如,一个网页加载,浏览器可能发起1个HTML请求、3个JS请求、2个CSS请求、5个图片请求,共11次HTTP请求。如果按此计算,QPS=11。这种算法在分析前端性能时有用,但绝对不能用于评估后端服务容量,因为它把客户端行为和服务器能力混为一谈。
提示:在做性能基线或容量规划时,务必明确QPS的统计口径,并在所有报告中注明。我见过太多团队因为口径不一致,导致A组说QPS达标了,B组说根本没达到,吵了半天才发现一个算网关日志,一个算应用成功日志。
2.2 TPS:业务价值的“验收官”,必须定义清楚“一笔事务”
TPS,每秒事务数,是这三个指标里业务价值最直接的体现者,也是最容易被滥用的一个。它的灵魂在于“Transaction”——什么才算“一笔事务”?这个定义必须由业务方拍板,技术只是执行者。
经典ACID事务(数据库层面):在单库场景下,TPS常等同于数据库每秒提交(COMMIT)的事务数。一个转账操作,包含“扣A账户”、“加B账户”、“写日志”三个SQL,必须在一个数据库事务里完成,成功提交才算1 TPS。这是最严格、最无歧义的定义,但仅适用于强一致性要求极高的核心交易系统(如银行核心账务)。
业务事务(Saga模式/最终一致性):现代分布式系统中,跨服务的长流程(如下单)无法用单库事务保证。此时,TPS应定义为一个完整业务流程的成功闭环。以电商下单为例,TPS=1意味着:用户点击“提交订单”→ 库存预占成功 → 订单创建成功 → 支付单生成成功 → 用户收到下单成功通知,这一整条链路上所有环节均成功。任何一个环节失败(如库存不足、支付单创建超时),都不计入TPS。这才是老板和产品经理真正关心的数字——它代表每秒有多少真实订单诞生。
常见误区:把“下单接口的QPS”直接当作“下单TPS”。这是致命错误。下单接口QPS=1000,可能其中200次因库存不足返回失败,100次因支付服务超时失败,实际成功下单的只有700笔,那么TPS=700。如果你只盯着QPS优化,可能会去提升接口的响应速度,但真正的瓶颈可能在库存服务的并发扣减能力上。
注意:定义TPS时,必须同步定义“成功”的标准。是只要订单表写入就算成功?还是必须支付单也生成?或是用户收到短信才算?这个标准一旦定下,所有压测、监控、告警都必须以此为准。我们曾因“成功”定义模糊,在大促前夜发现监控告警阈值设错了——把“订单创建成功”当TPS,而业务方要求的是“支付成功”,导致大促期间大量未支付订单涌入,库存被虚占,险些造成资损。
2.3 吞吐量:系统能力的“总成绩单”,脱离时间谈吞吐是耍流氓
吞吐量(Throughput)是一个更宏观、更务实的概念。它不强调“每秒”,而是关注在给定条件下,系统能稳定交付的总工作量。它的价值在于剥离了瞬时波动,反映的是系统的“持续作战能力”。
时间窗口绑定:吞吐量必须和时间窗口强关联。说“系统吞吐量是10万”毫无意义;必须说“在60分钟压测周期内,系统稳定处理了10万笔有效订单,错误率<0.1%”。这个“60分钟”很关键,它模拟了真实业务的持续压力,而非几秒钟的峰值冲击。
稳定性是前提:吞吐量不是峰值冲刺,而是马拉松配速。一个系统可能在1秒内扛住5000 TPS,但30秒后就崩溃,它的吞吐量依然是0——因为它无法“稳定”交付。所以,吞吐量测试(Stability Test)的核心指标是:在目标吞吐量下,系统各项资源(CPU、内存、磁盘IO、网络带宽)是否持续处于安全水位(如CPU<75%),响应时间P95是否稳定在SLA要求内(如<500ms),错误率是否可控(如<0.5%)。
与QPS/TPS的关系:吞吐量 = 平均QPS(或TPS) × 时间窗口。但它比简单的乘法深刻得多。例如,一个系统在10分钟内,前2分钟QPS=2000(峰值),中间6分钟QPS=800(平稳),最后2分钟QPS=100(衰减),总处理量=2000×120 + 800×360 + 100×120 = 516,000。它的平均QPS=516,000 / 600 = 860,但它的有效吞吐量应是800,因为只有在这个水平下,系统才表现出长期稳定性。这就是为什么容量规划要基于吞吐量,而非峰值QPS——峰值是烟花,吞吐量才是日常烟火气。
3. 实操指南:如何精准测量、对比与归因
3.1 测量工具链:从“看到”到“看懂”的四步法
测量不是简单地跑个JMeter脚本然后截图。一套可靠的测量流程,必须覆盖数据采集、清洗、聚合、归因四个环节。
源头埋点(Instrumentation):这是精度的基石。在代码关键路径埋点,而非依赖外围监控。
- QPS:在Web框架的统一入口拦截器(如Spring MVC的HandlerInterceptor)中,对每个请求开始和结束打点,记录
requestId、uri、status、startTime、endTime。避免在Controller方法里埋点,因为异常可能绕过它。 - TPS:在业务事务的“终点”埋点。例如,在订单服务的
createOrder()方法成功返回前,记录一条order_created_success事件,包含orderId、userId、amount、timestamp。确保这个埋点在事务提交之后(如用@TransactionalEventListener监听AFTER_COMMIT事件)。 - 吞吐量:无需额外埋点,它是QPS/TPS在时间窗口上的积分。但需要确保QPS/TPS的埋点数据能被可靠持久化(如写入Elasticsearch或专用时序数据库InfluxDB)。
- QPS:在Web框架的统一入口拦截器(如Spring MVC的HandlerInterceptor)中,对每个请求开始和结束打点,记录
数据采集与传输:避免日志文件解析这种低效方式。采用OpenTelemetry SDK,将埋点数据以OTLP协议实时上报到Collector(如Jaeger或Zipkin)。Collector负责采样、过滤、格式转换,再推送到后端存储。这样做的好处是:数据结构化、低延迟、支持链路追踪,为后续归因打下基础。
聚合与可视化:用Grafana对接后端存储,构建核心仪表盘。
- QPS仪表盘:按
uri分组,展示count(status="2xx") / 60s(每分钟QPS),叠加count(status="5xx") / 60s(错误QPS)。关键看两者比值。 - TPS仪表盘:单独一个Panel,展示
count(event="order_created_success") / 60s(每分钟TPS),并叠加其P95响应时间曲线。 - 吞吐量仪表盘:一个大数字,显示“过去60分钟累计TPS”,下方小字标注“当前P95: xxx ms, 错误率: x.x%”。这个数字要和容量规划文档里的目标值放在一起对比。
- QPS仪表盘:按
归因分析(Root Cause Analysis):当TPS骤降时,不能只看TPS数字。要联动分析:
- 查看对应时间段的QPS是否同步下降?如果是,问题在入口(如DNS故障、CDN回源失败)。
- 如果QPS不变甚至上升,但TPS暴跌,说明大量请求在后端失败。此时看错误QPS仪表盘,定位是哪个
uri的5xx暴增。 - 进入链路追踪系统,随机抽取几个失败的
requestId,查看其完整调用链。是卡在数据库?还是某个下游服务超时?还是线程池耗尽?这才是真正的归因。
实操心得:我们曾遇到TPS从1200跌到300,QPS却保持1500的诡异现象。通过链路追踪发现,90%的请求都在调用“优惠券核销”服务时超时(>5s)。进一步排查,发现该服务的Redis连接池被一个未关闭的连接泄漏耗尽。修复连接池配置后,TPS瞬间恢复。如果没有链路追踪和精确的埋点,这个问题可能要花几天才能定位。
3.2 对比分析:为什么“我的QPS比他高,TPS却比他低”?
单纯比较两个数字没有意义,必须放在同一套“标尺”下。以下是几个关键对比维度:
| 对比维度 | 关键问题 | 实例说明 |
|---|---|---|
| 环境一致性 | 是否在同一套硬件、同一版本代码、同一数据集、同一压测脚本下进行? | A团队用8核16G机器测QPS=5000,B团队用16核32G机器测QPS=4000。这对比毫无价值。 |
| 数据集规模 | 压测数据是100条模拟数据,还是100万真实脱敏数据?数据分布(如热点用户)是否一致? | 用100条数据测,缓存命中率99%,TPS虚高;用100万数据测,缓存失效,TPS腰斩。 |
| 业务逻辑复杂度 | “获取用户信息”接口的QPS,和“生成年度财务报表”接口的QPS,能直接比吗? | 前者QPS=10000,后者QPS=5,但后者TPS=5代表完成了5份复杂报表,价值远超前者。 |
| 成功率基准 | QPS/TPS的统计,是否都基于“成功率>99.5%”的前提? | A系统QPS=2000(成功率95%),B系统QPS=1800(成功率99.9%)。B系统更健康。 |
注意:永远不要脱离“成功率”和“响应时间”谈QPS/TPS。一个QPS=10000但错误率20%、P95=5s的系统,其业务价值远低于一个QPS=8000、错误率0.1%、P95=200ms的系统。我们内部有个铁律:“三指标一体看”——任何性能报告,必须同时呈现QPS、TPS、P95、错误率四个数字,缺一不可。
3.3 归因实战:从“数字报警”到“代码修复”的完整路径
当监控告警响起,TPS跌破阈值,下面是我总结的标准化排查路径,已迭代十几次,覆盖95%的常见问题:
第一层:确认告警真实性
立即登录Grafana,检查TPS、QPS、错误率、P95是否同步异常。如果只有TPS掉,QPS和错误率正常,大概率是埋点逻辑错误(如TPS埋点漏了某些成功分支),先检查代码。第二层:隔离入口与出口
- 查看网关层QPS:如果网关QPS也掉了,问题在外部(如上游调用方限流、DNS问题、DDoS攻击)。
- 如果网关QPS正常,但应用层QPS暴跌,问题在应用自身(如JVM Full GC频繁,线程池被打满,OOM被K8s重启)。
第三层:聚焦失败请求
在日志系统(如ELK)中,搜索status:5*或error:*,按uri分组,找出错误率最高的Top 3接口。对这些接口,查看其P95和P999响应时间曲线,看是否同步飙升。如果是,说明是性能瓶颈;如果响应时间正常但错误率高,说明是业务逻辑异常(如空指针、参数校验失败)。第四层:深挖调用链
选取一个失败的requestId,在链路追踪系统中打开完整调用链。重点关注:- 耗时最长的Span:是数据库查询?是HTTP远程调用?是本地计算?
- 失败的Span:哪个环节返回了5xx或timeout?
- 并发数:该Span在失败时间段内的并发请求数是否激增?
第五层:验证与修复
定位到具体问题(如“MySQL查询order表user_id索引缺失”),在预发环境复现并验证修复方案(如添加索引)。修复后,用相同脚本压测,确认TPS、P95、错误率全部回归基线。
踩过的坑:有一次TPS暴跌,链路追踪显示所有请求都卡在“发送邮件”服务上。我们以为是邮件服务挂了,结果发现是开发为了调试,把邮件发送逻辑写成了同步阻塞调用,且未设置超时。一个邮件发送慢,拖垮了整个下单链路。教训是:所有外部依赖,必须异步化或设置严格超时,并有熔断降级预案。现在我们的规范是:任何HTTP调用,
connectTimeout和readTimeout必须显式设置,且不超过1s。
4. 场景化深度解析:不同系统下的指标权重与陷阱
4.1 高并发读场景(如新闻APP首页):QPS是王,TPS是影子
这类系统的特点是:用户请求高度同质化(都是刷首页Feed流),数据更新频次低(新闻内容几分钟一刷),业务逻辑极简(基本就是查缓存+查DB)。此时,QPS是核心命脉,TPS几乎可以忽略。
- 为什么QPS最重要?因为用户的“刷”这个动作,就是最原始的QPS。每秒有10万人刷新首页,系统就必须能扛住10万QPS。这里的“成功”,就是返回一个200状态码和JSON数据,哪怕数据是5分钟前的,用户也接受。
- 典型陷阱:过度优化TPS。有人会想:“我要保证每秒10万次‘首页加载成功’的TPS”。这完全是伪需求。首页加载没有“事务”概念,它就是一个纯读操作。强行给它套TPS,只会增加不必要的埋点和监控复杂度。
- 优化重点:极致的缓存策略(多级缓存:CDN -> Redis -> 本地Caffeine)、读写分离、数据库分库分表(应对海量用户ID查询)、静态化(将首页渲染成HTML片段)。我们曾通过将热门新闻Feed流预生成并缓存在CDN,将QPS承载能力从5万提升到50万,成本几乎为零。
4.2 强一致性写场景(如银行转账):TPS是圣杯,QPS是仆人
这类系统的核心是“资金安全”,每一笔转账都必须满足ACID,不容半点差错。此时,TPS是唯一有意义的指标,QPS只是TPS的“输入流量”。
- 为什么TPS是圣杯?因为老板只关心“每秒能完成多少笔真实的、原子性的转账”。QPS=1000,但如果其中300笔因余额不足失败,TPS=700,这个700才是业务产能。而且,TPS必须附带严格的SLA:P999响应时间<2s,错误率=0。
- 典型陷阱:用QPS来考核写系统。某次,运维团队为了提升QPS,将数据库连接池从100调到500。结果在大促时,大量连接争抢锁,TPS不升反降,还引发了连锁超时。问题根源是:写操作的瓶颈从来不在连接数,而在锁竞争和磁盘IO。
- 优化重点:数据库选型(如TiDB、OceanBase等NewSQL)、精细化锁控制(行锁代替表锁)、异步化非核心流程(如记账成功后,异步发短信)、极限压测(用真实交易流水回放)。我们曾对核心账务库进行“全链路压测”,发现当TPS超过1200时,MySQL的
innodb_row_lock_time_avg飙升,果断引入分库分表,将单库TPS压力控制在800以内,保障了大促零资损。
4.3 混合型业务系统(如电商平台):三者共生,动态权重
这是最复杂的场景,一个系统里既有高QPS的读(商品详情页),又有高TPS的写(下单),还有长耗时的批处理(日终对账)。此时,不能一刀切,必须按业务域划分指标权重。
- 商品中心(读为主):QPS是核心KPI,目标是支撑大促期间千万级UV的详情页访问。TPS在这里指“商品信息更新成功”的次数,但更新频次很低(一天几次),所以权重低。
- 订单中心(写为主):TPS是核心KPI,目标是每秒稳定创建1000+笔订单。QPS在这里指“创建订单”接口的调用量,但它必须和TPS强绑定(QPS≈TPS,因为失败率要<0.1%)。
- 营销中心(混合):QPS(用户领券)和TPS(优惠券核销成功)都要盯。但两者关系是非线性的:一个用户可能领10张券(QPS高),但只在下单时核销1次(TPS低)。所以,要分别设定阈值,并监控两者的转化率(核销数/领取数)。
实操心得:我们为不同业务域建立了“指标矩阵”。例如,订单中心的SLA是:TPS≥1000,P95≤300ms,错误率≤0.05%;商品中心的SLA是:QPS≥50000,P95≤100ms,缓存命中率≥95%。这个矩阵写进每个服务的SLO文档,是发布上线的强制准入门槛。没有这个矩阵,所有性能优化都是盲人摸象。
5. 常见问题与避坑指南:那些年踩过的“指标”深坑
5.1 “QPS上去了,但用户说更卡了?”——响应时间与QPS的悖论
这是一个高频问题。现象是:经过优化,QPS从5000提升到8000,但用户反馈页面加载变慢,监控显示P95从200ms涨到800ms。
- 根本原因:QPS提升是通过“降低单请求成本”实现的,但新方案引入了更高延迟的操作。例如,为了提升QPS,将原来一次数据库查询,改为先查Redis,Redis没命中再查DB。这看似合理,但如果Redis集群网络抖动,大量请求会fallback到DB,导致DB压力剧增,P95飙升。此时,QPS是上去了(因为Redis响应快),但整体用户体验恶化了。
- 破解之道:永远用“P95响应时间”作为QPS提升的否决票。任何优化方案,必须保证在目标QPS下,P95不劣于基线。我们现在的压测流程是:先固定P95目标(如≤300ms),然后逐步提升并发,看QPS能到多少。而不是反过来。
5.2 “TPS达标了,但数据库CPU爆了!”——资源消耗与指标的失衡
现象:压测报告显示TPS=1000,完美达标。但运维报警,数据库CPU持续95%以上,随时可能宕机。
- 根本原因:TPS只衡量了“成功数量”,没衡量“成功所付出的代价”。一个低效的SQL,可能让TPS=1000的同时,CPU吃满;而一个优化后的SQL,可能让TPS=1200,CPU只用60%。后者才是可持续的健康TPS。
- 破解之道:将资源利用率(CPU、内存、IO等待)作为TPS的“伴生指标”。在容量规划时,不仅要定TPS目标,还要定“在TPS=X时,数据库CPU<75%”。我们有一个“黄金比例”经验:当TPS提升20%,而数据库CPU增长超过10%,就要警惕,必须深入分析SQL执行计划。
5.3 “吞吐量测试跑了1小时,结果发现最后10分钟TPS断崖下跌”——稳定性测试的致命漏洞
现象:吞吐量测试报告写着“60分钟稳定处理60万订单”,但仔细看曲线,前50分钟TPS=1000,最后10分钟TPS=200,平均下来是1000。这显然不合格。
- 根本原因:测试设计缺陷。没有设置“稳态期”和“衰减期”的明确区分。真正的吞吐量测试,必须包含:
- 预热期(5-10分钟):让JVM JIT编译、缓存预热、连接池填满。
- 稳态期(至少30分钟):以目标TPS恒定施压,所有指标(TPS、P95、错误率、资源)必须全程稳定。
- 衰减期(5-10分钟):逐步降低压力,观察系统能否平滑恢复。
如果稳态期内任何指标波动超过5%,即视为测试失败。
- 破解之道:用自动化脚本驱动压测。我们用Jenkins Pipeline,集成JMeter和Prometheus,自动执行“预热->稳态->衰减”三阶段,并在稳态期每分钟校验一次指标,一旦超标,立即终止并告警。这比人工盯屏可靠一万倍。
5.4 “线上QPS是5000,压测怎么也跑不到?”——环境差异的隐形杀手
现象:线上监控显示QPS峰值5000,但在同等配置的压测环境,JMeter最大只能跑到3000。
- 根本原因:线上环境有大量“免费”资源,而压测环境是“裸机”。主要差异点:
- 缓存热度:线上Redis/Memcached已有海量热数据,压测环境是冷启动,大量请求穿透到DB。
- JVM状态:线上JVM已运行数天,JIT编译充分,GC稳定;压测环境是新启进程,初期GC频繁。
- 网络拓扑:线上请求来自全球用户,网络延迟天然存在,反而降低了瞬时并发冲击;压测是本地发起,毫秒级延迟,容易形成“请求风暴”。
- 破解之道:压测必须“仿真”。
- 缓存预热:压测前,用历史流量回放,将热点数据提前灌入Redis。
- JVM预热:压测脚本启动后,先以低并发运行10分钟,再进入正式压测。
- 网络延迟注入:在JMeter中为每个请求添加随机的
Constant Timer(如100-500ms),模拟真实网络抖动。
我们曾通过这三步,将压测QPS从3000提升到5200,与线上峰值高度吻合。
6. 终极心法:把指标变成团队的语言和肌肉记忆
聊了这么多技术细节,最后想分享一点更底层的东西:指标的价值,不在于数字本身,而在于它能否成为团队沟通的共同语言,能否沉淀为工程师的本能反应。
在我带过的几个团队里,最成功的做法,是把TPS/QPS/吞吐量的要求,像呼吸一样融入到日常开发的每一个环节:
- 需求评审阶段:产品经理提需求时,必须附带“预期TPS”和“P95目标”。例如,“双11期间,首页‘猜你喜欢’模块,预期QPS峰值5万,P95≤150ms”。没有这个,技术侧有权拒接需求。
- 技术方案设计阶段:架构师出方案时,必须包含“容量估算”。例如,“预计QPS=5000,按单请求DB耗时5ms,需DB QPS=5000,换算为TPS=5000,考虑20%冗余,目标TPS=6000,对应数据库连接池需配置为...”。
- Code Review阶段:除了看功能逻辑,必须检查埋点代码。Reviewer会问:“这个
order_created_success事件,是在事务提交后发出的吗?如果发消息失败,会不会影响事务?” - 上线发布阶段:发布Checklist第一条:“确认新版本在预发环境,TPS/P95/错误率均符合SLO”。不符合,立刻回滚。
久而久之,当一个新人听到“TPS掉了一半”,他第一反应不是去查日志,而是打开Grafana,看QPS是否同步掉,再看链路追踪,找耗时最长的Span。这种条件反射,比任何文档都管用。
我个人在实际操作中的体会是:别把TPS、QPS、吞吐量当成三个孤立的数字去记。把它们想象成一辆车的仪表盘——QPS是油门踏板的深度(你踩得多猛),TPS是车轮实际转过的圈数(你真正走了多远),吞吐量则是这趟旅程的总里程(你最终抵达了哪里)。油门踩得再猛,车轮不转,里程不会增加;车轮转得再欢,方向错了,里程也是白费。唯有三者协同,方向盘(业务目标)握稳,这辆车才能又快又稳地驶向目的地。