时间API

TSC

TSC(Time Stamp Counter,时间戳计数器)是现代 CPU 中一个非常底层的硬件计数器,用来记录自 CPU 上电以来经过的时钟周期数

TSC 本质上是一个 64 位寄存器,通常位于 CPU 内部,每当 CPU 时钟周期推进一次,它的值就 +1(在现代 CPU 中已经不完全等价于“每个核心周期”,但概念上仍是“高精度单调计数器”)。

在 x86 架构中,可以通过指令读取:

  • RDTSC(Read Time Stamp Counter)

TSC 常用于性能分析,因为它的分辨率非常高(纳秒级甚至更细)。

操作系统、数据库(比如 MySQL InnoDB)、高性能网络系统都会用 TSC 做:

  • 函数耗时统计
  • lock contention 分析
  • cache miss 成本分析

TSC ≠ wall clock time

vDSO优化

vDSI是linux提供的一种机制,把一部分内核提供的只读系统调用映射到用户态的空间里,让用户态直接调用,而不需要陷入内核。vDSO = “内核提前帮你准备好的用户态函数库(但数据由内核更新)”

典型函数包括:

  • gettimeofday
  • clock_gettime
  • time

传统路径:

用户态函数调用
→ syscall 指令
→ CPU 切换到内核态
→ 内核处理
→ 返回用户态

问题在于:

  • syscall 有 上下文切换成本
  • 需要保存/恢复寄存器
  • 可能污染 CPU cache / pipeline
  • 高频时间查询会非常昂贵

比如:

一个高性能服务每秒可能调用 clock_gettime 上千万次

具体方式:

  • 内核在进程地址空间映射一段“只读共享代码”
  • 用户态直接调用这些函数
  • 不发生 syscall
  • 数据仍由内核更新(比如时间)

Linux CLOCK_MONOTONIC

CLOCK_MONOTONIC是Linux 提供的一种单调递增时钟,用于测量时间间隔,而不是表示当前真实时间。他的关键特性是:时间只会向前走不会因为系统时间被修改而改变。

类型含义是否受系统时间影响
CLOCK_REALTIME真实世界时间(Unix time)会(NTP、手动修改会跳变)
CLOCK_MONOTONIC单调时间(从某个起点开始计时)不会

CLOCK_MONOTONIC 的起点是:

系统启动(boot)之后的某个未定义时间点

注意:

  • 不等于 Unix epoch(1970)
  • 不可预测
  • 只保证单调递增

他不能跨机器比较。也不能转换成unix时间戳。它不是时间而是时间差工具。

Last modification:May 8, 2026
如果觉得我的文章对你有用,请随意赞赏