内存原理

内存主要是用来存储系统和应用程序的指令、数据和缓存等

Swap 原理

简单的说就是把磁盘或文件当成内存来使用,包括换出和换入两个过程。 Swap 分区和 Swap 文件

内存调优

内存调优最重要的就是,保证应用程序的热点数据放到内存中,并尽量减少换页和交换。
常见优化思路:

  1. 最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
  2. 减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。
  3. 尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用 Redis 这类的外部缓存组件,优化数据的访问。
  4. 使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。
  5. 通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM 杀死。


概念

  • 虚拟地址空间
    • 内核空间
    • 用户空间

虚拟内存
物理内存
内存映射:将虚拟内存地址映射到物理内存地址,
页表:内核为每个进程维护一张页表,记录虚拟地址与物理地址的映射关系,实际存储在CPU 的内存管理单元MMU中
页:内存映射的最小单位,通常是4KB
多级页表机制和大页机制:Linux 用来解决页表项过多的问题

缓存
缓存区


文件页(File-backed Page)
脏页:被应用程序修改,并且暂时没有被写入磁盘的数据,
匿名页(Anonymous Page)

虚拟内存的空间分布

内存分配和回收

Buffer 是对读写磁盘数据的缓存,Cache 是对读写文件数据的缓存,设计的目的是提升系统I/O性能

直接内存回收:一个最容易想到的场景就是,有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内存(比如前面提到的缓存),进而尽可能地满足新内存请求。

NUMA (Non-Uniform Memory Access)架构

案例

内存泄漏

场景延申
MySQL:https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

补充

centos bcc-tool 工具安装
rpm -qa |grep kerner,先查找系统内核版本,网上查找相应的匹配kerner-devel包,及时没有相同版本也不要紧,比如5.0.5-1的版本就是我系统的版本网上找了没有这个版本对应的kerner-devel包但是不知道为什么升级了会安装这个版本,我系统升级前centos7.3,升级后7.6。我就下载了5.0.5-3并安装,然后版本的,找到对应的包版本,rpm -ql 包版本,做个软连接就OK。至此bcc已经安装完成。做为一个linux运维我都装了2天,可想而知大家。此方法亲测centos7.3

内存性能指标

Part Ⅲ | 内存性能篇 - 图1

工具

Part Ⅲ | 内存性能篇 - 图2

Part Ⅲ | 内存性能篇 - 图3

分析流程

Part Ⅲ | 内存性能篇 - 图4