首页 / 云服务器

VPS 网站打开慢怎么排查:双源实测 TLS 段差 370.499 ms

阅读 5

封面:一次 HTTPS 请求拆成五段的双源耗时对照

有人看到浏览器 DevTools 里 Waiting (TTFB) 拖出很长一条,顺手就去给 VPS 加 CPU、加内存。配置换了一档,那条还是那么长。VPS 网站打开慢怎么排查,卡住人的多半不是这个动作,而是以为网站慢只对应一个数字。一次 HTTPS 请求从回车到收完响应,会被切成 DNS、TCP 建连、TLS 握手、服务端处理、响应体传输 5 段,任何一段拖长,页面都慢。把两个中国大陆不同运营商出口对同一批公开目标的请求净拆成这 5 段,能回答一个很具体的问题:同一个网站换个出口,到底哪一段慢、差多少毫秒。

网站打开慢不是一个数,是 5 段

直接答案:一次 HTTPS 请求可净拆成 DNS、TCP、TLS、服务端、传输五段;2026-11-14 双源实测里,example.com 换出口后变化最大的是 TLS 段,差 370.499 ms,服务端段只差 8.533 ms。

表 1 是这批数据的主干。三个目标、两个出口、每源每目标 5 轮取均值,DNS、TCP、TLS、服务端、传输、总耗时六列全摊开,单位是毫秒。

表 1 三个公开目标 × 两个出口的五段净耗时均值(ms)

目标 出口 DNS TCP TLS 服务端 传输 总
example.com 广东电信 cn-probe-1 9.899 415.467 497.101 264.933 0.147 1187.547
example.com 北京阿里云 cn-probe-2 4.000 213.000 867.600 256.400 0.200 1341.200
www.baidu.com 广东电信 cn-probe-1 8.694 27.758 130.310 28.797 0.490 196.049
www.baidu.com 北京阿里云 cn-probe-2 4.000 3.600 95.400 4.400 0.200 107.600
www.cloudflare.com 广东电信 cn-probe-1 1.558 368.427 318.307 168.765 3569.944 4427.000
www.cloudflare.com 北京阿里云 cn-probe-2 601.400 248.800 889.800 366.400 2031.200 4137.600

横着读,最扎眼的是传输段。example.com 两源 0.147 与 0.200,www.baidu.com 0.490 与 0.200,都不到 1 毫秒;www.cloudflare.com 却到了 3569.944 与 2031.200。同一个出口,目标换一个,传输段从零点几毫秒跳到几千毫秒。这三次请求拿到的都是 http_code 200,响应体大小、是否压缩、有没有重定向跟随,curl 单请求说不全,这批数据也不负责解释。

再看服务端这一段。它是 TLS 握手完成到收到第一个字节之间的净耗时,对应 DevTools 里 Waiting (TTFB) 的主体,也是不少教程笼统归给服务器慢的地方。表里 example.com 两源 264.933 与 256.400,差得不多;www.baidu.com 28.797 与 4.400;www.cloudflare.com 168.765 与 366.400。同一个目标换出口,这一段也在变。

累计值不是该段耗时,这是读表 1 最容易踩的坑。curl 吐出来的 time_namelookup、time_connect、time_appconnect、time_starttransfer、time_total 都是从请求发起算起的累计秒数,一路只增不减。要拿到每段净耗时,得把相邻两个累计值相减。

表 2 五个累计值怎么相减得到五段净耗时

段 算法 对应含义
DNS time_namelookup 域名解析到 IP
TCP time_connect − time_namelookup 与对端建连
TLS time_appconnect − time_connect TLS 握手完成
服务端(首字节) time_starttransfer − time_appconnect 后端处理到吐出首字节
传输 time_total − time_starttransfer 收完响应体

表 1 里每个数都是这么减出来的,再乘以 1000 换成毫秒。把 time_total 直接当成传输时间、把 time_starttransfer 当成服务端净耗时,是两种很常见的读错法,后者会把前面 DNS、TCP、TLS 三段全算到服务端头上去。

一条 curl -w 命令把一次 HTTPS 请求拆成 5 段

命令不用长,一股脑把五个累计值打出来就行。命令模板长这样,不是本站某次的输出:

curl -sS -L -o /dev/null --max-time 20 -w 'namelookup=%{time_namelookup} connect=%{time_connect} appconnect=%{time_appconnect} starttransfer=%{time_starttransfer} total=%{time_total} http=%{http_code} ip=%{remote_ip}' https://<目标>/

-o /dev/null 把响应体丢掉,只留计时;-L 跟随重定向;--max-time 20 给单次请求设 20 秒上限。http_code 和 remote_ip 是两个不带计时的字段,用来验这一轮算不算一次正常响应,别把 501 或超时的读数混进对照表。

五个变量里,time_starttransfer 最容易被漏掉。只取 namelookup / connect / appconnect / total 四个值,TLS 握手到首字节这一段就并进了总耗时,服务端处理慢还是响应体大,分不开。补上这一个变量,一次请求才净拆得成 5 段。变量释义可以翻 curl 官方手册,逐个字段的写法在 writeout 变量清单 里也列得全。

每源为什么要跑 5 轮

单跑一次,数字会骗人。表 3 是 example.com 在两个出口各跑 5 轮的总耗时。

表 3 example.com 总耗时 5 轮原始值与 min / 均值 / max(ms)

轮次 广东电信 cn-probe-1 北京阿里云 cn-probe-2
1 717.728 1301.000
2 630.307 2095.000
3 3238.587 740.000
4 692.542 1323.000
5 658.569 1247.000
min 630.307 740.000
均值 1187.547 1341.200
max 3238.587 2095.000

广东第 3 轮冲到 3238.587,其余四轮都在 630.307 到 717.728 之间;北京第 2 轮 2095.000,第 3 轮又落到 740.000。要是只取第一轮,广东 717.728、北京 1301.000,会得出北京慢得多;只取第三轮,结论整个反过来,广东 3238.587 对北京 740.000。单轮抖动能把两源的快慢关系倒过来,所以每个目标每源都跑 5 轮,取均值进表 1,把 min 和 max 留着看波动。

DNS 缓存也是跑多轮的理由。第一次解析可能冷启动,后面几轮命中缓存,namelookup 会小一截。北京出口对 www.baidu.com 的 DNS 五轮都是 4.000,稳得像钉住的;同一出口对 www.cloudflare.com 的 DNS 却从 124.000 一路跑到 2510.000。这种抖动不摊开五轮,看不出来。

我第一次拉这批数据就被第 3 轮那个 3238.587 带偏过,差点当成目标站常态,回头重跑才确认是单轮抖动。这也是「网站打开慢怎么排查」里最不起眼、却最费时间的一步:先把测量本身稳住,再谈哪一段慢。

双源实测:同一个目标,两个出口各慢在哪一段

表 4 把表 1 里两源同目标的每一段相减,取绝对值。数值大的那一段,就是换出口后变化最大的地方。表 4 只列数据包单列过逐段差值的两个目标。

表 4 example.com 与 www.baidu.com 两源逐段差值绝对值(ms)

目标 DNS TCP TLS 服务端 传输
example.com 5.899 202.467 370.499 8.533 0.053
www.baidu.com 4.694 24.158 34.910 24.397 0.290

example.com 这一行,TLS 段差 370.499,是所有差值里最大的一格,TCP 段 202.467 次之,服务端段只有 8.533。换出口后变得最厉害的是 TLS 握手,不是后端处理。www.baidu.com 那一行小得多,最大的一格还是 TLS 的 34.910,服务端 24.397 紧跟着。

两源各自慢在哪一段,得一个目标一个目标看。拿 example.com 说:广东在 TCP 段 415.467、服务端段 264.933,都比北京的 213.000、256.400 大;TLS 段反过来,广东 497.101 比北京 867.600 小。这一个目标,广东慢在 TCP 和服务端,北京慢在 TLS,段落是错开的。 www.baidu.com 是另一种样子:广东 TLS 130.310 对北京 95.400,两源都是 TLS 段占了大头,只是幅度不同,而且两源解析到的 IP 并不相同,广东是 180.101.49.44,北京是 220.181.111.232。example.com 倒恰好相反,两源都解析到 104.20.23.154。

不看清是哪一段,光说网站打开慢或者这个出口快,两边都对不上。这才是双源对照最有用的一格。

两源结论对不上时怎么分流

只在一个网络里测,最容易把出口问题当成服务器问题。有人从自己办公室拉一条线测出 Waiting (TTFB) 很长,就认定后端该优化,回头加机器、加缓存,钱花了,慢还在。表 4 给了个更省事的分流办法:同一目标换第二个出口复测,服务端段两源都高,才往后端处理上查;服务端段一个高一个低,或者偏高的始终是 DNS、TCP、TLS 这几段,先别动服务器,去看出站链路。

举个更贴表的:example.com 的服务端段 264.933 与 256.400,两源几乎齐平,这种就该往 TLS 段 497.101 与 867.600 上追。www.baidu.com 广东 TLS 130.310、北京 95.400,占各自总耗时 196.049 与 107.600 的主体,这一段两源都高,跟证书链、握手往返有关,和后端代码快慢不是一回事。

拿不准该往哪一层继续,VPS 测评与实测归档 里按层分过类,可以顺着找同一层的其它记录。

cloudflare.com 这一组:传输段大得反常

表 1 最后两行值得单独拎出来。www.cloudflare.com 的传输段,广东 3569.944,北京 2031.200,都是各自六列里最大的一段,比各自的 TLS 段 318.307 和 889.800 还大;两源总耗时 4427.000 与 4137.600,主要就压在这一段上。

北京那一侧还有一处怪:DNS 段 5 轮均值 601.400,min 124.000、max 2510.000,第 5 轮冲到 2510.000 把均值整个抬起来。广东 DNS 段均值 1.558,min 1.176、max 1.769,五轮稳得很。同一个目标,一个出口 DNS 平滑,另一个出口单轮抖出 2510.000,这种差异跟目标站本身快不快无关,是这次从这两个出口看出去的读数。

传输段大,直观看是响应体收得久。为什么久,是响应体本身大、分片多、还是传到一半链路慢,curl 单请求拆不出来,这批数据也没采响应体大小和并发数。能写进结论的只有一句:这个目标在这两个出口上,慢主要落在传输段,不在服务端段。再往下推就出界了。

五段各自慢,分别往哪查

表 5 把五段和优先方向对上号。方向只给个头,具体怎么查不在这篇展开。

表 5 哪一段偏高、往哪个方向查

偏高的段 大致含义 优先方向
DNS 域名解析到 IP 慢 解析链路,见 DNS 解析慢怎么排查
TCP 建连往返慢 链路与去程路径,见 延迟怎么测才准、去程路由怎么查
TLS 握手与证书链慢 证书链是否完整、有没有会话复用
服务端 TLS 完成到首字节慢 后端处理,这台机器有没有在满载,见 负载高怎么排查
传输 首字节到收完慢 响应体大小与传输过程

TLS 段值得多说一句。example.com 和 www.baidu.com 这四个出口读数里,TLS 都是除总耗时外最大的一段;到了 www.cloudflare.com,两源最大的一段换成了传输。它在 DevTools 的 Waterfall 里常和 Waiting (TTFB) 挤在一块,容易被一并记到服务器慢头上。表 2 那道减法把它单独切出来,才知道这段是握手,不是后端在算。

用这批数据定位,顺序其实很短

VPS 网站打开慢怎么排查,动作都围着这张五段表转:在客户端跑一次带五个累计值的 curl,相邻值相减得到 5 段,找出最大的那一段,照表 5 定方向,再换第二个出口对同一目标复测一遍,看这一段是不是两源都高。确认了才决定动哪里。多数人卡在跳过复测那一步,拿着单出口的读数去改后端。

动手前还有两件更靠前的事:确认目标端口通,确认机器时间没跑偏。端口不通、证书因为时间偏差验不过,五段表根本跑不出正常的 200,读数也就没有意义。这两层分别归 端口不通怎么排查 和 时间不准怎么排查,这里只点一句,不展开。

确认完还慢,问题又落在出口这一侧,按网络与机房归过的商家清单 可以拿来对照。

这批数据给不了的结论

先把最容易混的一条说清:ICMP 往返延迟不等于一次 HTTP 事务耗时。ping 快,网页照样可能慢,因为 ping 不建连、不握手、不取响应体,量的是另一件事。tracepath 只作去程路径旁证,也不保证每一跳都回显。这两样本批只用来标注环境,没进过表 1。

再往下几条,一次性说完。测的是公开目标,不是任何商家在售机器,不能拿它排哪家 VPS 打开快,也不能反推某条线路质量。curl 单请求不等于页面完全加载,浏览器首屏、DOMContentLoaded、并发、p95 这些数字,本批一个都没有。两个出口都在中国大陆,结论只覆盖这两个不同运营商出口,不往更多出口、更多地区上推;机器性能层的 CPU、磁盘、带宽跑分同样没测,不给。

两个没取得正常响应的目标

www.qq.com 两源 5 轮的 http_code 都是 501,没有一次 200。这种响应不是一次正常的页面事务,分段读数不进表 1 的对照,也不拿它反推服务可用性,就写本次未取得可用的正常响应分段数据。www.wikipedia.org 那组更干脆:广东出口连到 20 秒超时,北京出口解析到 IPv6 地址后报网络不可达,两源 5 轮 http_code 都是 0。这两组都记作本次未取得,不补数、不估算、不拿别的目标顶替。

采集口径与留痕

两个源的标签写死,方便逐条回溯:cn-probe-1 是 103.39.226.31,中国广东电信 AS4816 单线;cn-probe-2 是 8.140.30.240,中国北京阿里云 AS37963 BGP 多线,两台都在中国大陆,全程只读。首轮 ping 采样 2026-11-14 15:51:29 +0800,两源 curl 采样的 stamp 是 2026-11-14 15:57:27 +0800。每源每目标 5 轮,命令模板就是前面那条 curl -w,带 --max-time 20,只对公开目标发 GET。原始输出留在 ops/_20261114_http5.json,五段数值都能在这份留痕里逐条对上。

真到排障无果、想换台机器重测那一步,优惠券与在售套餐 按预算挑就行,别急着按某一次 curl 的读数下单。

VPS 网站打开慢怎么排查,说到底就一句:先把一次请求净拆成五段,再换第二个出口复测同一段,两源都高才动对应的那一层。只拿单出口单轮的 TTFB 去加 CPU,多数时候改不到点上。

常见问题

为什么我测网站打开慢,和别人测的结果对不上?

出口不一样。表 3 里 example.com 广东第 3 轮 3238.587、北京第 3 轮 740.000,同一轮两个出口差得很远;换一轮,快慢关系又会翻。别人从哪个出口、哪个时段、单轮还是多轮,都会改结果。把源标签、采集时间、命令一起写进结论,两边才对得上。

TTFB 高,是不是一定服务器慢?

不一定。表 2 把 TLS 握手到首字节这一段单独切出来,才是服务端净耗时;DevTools 里 Waiting (TTFB) 那条常把 TLS 握手也裹进去。表 1 里 example.com 两源服务端段 264.933 与 256.400,差得不多,反倒是 TLS 段 497.101 与 867.600 拉开了距离。先减出五段再下结论。

只有两个出口,够不够给网站打开慢下结论?

只够覆盖这两个出口。够不够看要答什么:回答同一个网站换出口哪一段慢,两个源就成立,表 4 的差值也是这么来的;要推更多出口、更多地区的普遍快慢,这两个源撑不住,照实写覆盖不到,不往外推。

ping 很快,网页还是打开慢,问题在哪?

ping 量的是 ICMP 往返,不建连、不握手、不收响应体。表 1 里 www.baidu.com 北京总耗时 107.600,其中 TLS 段就占 95.400,这段 ping 完全照不见。按五段表看,比盯着 ping 值有用。

换 DNS 能不能解决网站打开慢?

得看慢在哪一段。表 1 里 DNS 段大多是几毫秒:example.com 9.899 与 4.000,www.baidu.com 8.694 与 4.000,www.cloudflare.com 广东 1.558,换 DNS 能省的有限。北京对 www.cloudflare.com 的 DNS 段均值 601.400 是单轮 2510.000 拉起来的个例。TLS、服务端、传输这几段高,换 DNS 不对症。

HTTP 501 和超时的目标,怎么处理?

不进对照表。www.qq.com 两源 5 轮都是 501,www.wikipedia.org 广东 20 秒超时、北京 IPv6 地址网络不可达,都记作本次未取得可用的正常响应分段数据。不补数、不估算、不拿别的目标顶替,也不据此说服务不可用。只有 http_code 全是 200 的三个目标进了表 1 的对照。

V P S , V P S 网 站 打 开 慢 怎 么 排 查 , T T F B 高 , c u r l - w , t i m e _ s t a r t t r a n s f e r , T L S 握 手 耗 时 , 分 段 计 时 , 双 源 实 测

🔍猜你喜欢