文章转自微信公众号“麻辣软硬件”:https://www.toutiao.com/i6704524697280709133/

本文的主要内容:
  1. 操作系统中的内存管理是怎样的
  2. 物理内存的性能指标的影响因素

从free说起

以centos7为例,free命令结果如下:

[root@lh ~]# free -w
total used free shared buffers cache available
Mem: 24473612 482400 23777212 17532 2108 211892 23665672
Swap: 12320764 0 12320764

从结果中,我们可以看出:

total = used + free + buffers + cache

total、used自不必说,其他字段意义如下:

shared:多进程共享内存数

buffers/cache:缓存内存数,物理内存不足时,系统会释放一部分缓存

free:空余内存数

available:可用内存数

swap: 交换分区,将不常用的数据置换到磁盘

为了进一步理解这几个概念,就从内存的空间模型说起。

操作系统中的内存

内存的空间模型

性能分析基础知识(2):内存

在内存中运行的每个进程都需要使用到内存,但是不是每个进行都需要每时每刻都使用系统分配的内存空间。

当系统所需内存超过实际的物理内存时,内核会释放某些进程所"占用但未使用"的物理内存,把这些资料存储在磁盘上,并将释放出来的内存提供给有需要进程使用。

进程的空间模型展示的是进程所使用的逻辑内存。换句话说,如果你的程序每sleep一段时间后打印一次内存的地址空间,就会发现,进程的地址空间并未改变,但对应的物理内存的地址可能已经改变很多次了。

虚拟内存管理与周边系统关系

性能分析基础知识(2):内存
  • 内存管理系统负责文件 Cache 的分配和回收,同时虚拟内存管理系统(VMM)则允许应用程序和文件 Cache 之间通过 memory map的方式交换数据
  • 虚拟文件系统VFS负责在应用程序和文件 Cache 之间通过 read/write 等接口交换数据
  • 具体文件系统,如 ext2/ext3、jfs、ntfs 等,负责在文件 Cache和存储设备之间交换数据

Cache、文件及磁盘间关系

性能分析基础知识(2):内存
  • 文件Cache分为两个层面,Page Cache和Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。
  • 内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用 memory map 方式访问时负责建立映射;VFS 负责 Page Cache 与用户空间的数据交换。
  • 具体文件系统一般只与 Buffer Cache 交互,它们负责在外围存储设备和 Buffer Cache 之间交换数据。

交换分区

为了满足物理内存不足而利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的空间。

交换机制如下:
  • Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么需要内存,Linux也会交换出暂时不用的内存页面,这样的可以避免等待交换所需的时间。
  • Linux内存管理中,通过调页paging和交换swapping来完成上述的内存调度。调页算法是把内存中最近不常使用的页面换到磁盘中,把活动页面保留在内存中供进程使用。
  • 分页写入磁盘的过程为:page-out,分页从硬盘重新回到内存的过程被称为page-in,内核需要一个分页的时候,发现此分页不再内存中,就会发生page fault。

内存性能指标

性能分析基础知识(2):内存

内存容量

容量越大,性能越好。但也需要和主板、操作系统等配套。

在Windows中我们可以通过命令行查看出当前系统支持的最大内存是多少:

C:\Users\SOMEONE>wmic memphysical get maxcapacity
MaxCapacity
16777216

命令结果的单位为KB,因此,此电脑支持的最大内存为16GB

内存等待时间


性能分析基础知识(2):内存

内存等待时间,表示系统进入数据存取操作就绪状态前等待内存响应的时间。

目前业界优化的方式有:
  • 多级缓存和预取技术
  • 多线程及乱序执行技术
  • 集成式内存控制器
  • 内存集成到处理器中

内存带宽

内存带宽=(传输倍率×总线位宽×工作频率)÷8

内存总线位宽:受内存引脚数量的限制,可将内存集成到处理器中,摆脱限制

内存工作频率:受芯片发热和工艺限制

内存传输倍率:DDR是SDRAM的2倍

目前各代内存的指标如下:

性能分析基础知识(2):内存

总结

从开发角度看

在性能要求高的情况下编程,我们应该注意:
  1. 尽量使用内存池,避免频繁地申请和释放内存;
  2. 热度比较高的内容应缓存在内存中,避免频繁地从磁盘中读取。

从测试的角度看

磁盘的性能测试过程中,进程读取的数据有可能在磁盘,也有可能在内存,导致测试结果时好时坏,所以在测试过程中应该注意:
  1. 在不要求精确的情况下,尽量让读写的数据大小远大于内存容量;
  2. 在要求精确的情况下,应使用特定的工具如iozone、fio等,开启从磁盘直接读取的模式进行测试;
  3. 在进行分布式系统的性能测试时,应该注意分析清楚服务端和客户端双方的内存缓存带来的影响,然后再设置相应的测试方案。
posted on 2019-12-27 09:59  淡然~~浅笑  阅读(311)  评论(0编辑  收藏  举报