时间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 = “内核提前帮你准备好的用户态函数库(但数据由内核更新)”
典型函数包括:
gettimeofdayclock_gettimetime
传统路径:
用户态函数调用
→ 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时间戳。它不是时间而是时间差工具。