536 字
2 分钟
为什么 CPU 访问硬盘很慢
CPU 的运算速度极快,但访问硬盘却需要毫秒级延迟。为什么 CPU 访问硬盘这么慢?从存储层次说起。
一、存储层次结构
1.1 存储金字塔
flowchart TB
subgraph 速度最快,容量最小
CPU1[CPU 寄存器]
Cache1[L1 Cache]
Cache2[L2 Cache]
Cache3[L3 Cache]
end
subgraph 速度中等,容量中等
M[主内存<br/>DDR RAM]
end
subgraph 速度慢,容量大
SSD[SSD]
end
subgraph 速度最慢,容量最大
HDD[机械硬盘]
end
CPU1 --> Cache1 --> Cache2 --> Cache3 --> M --> SSD --> HDD
CPU1 -.-|~1 ns| CPU1
Cache1 -.-|~1 ns| Cache1
M -.-|~100 ns| M
SSD -.-|~100 μs| SSD
HDD -.-|~10 ms| HDD
style CPU1 fill:#f96
style Cache1 fill:#ff9
style Cache2 fill:#ff9
style Cache3 fill:#ff9
style M fill:#9f9
style SSD fill:#9f9
style HDD fill:#f66
1.2 访问延迟对比
| 存储类型 | 访问延迟 | 相对速度 |
|---|---|---|
| CPU 寄存器 | 0.3 ns | 1x |
| L1 Cache | 1 ns | 3x |
| L2 Cache | 3 ns | 10x |
| L3 Cache | 10 ns | 30x |
| 主内存 (RAM) | 100 ns | 300x |
| NVMe SSD | 10 μs | 30,000x |
| SATA SSD | 100 μs | 300,000x |
| 机械硬盘 | 10 ms | 30,000,000x |
10ms vs 0.3ns = 3300 万倍!
二、为什么硬盘这么慢?
2.1 机械硬盘的工作原理
flowchart LR
subgraph 机械硬盘内部
P[盘片<br/>旋转中]
A[机械臂]
H[磁头]
end
P -->|旋转 7200 RPM| R[7200 转/分]
A -->|移动| S[寻道]
H -->|读写| D[磁盘表面]
Note over R: 盘片旋转延迟
Note over S: 磁头寻道延迟
机械硬盘延迟的来源:
| 延迟来源 | 典型值 | | ------------ | ------------------ | -------- | | 旋转延迟 | 盘片旋转到正确位置 | ~4-8 ms | | 寻道延迟 | 磁头移动到磁道 | ~3-10 ms | | 传输延迟 | 数据读写 | ~0.5 ms |
2.2 SSD 为什么更快
flowchart LR
subgraph SSD 内部
F[Flash 控制器]
N[NAND Flash 芯片]
end
F -->|并行读写| N
Note: SSD 没有机械运动<br/>只有电子操作
| SSD 延迟 | 典型值 |
|---|---|
| 读取延迟 | 0.1-0.2 ms |
| 写入延迟 | 0.1-0.5 ms |
三、CPU 与硬盘的通信
3.1 DMA 机制
sequenceDiagram
participant CPU as CPU
participant DMA as DMA 控制器
participant DISK as 硬盘
CPU->>DMA: 设置传输参数
DMA->>DISK: 发起读取请求
DISK->>DMA: 传输数据到内存
DMA->>CPU: 传输完成中断
Note over CPU: 可以继续做其他事
3.2 为什么不能直接访问硬盘
CPU 不能直接"读取"硬盘数据,原因:1. CPU 只能访问内存地址空间2. 硬盘数据必须先加载到内存3. 这个过程涉及 I/O 总线和 DMA四、延迟的可视化
4.1 如果 CPU 等硬盘
# 如果 CPU 等待硬盘会怎样?
cpu_cycle = 0.3 # nshdd_latency = 10_000_000 # ns
# CPU 在等待期间可以执行cycles_wasted = hdd_latency / cpu_cycleprint(f"CPU 白白等待期间可以执行 {cycles_wasted:,} 个周期")# 33,333,333 个周期!
# 相当于# 1 GHz CPU 可以执行 10^9 周期/秒# 等待 10ms = 等待 10,000,000 个周期# 在 1 GHz CPU 上 = 10 毫秒4.2 延迟等效换算
| 硬盘延迟 | 等效 CPU 等待 |
|---|---|
| 10 ms | 一个人等 7 个月 |
| 100 ms | 一个人等 6 年 |
| 1 s | 一个人等 60 年 |
五、如何隐藏硬盘延迟
5.1 预读取(Prefetch)
flowchart LR
A[读取文件] --> B{预测未来读取}
B -->|是| P[预读取到缓存]
B -->|否| D[立即读取]
P --> C[使用缓存]
D --> C
5.2 异步 I/O
# 异步 I/O 避免阻塞import asyncio
async def read_file(): # 发起读取,不阻塞 data = await aiofiles.open('large_file', 'r') return data
# CPU 可以在等待期间做其他工作5.3 缓存
# 多级缓存memory_cache = {} # 内存缓存
def read_data(key): if key in memory_cache: return memory_cache[key] # 内存命中,~100ns
# 从 SSD 读取,~100μs data = ssd_read(key) memory_cache[key] = data return data六、总结
6.1 硬盘延迟如此高的原因
| 原因 | 说明 |
|---|---|
| 机械运动 | 磁盘旋转 + 磁头寻道 |
| 物理限制 | 机械运动速度有上限 |
| 总线传输 | I/O 总线带宽有限 |
6.2 存储层次的意义
| 层次 | 作用 |
|---|---|
| 寄存器 | CPU 直接访问,零延迟 |
| Cache | 缓存热点数据 |
| 内存 | 主存储,运行数据 |
| SSD | 快速持久存储 |
| HDD | 大容量冷存储 |
核心观点:存储层次是性能和容量的平衡。越快的存储越贵、容量越小,因此需要通过缓存和预取等技术来隐藏延迟。
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时
相关文章 智能推荐
1
为什么 CDN 能加速访问
技术科普 深入解析 CDN 加速的核心原理,理解边缘缓存、智能解析与就近接入的技术实现。
2
为什么 HugePages 可以提升数据库性能
技术科普 深入解析 HugePages 如何提升数据库性能,TLB 缓存的工作原理。
3
CPU 全景:为什么后端工程师需要理解 CPU
CPU与计算机体系结构 从后端工程师的视角俯瞰现代 CPU——内存墙、摩尔定律的终结、多核趋势、微架构概览,以及为什么理解 CPU 体系结构是性能优化的必修课。
4
为什么 PostgreSQL 使用 MVCC
技术科普 深入解析多版本并发控制的设计原理,理解 PostgreSQL 如何实现高并发事务处理。
5
为什么 DNS 使用 UDP 协议
技术科普 深入解析 DNS 协议为什么主要使用 UDP,以及什么时候会切换到 TCP,DNS 协议设计的精妙之处。






