Linux性能优化实战学习笔记:第十九讲

1、Swap 原理

前面提到,Swap 说白了就是把一块磁盘空间或者一个本地文件(如下讲解以磁盘为例),当成内存来使用。它包括换出和换入两个过程node

一、所谓换出

就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。缓存

二、换入

则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来bash

因此你看,Swap 实际上是把系统的可用内存变大了。这样,即便服务器的内存不足,也能够运行大内存的应用程序服务器

三、应用场景

便是内存不足时,有些程序也并不像被OOM杀死,二十但愿能缓一段时间,等待人工介入,或者等系统自动释放其余程序的内存,再分配给它(能够给运维人员处理故障一个缓冲的时间)架构

常见的笔记本电脑休眠和快速开机的功能,也基于Swap ,休眠时,把系统内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就能够,这样就省去了不少应用程序的初始化过程,加快了开机速度app

2、那么 Linux 到底在何时须要回收内存呢?

一、直接内存回收

有新的大块内存分配请求,可是剩余内存不足,这个时候系统就须要回收一部份内存(好比前面提到的缓存),进而尽量地知足新内存请求,这个过程被称为直接内存回收运维

二、kswapd0(按期回收内存)

一、剩余内存页<最小阈值

root@openstack:~#  free -h
              total        used        free      shared  buff/cache   available
Mem:           4.9G        114M        4.0G        992K        770M        4.5G
Swap:          3.9G          0B        3.9G
root@openstack:~# cat /proc/sys/vm/min_free_kbytes
67584

说明进程可用内存都耗尽了,只有内核才能够分配内存spa

二、页最小阈值<剩余内存页<页低阈值

内存压力比较大,剩余内存很少了,这是kswapd0会执行内存回收,直接剩余内存大于高阈值为止orm

三、页低阈值<剩余内存<页高阈值

说明有必定压力,但还能够知足新内存请求blog

四、剩余内存>页高阈值

说明剩余内存比较多,没有内存压力

watch -d grep -A 15 'Normal' /proc/zoneinfo
Every 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                              openstack: Wed Feb  6 08:45:01 2019

Node 0, zone   Normal
  pages free     146583
        min      4986
        low      6232
        high     7478
        spanned  399872
        present  399872
        managed  373102
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 146583
      nr_zone_inactive_anon 35
      nr_zone_active_anon 11422
      nr_zone_inactive_file 64699
      nr_zone_active_file 120441
      nr_zone_unevictable 1352
      nr_zone_write_pending 0 

3、为何剩余内存不少的状况下,也会发生 Swap 呢?

这正是处理器的 NUMA (Non-Uniform Memory Access)架构致使的。

在 NUMA 架构下,多个处理器被划分到不一样 Node 上,且每一个 Node 都拥有本身的本地内存空间。

而通一个Node内部的内存空间实际上能够进一步分为不一样的内存域。好比直接内存访问区域、普通内存区,伪内存去等以下图所示

一、经过numactl查询node的分布状况

root@openstack:~# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1
node 0 size: 4976 MB
node 0 free: 4088 MB
node distances:
node   0
  0:  10

一、NUMA和swap什么关系?

一、三个内存阈值(页最小阈值、页低阈值和页高阈值)查询

cat  /proc/zoneinfo
Node 0, zone   Normal
  pages free     146583
        min      4986
        low      6232
        high     7478
        spanned  399872
        present  399872
        managed  373102
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 146583
      nr_zone_inactive_anon 35
      nr_zone_active_anon 11422
      nr_zone_inactive_file 64699
      nr_zone_active_file 120441
      nr_zone_unevictable 1352
      nr_zone_write_pending 0 

一、pages 处的 min、low、high,就是上面提到的三个内存阈值,而 free 是剩余内存页数,它跟后面的nr_free_pages 相同

二、nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活跃和非活跃的一名页数

三、nr_zone_active_file 和 nr_zone_inactive_anon,分别是活跃和非活跃的文件页数

从这个输出结果能够发现,剩余内存远大于高阈值,因此此时的不会回收内存

二、Node寻找空闲内存仍是本地内存中回收内存?

root@openstack:~# cat /proc/sys/vm/zone_reclaim_mode
0

默认的0,也就是刚刚提到的模式,表示既能够从其余Node寻找空闲内存,也能够从本地回收内存

一、一、二、4都表示只回收本地内存,
二、2表示能够回写脏数据回收内存
三、4表示能够用方式回收

三、到底该先回收哪种呢?

一、对文件页的回收

固然就是直接回收缓存,或者把脏页写回磁盘后再回收

二、而对匿名页的回收

其实就是经过 Swap 机制,把它们写入磁盘后再释放内存

root@openstack:~#  cat /proc/sys/vm/swappiness
60

swappiness 的范围是 0-100,数值越大,越积极使用Swap,更倾向于回收匿名页

也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页

虽然swappiness的范围是0-100,不过要注意,这并非内存的百分比,而是Swap调整积极程度的权重

即便你把它设置成0,当剩余内存+文件页小于也高阈值时,仍是会发生Swap

相关文章
相关标签/搜索