CPU Cache
- L1d cache: 32K
- L1i cache: 32K
- L2 cache: 256K
- L3 cache: 12288K
核心概念
- 主存中获取顺序:
L1 → L2 → L3 → 主存 - Cache Hit:程序运行时在缓存中的命中比率
- Cache Miss:缓存未命中率
- _冷丢失_:首次运行程序需读取缓存
- _空间原因_:缓存已满,需按访问热度置换数据(如LRU算法)
关键问题
Q1: CPU多核心的缓存内容是否一致?
A: 通过MESI协议保证一致性:
- M(Modified)
- E(Exclusive)
- S(Shared)
- I(Invalid)
- 机制:
Cache Line Fill(缓存填充)、Cache Snoop(嗅探)
Q2: CPU Cache修改数据后是否写入主存?
A: 需写入,策略分为:
- 直写式:Cache变化后立即写入主存
- 回写式:仅在Cache位置被新数据覆盖时写入
缓存与主存映射方式
- 直接映射
- 全映射
- 组映射:将Cache与内存分组,提升查找效率
应用程序性能测试
[root@workstation ~]# lab cputuning-cpucache start
[root@servera ~]# yum -y install valgrind
[root@servera ~]# valgrind --tool=cachegrind cache1
[root@servera ~]# valgrind --tool=cachegrind cache2
内存管理
虚拟内存与物理内存
- 最小单位:Page(页)
Page Size: 4KB- 查看页大小:
[root@servera ~]# getconf -a | grep -i pagesize
PAGESIZE 4096
- 地址转换:
- 物理地址空间:43位(x86架构支持4GiB)
- 虚拟地址空间:48位(256TB)
- 转换机制:
MMU(内存管理单元)
内存状态与回收
- 内存页状态:
- Free:空闲可分配
- Inactive Clean:已同步到磁盘 buff/cache
- Inactive Dirty:未同步脏数据(需
sync强制回收) /proc/meminfo 中的 Dirty - Active:使用中不可分配
- 查看内存信息:
查看内存页状态:
[root@servera ~]# cat /proc/meminfo | grep -E "Dirty|Inactive|Active"
[root@servera ~]# cat /proc/meminfo | grep Dirty 查看脏数据
[root@servera ~]# sysctl -a | grep dirty
vm.dirty_expire_centisecs = 3000 # 单位:1/100秒
释放
[root@servera ~]# sync && sysctl -w vm.drop_caches=3
大页(HugePage)
- 配置:
[root@servera ~]# cat /proc/meminfo | grep Huge
Hugepagesize: 2048 kB
[root@servera ~]# echo "vm.nr_hugepages = 10" >> /etc/sysctl.conf
[root@servera ~]# sysctl -p
其他
- IO整合测试:
[root@servera ~]# dd if=/dev/zero of=/tmp/test1 bs=2k count=102400 oflag=direct
使用这条命令 cat /proc/meminfo | grep Dirty 没有脏数据
提供CDN加速/云存储服务