商品详情页性能分析:c6 / c8i / c9i(liucheng + strace)

主题:同一商品详情页在阿里云 c6(~150ms)、c8i(~110ms)、c9i(墙钟待同条件复测)上的耗时拆解与三机 strace 对比
数据来源:


1. 结论摘要

维度c6c8ic9i
墙钟(已知)~150ms~110ms待同条件复测
syscall 合计(不含首行 FPM accept 空闲)84.3ms63.2ms(最优)70.4ms
poll 网络等待37.6ms38.0ms39.9ms(三台最高)
Redis fd=7 poll24.3ms(最慢)19.3ms20.7ms
ES poll(fd=14/13)4.7ms7.7ms10.5ms(最慢)
文件元数据 access+stat+fstat~15.6ms~7.0ms~8.6ms
empty_loading.png open2677
debug logRuntime 写 fd4~282 次~0~0

应用层(三台共性,liucheng 仅 c6){% get_blocks %} ~32ms 仍是最大单点;strace 侧 Redis 重复 GET、md5_file、stat 风暴 在 c8i/c9i 上同样存在,只是 c6 更重。

三机 strace 排序(仅统计请求内 syscall,不含 FPM 等连接)

  1. c8i:syscall 合计最低(63ms),Redis 等待最短。
  2. c9i:介于 c8i 与 c6;CPU/文件侧接近 c8i,但 poll 总量与 ES 等待偏高
  3. c6:syscall 合计最高;叠加 debug 打点 + 冷 worker + md5 26 次

优化目标不变:P0 落地后 c6 有望 ~115–120ms;机型差异无法靠升配完全消除,需 get_blocks / Redis 去重 / Opcache 等代码侧优化。


2. 端到端耗时分布(c6 · liucheng.log

从进控制器到渲染结束约 147ms,与 c6 墙钟 ~150ms 一致。(c8i/c9i 无对应 liucheng,业务路径假定相同。)

阶段耗时说明
中间件 + HomeBase~26ms0 → 25.7ms;utm_source ~2.3ms
控制器 → 开始渲染~5.6ms25.7 → 31.3ms;无细打点
Liquid 准备~12ms设变量/缓存/filter
{% get_blocks %}~32ms72.9 → 104.8ms,应用层最大单点
header / analysis 等 include~24msheader_front_variable ~10.5ms
详情 section + include~50ms碎片 include 累加
{% get_product %} ×2~6–8msES 各 ~3–4ms
footer + 收尾~15ms

2.1 liucheng 最大时间间隙(>1ms)

间隙 (ms)区间说明
31.9get_blocks start → endP0-1
10.5header_front_variable待细拆
5.9get-product 第 1 次ES
5.8filter/tag → 执行渲染前黑盒
5.6控制器 → 模板渲染 startThemeData 等

3. 三机 strace 对比(去掉首行 FPM accept 空闲)

注意strace_c9i.log 首行 accept ~25.25s 为 PHP-FPM 等请求,不计入单次详情页处理;下文「syscall 合计」均排除该行及耗时 >1s 的异常行。

3.1 trace 概览

指标c6c8ic9i
日志行数452843616026
有效 syscall 次数452643596024
syscall 耗时合计84.3ms63.2ms70.4ms
FPM accept 空闲(首行)~22s(部分 trace)~83s(冷启动污染,见旧分析)~25.3s
times 起点 utime(ticks)0(偏冷)40(warm)32(warm)
debug write(4,…cart_in…)28200
普通 write(8,…cart…)077

c9i 比 c8i 多 ~1665 次 syscall,主要在 read(+933)/ fstat / access / open;单次耗时极短(页缓存命中),故 合计仅多 ~7ms,不代表多做了 40% 业务逻辑,更可能是 trace 边界或读路径略长。

3.2 主要 syscall 累计耗时(ms)

syscallc6c8ic9i说明
poll37.6437.9739.90网络等待;c9i 略高
read9.446.099.75c9i 次数多、累计接近 c6
write7.562.361.91c6 含 debug 日志
access5.983.113.44autoload
stat5.340.450.72c6 最重
recvfrom4.114.033.36
fstat3.222.283.03
open2.171.541.90

3.3 按 fd 的 poll(Redis / MySQL / ES)

连接c6c8ic9i
fd=7 Redis24.33ms / 204 poll / 62 send19.31ms / 189 / 5820.74ms / 190 / 57
fd=8 MySQL6.86ms / 15 / 208.87ms / 16 / 216.79ms / 18 / 20
fd=13/14 ES4.74ms(fd=14)7.74ms(fd=13)10.47ms(fd=13)
fd=5(短 Redis 等)1.69ms2.03ms1.87ms
  • Redis:c8i 最优 → c9i → c6;与「重复 GET」优化(P0-3)直接相关。
  • ES:本次样本 c9i 最慢(10.5ms poll),三台都应做 IP 直连 + get_product 去重(P0-2/P1-4)。
  • MySQL:差异 <2ms,不是三机墙钟差距主因。

3.4 文件 IO 与 Opcache 信号

文件/模式c6c8ic9i
empty_loading.png open2677
settings_schema.json open666
vendor/.../elasticsearch access878787
access+stat+fstat 合计~15.6ms~7.0ms~8.6ms

c8i/c9i 在 asset_url/md5stat 上已接近(7 次 open),c6 仍像 冷缓存 + debug 环境。


4. 三机差异解读

4.1 c6 为何最慢(~150ms)

  1. 应用层get_blocks ~32ms(liucheng 实锤)。
  2. debuglogRuntime → 282 次写日志(strace fd4)。
  3. strace:Redis poll 24ms、stat/access 合计 ~15ms、md5 26 次。
  4. workertimes 从 utime=0 起,偏冷启动。

4.2 c8i 为何最快(~110ms)

  1. syscall 合计 最低(63ms),单次 syscall 更快。
  2. Redis poll 最短(19ms)empty_loading 7 次(热态)。
  3. 未开 细粒度 logRuntime;warm worker(utime=40 起)。

4.3 c9i 定位(介于 c8i 与 c6 之间)

相对 c8i说明
更慢syscall 合计 +7ms;poll +2msES fd=13 +2.7ms
接近无 debug 洪水;empty_loading 7 次;文件元数据 ~8.6ms vs 7ms
syscall 次数更多+1665 次以 read 为主,单次极快,对墙钟影响有限

推断:c9i 若墙钟在 ~115–125ms 属合理区间(需你用关 debug、预热 worker 后 Execution-Time 验证)。不能仅凭机型代数认定一定快于 c8i——本次 trace 中 网络 poll 与 ES 等待反而略差于 c8i

4.4 测法对齐(三机公平对比)

检查项要求
APP_DEBUG / logRuntime三台一致(建议全关)
PHP-FPM worker先打 1 次预热,再 strace 第 2 次
strace 解读忽略首行 accept 秒级空闲
指标记录响应头 Execution-Time P50/P95,与 strace 同一次请求

5. 流程优化优先级

product-detail-render-optimization.md 一致(与机型无关,三台同收益)。

P0

预期收益
P0-1 get_blocks + Redis themeConfigs~30ms
P0-2 TagGetProduct static 缓存~3–4ms
P0-3 Redis 请求级去重 / APCu 热点~6–15ms
P0-4 asset_url md5 缓存~2–3ms

P1

Opcache、ScriptService 缓存、ES IP 直连等(见优化主文档)。


6. 验证清单

  1. c6 / c8i / c9i 同条件各 10 次:关 debug、预热 worker、Execution-Time P50/P95。
  2. 补录 c9i 墙钟,与 strace 同一次请求归档。
  3. P0-1 后看 get_blocks 区间是否降至 ~1–2ms。
  4. P0-3 后三机 fd=7 poll 是否均降至 ~15ms 量级。
  5. P0-4 后 empty_loading.png open 是否 ≈1 次/请求

7. 原始数据索引


8. 关联文档