目录

Swap原理

NUMA和swap

swappiness

创建swap

一个swap的例子

参考


内存不足的情况

1.内存回收
2.OOM杀死进程
内存紧张导致的OOM,是指系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程

内存回收,就是系统释放掉可以回收的内存,比如cache和buffer,就是属于可回收内存,他们在内存管理中,通常叫 文件页(File-backed Page)
大部分文件页,都可以直接回收,以后有需要再从磁盘重新读取就可以了,而那些被应用程序修改过,暂时还没有写入磁盘的数据(脏页),就需要先写入磁盘,才能再进行内存释放

脏页的写入方式包括
1.在应用程序中,调用fsync,把脏页同步到磁盘中
2.也可以交给系统,由内核线程pdflush负责将这些脏页刷新

除了buffer和cache,通过内存映射获取的文件映射页,也可以被释放掉,下次再访问的时候,从文件中重新读取就可以了
应用程序动态分配的堆内存,也就是内存管理中的 匿名页(Anonymous Page),这些不能直接回收
Linux是通过swap机制,将这些匿名页中的内存先写到磁盘中,再释放掉这些内存,给其他更需要的进程使用,再访问这些内存时,重新从磁盘读取内存就可以了

Swap原理

其原理是把一块磁盘空间或者一个本地文件,当内存来使用
1.换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放掉这些数据占用的内存
2.换如,进程再次访问这些内存的时候,把他们从磁盘读到内存中来

swap其实是把系统的可用内存变大了,即使服务器的内存不足时,也可以运行大内存的应用程序
即使现在内存便宜了也大了,但是再大的内存也有不够用的时候
比如当内存不足时,有些应用程序并不想被OOM杀死,而是希望能缓一段时间,等待人工介入,或者等系统自动释
放其他进程的内存,再分配给他
笔记本的快速开机和休眠,就是基于swap,休眠时把系统的内存存入磁盘,等再次开机时就从磁盘中加载内存,
省去了很多应用初始化的过程,加速了开机速度

Linux什么时候回收内存呢?
比如有新的大块内存分配请求时,剩余内存不足,这时候系统就需要回收一部分内存(比如cache和buffer_,尽可
能的蛮族新内存请求,这个过程通常被称为 直接内存回收
除了直接内存回收,还有一个专门的内核线程用来定期回收内存,也就是 kswapd0,为了衡量内存的使用情况,
kswapd0定义了三个内存阈值(watermark 也称水位),分别是
页最小阈值(pages_min),页低阈值(pages_low),页高阈值(pages_high),剩余内存,则使用pages_free表示

kswap0定期扫描内存使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存回收操作
1.剩余内存小于 页最小阈值,说明进程可用内存都耗尽了,只有内存才可以分配内存
2.剩余内存落在 页最小阈值 和 页低阈值中间,说明内存压力比较大,剩余内存不多了,kswapd0会执行内存
  回收,直到剩余内存大于高阈值为止
3.剩余内存落在 页低阈值 和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求
4.剩余内存大于 页高阈值,说明剩余内存比较多,没有哦内存压力

一旦剩余内存小雨页低阈值,就会触发内存的回收,这个页低阈值,可以通过内核选项

/proc/sys/vm/min_free_kbytes 

来设置,而其他两个值,都是根据页低阈值,直接计算生成的

page_low   = pages_min * 5/4
pages_high = pages_min * 3/2

NUMA和swap

有时候系统的剩余内存还很多,但还是发生了swap
这是因为处理器的NUMA(Non-Uniform Memory Access)架构导致的
在NUMA架构下,多个处理器被划分到不同Node上,且每个Node都拥有自己的本地内存空间
而同一个Node内部的内存空间,实际上又可以进一步分为不同的内存域(Znode),比如直接内存访问区(DMA),普通内存区(NORMAL),伪内存区(MOVABLE)等,如下图所示

通过numactl命令,可以查看处理器在Node的分布情况,以及每个Node的内存使用情况

numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38
node 0 size: 65442 MB
node 0 free: 16721 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
node 1 size: 65536 MB
node 1 free: 30760 MB
node distances:
node   0   1 0:  10  21 1:  21  10 

通过 cat /proc/znoeinfo 查看信息

Node 0, zone      DMA pages free     3933min      2   low      2   high     3   scanned  0spanned  4095present  3835nr_free_pages 3933nr_inactive_anon 0nr_active_anon 0nr_inactive_file 0nr_active_file 0nr_unevictable 0nr_mlock     0   nr_anon_pages 0nr_mapped    0   nr_file_pages 0nr_dirty     0   nr_writeback 0nr_slab_reclaimable 0nr_slab_unreclaimable 0nr_page_table_pages 0nr_kernel_stack 0nr_unstable  0nr_bounce    0   nr_vmscan_write 0nr_writeback_temp 0nr_isolated_anon 0nr_isolated_file 0nr_shmem     0   numa_hit     0   numa_miss    0   numa_foreign 0numa_interleave 0numa_local   0   numa_other   0   nr_anon_transparent_hugepages 0protection: (0, 1882, 64502, 64502)pagesetscpu: 0count: 0high:  0batch: 1vm stats threshold: 12cpu: 1
。。。

比较重要的指标有
pages处的min,low,high,就是上面提到的三个内存阈值,free是剩余内存页数,跟后面的nr_free_pages相同
nr_zone_active_anon和nr_zone_inactive_anon,分别是活跃和非活跃的匿名页数
nr_zone_active_file和nr_zone_inactive_file,分别是活跃和非活跃的文件页

如果此时的剩余内存大于页高阈值,kswapd0就不会回收内存
如果某个Node内存不足,系统可以从其他Node寻找空闲内存,也可以从本地内存中回收内存,具体用哪种模式,通过下面参数来调整

/proc/sys/vm/zone_reclaim_mode

支持以下几个选项
默认的0,就是刚刚提到的模式,可以从其他Node寻找空闲内存,也可以从本地回收内存
1,2,4都表示只回收本地内存,2表示可以回写脏数据回收内存,4表示可以用Swap方式回收内存

swappiness

内存回收机制,即包括了文件页,也包括了匿名页
1.对于文件的回收,就是直接回收缓存,或者把脏页写回到磁盘再回收
2.对于匿名页,就是通过swap机制,把他们写入到磁盘后再释放内存

Linux系统提供了下面这个参数,可以用来调整使用swap的积极程度

/proc/sys/vm/swappiness

swappiness的范围是0-100,数值越大,越积极使用swap,也就是更倾向于回收匿名页
数值越小,越消极使用swap,也就是更倾向于回收文件页

swappiness的范围是0-100,但并不是内存的百分比,而是调整swap积极度的权重,即使把他设置成0,还是可会发生swap

创建swap

输入 free

freetotal        used        free      shared  buff/cache   available
Mem:        4039480       70100     3000168        2788      969212     3737268
Swap:             0           0           0

Swap大小为0,说明没有配置Swap
Linux支持两种类型的Swap,Swap分区 和 Swap文件
下面是配置Swap文件的列子

fallocate -l 8G /mnt/swapfile
file /mnt/swapfile
chmod 700 /mnt/swapfile
mkswap /mnt/swapfile
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=92e57c51-23e6-4976-acc4-e0745c870bb7swapon /mnt/swapfile
file swapfile
swapfile: Linux/i386 swap file (new style), version 1 (4K pages), size 2097151 pages, no label, UUID=92e57c51-23e6-4976-acc4-e0745c870bb7

再输入free

              total        used        free      shared  buff/cache   available
Mem:        4039480       72720     2996780        2788      969980     3734636
Swap:       8388604           0     8388604swapoff -a #停止所有的swap分区

通过cat查看

cat /proc/swaps
Filename                                Type            Size    Used    Priority
/mnt/swapfile                           file            2097148 0       -2

一个swap的例子

当设置swappiness为0的时候

cat /proc/sys/vm/swappiness
0

sar的swap和内存相关的man结果

#内存使用情况-r     Report memory utilization statistics.  The following values are displayed:kbmemfreeAmount of free memory available in kilobytes.kbmemusedAmount of used memory in kilobytes. This does not take into account memory used by the kernel itself.%memusedPercentage of used memory.kbbuffersAmount of memory used as buffers by the kernel in kilobytes.kbcachedAmount of memory used to cache data by the kernel in kilobytes.kbcommitAmount of memory in kilobytes needed for current workload. This is an estimate of how much RAM/swap is needed to guarantee that  there  neveris out of memory.%commitPercentage  of memory needed for current workload in relation to the total amount of memory (RAM+swap).  This number may be greater than 100%because the kernel usually overcommits memory.kbactiveAmount of active memory in kilobytes (memory that has been used more recently and usually not reclaimed unless absolutely necessary).kbinactAmount of inactive memory in kilobytes (memory which has been less recently used. It is more eligible to be reclaimed for other purposes).kbdirtyAmount of memory in kilobytes waiting to get written back to the disk.#交换分区使用情况-S     Report swap space utilization statistics.  The following values are displayed:kbswpfreeAmount of free swap space in kilobytes.kbswpusedAmount of used swap space in kilobytes.%swpusedPercentage of used swap space.kbswpcadAmount of cached swap memory in kilobytes.  This is memory that once was swapped out, is swapped back in but still also is in the  swap  area(if memory is needed it doesn't need to be swapped out again because it is already in the swap area. This saves I/O).%swpcadPercentage of cached swap memory in relation to the amount of used swap space.

sar -r 一些内存参数说明
kbcommit,表示当前系统负载需要的内存,实际上是为了保证系统内存不溢出,对需要内存的估计值
kbactive,表示活跃内存,也就是最近使用过的内存,一般不会被系统回收
kbinact,表示非活跃内存,也就是不常访问的内存,有可能会被系统回收

执行dd

dd if=/dev/vda1 of=/dev/null bs=1G count=100

执行命令观察结果

sar -r -S 1 kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit   kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty3915640   3814304    123840      3.07      2200     25356    227316      1.83     17072     48604        96kbswpfree kbswpused  %swpused  kbswpcad   %swpcad8388604         0      0.00         0      0.00kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty3049236   3309968    990244     24.51    436124     25432   1278260     10.29    448640    482532        96kbswpfree kbswpused  %swpused  kbswpcad   %swpcad8388604         0      0.00         0      0.00kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty1310136   2690552   2729344     67.57   1553560     26472   1278260     10.29   1067048   1599744       228kbswpfree kbswpused  %swpused  kbswpcad   %swpcad8388604         0      0.00         0      0.00kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty112992   2687204   3926488     97.20   2745236     26748   1286232     10.35   1035120   2824604         8kbswpfree kbswpused  %swpused  kbswpcad   %swpcad8388604         0      0.00         0      0.00cachetop
PID      UID      CMD              HITS     MISSES   DIRTIES  READ_HIT%  WRITE_HIT%
13767    root     sh                417        0        0     100.0%       0.0%
13768    root     grep              622        0        0     100.0%       0.0%
13764    root     grep              641        0        0     100.0%       0.0%
13758    root     dd               131840   131840      0      50.0%      50.0%watch -d grep -A 15 'Normal' /proc/zoneinfo
Node 0, zone   Normalpages free     5155min      4163low      5203high     6243spanned  262144present  262144managed  245382protection: (0, 0, 0, 0, 0)nr_free_pages 5155nr_zone_inactive_anon 59936nr_zone_active_anon 1nr_zone_inactive_file 87662nr_zone_active_file 77480nr_zone_unevictable 0nr_zone_write_pending 0

通过sar命令观察,发现swap区一直没有被使用,swpused始终是0
内存的memused一直增长到97%,之后一直在97%左右徘徊

通过cachetop命令可以看到,dd执行后,读命中,写命中只有50%

再通过/proc/zoneinfo看内存区域页面使用情况
nr_free_pages 这个值在一个区间内不断变化,当小于min的时候就会回收内存页,回收后的值会大于high,之后又立刻分配了很多内存页,一直降低,等低到小于min后再次触发回收
nr_zone_active_anon,nr_zone_inactive_file 这两个值也在不断变化
在dd运行过程中,系统回收了匿名页和文件缓存,只有再分配再回收

通过上面情况可以发现,内存在不断回收不断分配,但因为设置了
swappiness 为0,所以一直没有使用swap区

使用swap最多的10个进程

for file in /proc/*/status; do awk '/VmSwap|Name|^Pid/ {printf $2 "  "$3} END{print ""}' $file; done | sort -k 3 -n -r | head
writeback  27
watchdogd  38
watchdog/1  14
watchdog/0  11
ttm_swap  170
systemd-udevd  273  0  kB
systemd-resolve  371  0  kB
systemd-network  297  0  kB
systemd-logind  505  0  kB
systemd-journal  229  0  kB

当swappiness设置为60的时候

echo 60 > /proc/sys/vm/swappiness
cat /proc/sys/vm/swappiness
60

执行dd命令,再观察结果

dd if=/dev/vda1 of=/dev/null bs=1G count=200sar -S -r 1kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty89480    925428     91.18     19932     17212   1322700     42.50    422460    442352         0kbswpfree kbswpused  %swpused  kbswpcad   %swpcad2041596     55552      2.65     10804     19.45kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty72940    941968     92.81     21032     18852   1322700     42.50    431896    449072         8kbswpfree kbswpused  %swpused  kbswpcad   %swpcad1943344    153804      7.33      7768      5.05

这次就看到了swpused在增长了
自己做实验的时候
Ubuntu的机器不管swiness设置的是0还是100,都不用swap
到CentOS的机器上,运行dd,才使用了swap

关闭再开启swap,也是一种常用的swap空间清理方式

swapoff -a && swapon -a

通常,降低Swap的使用,可以提高系统的整体性能,方式如下
1.禁止swap,当服务器内存足够大时,可以禁止swap,现在大部分云平台中的虚拟机都默认禁止swap
2.如果实在需要用到swap,可以尝试降低swappiness的值,减少内存回收时swap的使用倾向
3.响应延迟敏感的应用,如果他们可能在开启swap的服务器中运行,还可以使用库函数mlock()或者
  mlockall()锁定内存,阻止他们的内存换出

参考

/proc/sys/vm Document

man proc

Linux性能优化-内存的swap相关推荐

  1. Linux性能优化-内存优化

    目录 1.内存原理 1.1.内存映射 1.2.虚拟内存空间分布 1.3.SWAP运行原理 2.内存性能统计信息 2.1.内存系统使用量 2.2.缓存与缓冲区命中率 3.性能剖析 3.1.内存性能指标 ...

  2. 【linux性能优化】系统Swap变高原因分析

    一.内存处理 1.1 内存资源紧张的应对 当发生了内存泄漏或者运行大内存的应用程序,导致系统的内存资源紧张时,系统又会如何应对呢? 这其实会导致两种可能结果,内存回收和OOM杀死进程 OOM杀死进程 ...

  3. Linux性能优化—内存实战篇

    一.Linux内存工作原理 相关视频讲解: 深入讲解Linux内核内存管理(第一节) 深入讲解Linux内核内存管理( 第二节) Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 ...

  4. LINUX如何让内存FREE变大,Linux性能优化(内存:free + top +vmstat )

    转载:https://blog.51cto.com/superpcm/2068843 cat /proc/{pid}/status Valgrind工具检测内存泄漏 3.1内存性能统计信息 3.1.1 ...

  5. 查看linux内存优化,Linux性能优化和监控系列(三) 分析Memory使用状况

    Linux性能优化和监控系列(三) 分析Mem 分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发 ...

  6. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID:Ubuntu D ...

  7. Linux性能优化之CPU、内存、IO优化

    Linux 的性能进行监测,以下是 VPSee 常用的工具: 工具    简单介绍 top    查看进程活动状态以及一些系统状况 vmstat    查看系统状态.硬件和系统信息等 iostat   ...

  8. Linux 性能优化全景指南

    大家好 我是坤哥 之前一些朋友觉得奇怪,说你主要做 Java 的,公号怎么时不时地也推送一些 Linux 文章,其实不管你是哪个 xx 语言的工程师,要想进阶,Linux 性能优化是必备知识,举个例子 ...

  9. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

最新文章

  1. Spring Cloud Gateway 使用 Token 验证
  2. 关于MYsql 多字段排序
  3. Vue.js项目去除url中的#/ - 解决篇
  4. 文件服务器serv-u,Serv-U文件服务器.PDF
  5. 【XAMPP启动mysql报错】Port 3306 in use by ““C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld“……
  6. sql语句中单引号嵌套问题
  7. docker容器资源配额控制
  8. HDU2026 首字母变大写【入门】
  9. 在Web.config配置文件中自定义配置节点
  10. 8254跑马灯c语言程序,C语言笔记-基于C语言实现的流水跑马灯
  11. SuperScan扫描器
  12. loinc编码_医学知识组织系统:术语与编码
  13. 用C语言程序求两个正整数的最大公约数
  14. 小女子做销售 四大温柔手段
  15. antd菜单使用动态图标
  16. 2017年搜狗校招Java研发笔试编程题
  17. [shell脚本] realtek平台 Mifi初始化时候,初始化wifi的黑白名单的sh脚本
  18. python编程锦囊pdf百度云_python编程锦囊 相关实例(示例源码)下载 - 好例子网
  19. 互联网的「中年危机」是什么?程序员对中年被裁有什么误解
  20. windows自带w32tm实现做ntp client端,精确同步时间。

热门文章

  1. python文本分析和提取_python文本分析和提取 Python 文本内容指定字段提取
  2. tcl脚本vsim命令的参数列表
  3. 【requests|get/post】params 和 data比较
  4. 网卡软中断过高问题优化总结
  5. 快船和火箭抢七比赛分析。
  6. 视频编辑软件:迅捷视频工具箱
  7. 隐马尔科夫模型(HMM):状态序列预测
  8. J-Link连上电路板,keil检测不出MCU
  9. 菩提树下的禅者之——空灵
  10. 网络爬虫与信息提取--正则表达式---淘宝商品比价定向爬虫