关键延迟速查手册

计算机延迟天梯图

单位换算

时间单位

1 秒(s) = 103 毫秒(ms) = 106 微秒(μs) = 109 纳秒(ns) = 1012 皮秒(ns)
1 秒(s) = 1000毫秒(ms) = 100万微秒(μs) = 10亿纳秒(ns) = 1万亿皮秒(ps)

频率单位

1 太赫兹(THz) = 103 吉赫兹(GHz) = 106 兆赫兹(MHz) = 109 千赫兹(kHz) = 1012 赫兹(Hz)
1 太赫兹(THz) = 1000 吉赫兹(GHz) = 100万 兆赫兹(MHz) = 10亿 千赫兹(kHz) = 1万亿 赫兹(Hz)

天梯图

操作类型 近似延迟 对比比例 (以1ns为基准) 典型场景与说明
1个CPU时钟周期 (3GHz) 0.33 ns ~1x 现代CPU的基本时间单位
L1缓存访问(SRAM) ~1 ns ~3x 片上缓存,每个核心独享,极速
分支预测错误惩罚 ~5 ns ~15x 导致流水线清空,性能关键
L2缓存访问(SRAM) ~4 ns ~12x 容量比L1大,速度稍慢,片上缓存,通常核心独享
L3缓存访问(SRAM) ~15 ns ~45x 所有核心共享的最后一级缓存
互斥锁/信号量 (无竞争) ~20 ns ~60x 最简单的锁操作开销,单次原子指令操作,理想情况
协程上下文切换 (用户态) ~50 ns ~150x 仅在用户态交换寄存器(如寄存器切换)
主内存访问 (DRAM) ~100 ns ~300x 内存访问的基准线
QPI/UPI总线传输 ~150 ns ~450x 多CPU插槽间通信
GPU显存访问 (HBM) ~150 ns ~450x 高性能显卡内存,带宽极高
内存分配 (malloc) ~200 ns ~600x 在堆上分配小内存块
PMem (Optane) 访问 ~300 ns ~900x 持久内存,介于DRAM和SSD之间
互斥锁/信号量 (轻度竞争) ~500 ns ~1,500x 用户态自旋等待,短时间竞争
RDMA读取 (RoCE v2) ~1,000 ns (1 μs) ~3,000x 远程直接内存访问,绕过CPU和OS
线程上下文切换 (同进程) ~1,500 ns (1.5 μs) ~4,500x 切换线程需要进入内核态,但虚拟内存空间不变
进程上下文切换 ~5,000 ns (5 μs) ~15,000x 最重的切换,需切换虚拟内存空间,导致TLB刷新
Zippy/Snappy压缩 1KB ~5,000 ns (5 μs) ~15,000x 低延迟压缩算法
互斥锁/信号量 (高竞争) ~10,000 ns (10 μs) ~30,000x 系统调用、线程挂起与调度开销
数据库简单查询 (内存中) ~10,000 ns (10 μs) ~30,000x 基于内存索引的简单查询
万兆网络传输 (1KB) ~12,000 ns (12 μs) ~36,000x 10Gbps局域网,小包延迟
海盗船 MP600 NVME SSD 随机写 (4KB) ~20,000 ns (20 μs) ~60,606x 存储访问的基准线 (高性能SSD)
海盗船 MP600 NVME SSD 随机读 (4KB) ~26,000 ns (26 μs) ~78,788x 存储访问的基准线 (高性能SSD)
千兆网络传输 (1KB) ~30,000 ns (30 μs) ~90,000x 1Gbps局域网,小包延迟
本地TCP连接建立 ~50,000 ns (50 μs) ~150,000x 本地localhost三次握手
金士顿 A400 SATA3 SSD 随机读 (4KB) ~76,000 ns (76 μs) ~230,303x 消费级SSD的典型延迟
金士顿 A400 SATA3 SSD 随机写 (4KB) ~209,000 ns (209 μs) ~633,333x 消费级SSD的典型延迟
SSD顺序读 (1MB) ~300,000 ns (300 μs) ~900,000x 连续读取大块数据
数据库事务提交 ~1,000,000 ns (1 ms) ~3Mx 写日志、刷盘等完整操作
TLS握手 (RSA2048) ~5,000,000 ns (5 ms) ~15Mx 建立安全连接的密码学开销
机械硬盘寻道 (HDD) ~5,000,000 ns (5 ms) ~15Mx 磁头移动到正确磁道的延迟
机械硬盘 HDD 随机写 (4KB) ~11,000,000 ns (11 ms) ~33Mx 机械硬盘的延迟
机械硬盘 HDD 随机读 (4KB) ~15,000,000 ns (15 ms) ~45Mx 机械硬盘的延迟
Docker容器启动 (预热) ~100,000,000 ns (100 ms) ~300Mx 容器运行时启动新实例
AWS Lambda冷启动 ~500,000,000 ns (500 ms) ~1.5Bx 云函数初始化及部署代码
中国↔美国网络往返 (RTT) ~200,000,000 ns (200 ms) ~600Mx 光速物理限制,无法避免
远程TCP连接建立 ~300,000,000 ns (300 ms) ~900Mx 跨地域网络的三次握手
虚拟机启动 (轻度) ~2,000,000,000 ns (2 s) ~6Bx 启动一个微型虚拟机

信号量洞察:

从表格中可以清晰看到,锁的性能开销范围极大:

  1. 无竞争 (~20 ns):与L3缓存访问同数量级,开销极小。
  2. 轻度竞争 (~500 ns):开销上升约25倍,与内存访问和总线传输同数量级。
  3. 高竞争 (~10,000 ns/10 μs):开销比无竞争时高出500倍,与一次系统上下文切换的开销相当。这直观地展示了为什么高竞争锁会成为多线程性能的“杀手”。

上下文切换洞察:

  1. 协程 (Coroutine) / 用户态线程 (Fiber) 切换 (~50 ns)
    • 开销最低:因为切换操作完全在用户态进行,本质上是保存和恢复寄存器的操作(如程序计数器、栈指针)。
    • 无内核参与:不需要系统调用,不涉及内核调度器。
    • 缓存友好:通常在同一个内核线程上切换,缓存局部性更好。
    • 应用:高并发网络编程(如Golang goroutine, Erlang process)。
  2. 线程 (Thread) 切换 (~1.5 μs)
    • 必须进入内核态:由内核调度器(Scheduler)负责切换,需要一次模式切换
    • 虚拟内存空间不变:属于同一个进程的线程共享相同的虚拟地址空间,因此不需要切换页表(CR3寄存器),这是它比进程切换快得多的主要原因。
    • 开销来源:系统调用 + 保存/恢复寄存器 + 内核调度逻辑。
  3. 进程 (Process) 切换 (~5 μs 或更高)
    • 开销最大:是最重的上下文切换。
    • 切换虚拟内存空间:不同进程有独立的虚拟地址空间。切换时必须更换页表基址寄存器(如x86的CR3),这会导致TLB(快表)被刷新或需要ASID支持,后续内存访问会产生大量Cache Miss,这是最昂贵的部分。
    • 其他开销:同样需要保存/恢复寄存器、内核调度,以及可能需要的其他资源切换。

总结对比:

使用本表

  1. 建立直觉:记住关键基准线的倍数关系
    • L1缓存内存快约100倍
    • 内存NVMe SSD快约200倍
    • NVMe SSDHDD 快约200倍(随机IO)
    • 本地网络跨国网络快约10000倍
  2. 指导设计
    • 优化算法:减少CPU缓存未命中(Cache Miss)和分支预测错误。
    • 选择存储:根据延迟要求选择内存、SSD或HDD。
    • 设计架构:理解网络延迟是分布式系统的主要开销,尽量数据本地化、批处理和异步化。
  3. 注意上下文
    • 所有数值均为典型近似值
    • 实际延迟受硬件型号、软件实现、系统负载、数据大小和配置影响巨大。
    • 此表旨在提供数量级(Order of Magnitude) 的直观感受,而非精确的性能指标。