内存管理及优化

各种教程·supo的文章 · 3 天前 · 30 人浏览

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位置被新数据覆盖时写入

缓存与主存映射方式

  1. 直接映射
  2. 全映射
  3. 组映射:将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(内存管理单元)

内存状态与回收

  • 内存页状态
    1. Free:空闲可分配
    2. Inactive Clean:已同步到磁盘 buff/cache
    3. Inactive Dirty:未同步脏数据(需sync强制回收) /proc/meminfo 中的 Dirty
    4. 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 没有脏数据

内存
Theme Jasmine by Kent Liao