内容主要来源于:linux的内存回收和交换

各项命令查看的linux环境是:Linux SUSE-33 2.6.32.12-0.7-defaul

zone?

内存管理的相关逻辑都是以zone为单位的,这里zone的含义是指内存的分区管理。Linux将内存分成多个区,主要有直接访问区(DMA)、一般区(Normal)和高端内存区(HighMemory)。内核对内存不同区域的访问因为硬件结构因素会有寻址和效率上的差别。如果在NUMA架构上,不同CPU所管理的内存也是不同的zone。

/proc/zoneinfo?

查看当前系统的内存水位标记。

weblogic@SUSE-33:/sbin> cat /proc/zoneinfo
Node 0, zone DMA
pages free 3929
min 7
low 7
high 10
scanned 0
spanned 4096
present 3832
nr_free_pages 3929
nr_inactive_anon 0
nr_active_anon 0
nr_inactive_file 0
nr_active_file 0
nr_unevictable 0
nr_mlock 0
nr_anon_pages 0
nr_mapped 0
nr_file_pages 0
nr_dirty 0
nr_writeback 0
nr_slab_reclaimable 0
nr_slab_unreclaimable 0
nr_page_table_pages 0
nr_kernel_stack 0
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 0
numa_hit 1
numa_miss 0
numa_foreign 0
numa_interleave 0
numa_local 1
numa_other 0
protection: (0, 3768, 4016, 4016)
pagesets
cpu: 0
count: 0
high: 0
batch: 1
vm stats threshold: 4
cpu: 1
count: 0
high: 0
batch: 1
vm stats threshold: 4
all_unreclaimable: 1
prev_priority: 12
start_pfn: 0
inactive_ratio: 1
Node 0
, zone DMA32
pages free 16200
min 1898
low 1898
high 2847
scanned 0
spanned 1044480
present 964664
nr_free_pages 16200
nr_inactive_anon 143811
nr_active_anon 698860
nr_inactive_file 18465
nr_active_file 16433
nr_unevictable 0
nr_mlock 0
nr_anon_pages 830848
nr_mapped 2043
nr_file_pages 46721
nr_dirty 13
nr_writeback 0
nr_slab_reclaimable 5649
nr_slab_unreclaimable 3655
nr_page_table_pages 6618
nr_kernel_stack 371
nr_unstable 0
nr_bounce 0
nr_vmscan_write 26548123
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 18
numa_hit 12025255812
numa_miss 0
numa_foreign 0
numa_interleave 0
numa_local 12025255812
numa_other 0
protection: (0, 0, 248, 248)
pagesets
cpu: 0
count: 130
high: 186
batch: 31
vm stats threshold: 24
cpu: 1
count: 133
high: 186
batch: 31
vm stats threshold: 24
all_unreclaimable: 0
prev_priority: 12
start_pfn: 4096
inactive_ratio: 5
Node 0
, zone Normal
pages free 153
min 125
low 125
high 187
scanned 0
spanned 64512
present 54158
nr_free_pages 153
nr_inactive_anon 11135
nr_active_anon 9662
nr_inactive_file 2144
nr_active_file 2137
nr_unevictable 0
nr_mlock 0
nr_anon_pages 18039
nr_mapped 1155
nr_file_pages 7039
nr_dirty 26
nr_writeback 0
nr_slab_reclaimable 690
nr_slab_unreclaimable 21507
nr_page_table_pages 1063
nr_kernel_stack 205
nr_unstable 0
nr_bounce 0
nr_vmscan_write 1879470
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 1
numa_hit 443690329
numa_miss 0
numa_foreign 0
numa_interleave 8539
numa_local 443690329
numa_other 0
protection: (0, 0, 0, 0)
pagesets
cpu: 0
count: 89
high: 90
batch: 15
vm stats threshold: 8
cpu: 1
count: 47
high: 90
batch: 15
vm stats threshold: 8
all_unreclaimable: 0
prev_priority: 12
start_pfn: 1048576
inactive_ratio: 1
weblogic@SUSE-33:/sbin>
从上边可看出有DMA、DMA32、Normal这三个内存区。

swappiness?

/proc/sys/vm/swappiness这个文件,这个文件的值用来定义内核使用swap的积极程度,是个可以用来调整跟swap相关的参数。值越高,内核就会越积极的使用swap,值越低就会降低对swap的使用积极性。这个文件的默认值是60,可以的取值范围是0-100。

1)swappiness这个参数实际上是指导内核在清空内存的时候,是更倾向于清空file-backed内存还是更倾向于进行匿名页的交换的。当然,这只是个倾向性,是指在两个都够用的情况下,更愿意用哪个,如果不够用了,那么该交换还是要交换。

2)如果swappiness设置为100,那么匿名页和文件将用同样的优先级进行回收。很明显,使用清空文件的方式将有利于减轻内存回收时可能造成的IO压力。因为如果file-backed中的数据不是脏数据的话,那么可以不用写回,这样就没有IO发生,而一旦进行交换,就一定会造成IO。所以系统默认将swappiness的值设置为60,这样回收内存时,对file-backed的文件cache内存的清空比例会更大,内核将会更倾向于进行缓存清空而不是交换。

3)如果这个值为0,那么内存在free和file-backed(文件映射页的大小)使用的页面总量小于高水位标记(high water mark)之前,不会发生交换。有剩余内存的情况下可能发生交换。

weblogic@SUSE-:/proc/sys/vm> cat /proc/sys/vm/swappiness 

min_free_kbytes?

/proc/sys/vm/min_free_kbytes,这个参数本身决定了系统中每个zone的watermark[min]的值大小,然后内核根据min的大小并参考每个zone的内存大小分别算出每个zone的low水位和high水位值。

weblogic@SUSE-:/proc/sys/vm> cat /proc/sys/vm/min_free_kbytes

zone_reclaim_mode?

zone_reclaim_mode模式是在2.6版本后期开始加入内核的一种模式,可以用来管理当一个内存区域(zone)内部的内存耗尽时,是从其内部进行内存回收还是可以从其他zone进行回收的选项,我们可以通过/proc/sys/vm/zone_reclaim_mode文件对这个参数进行调整。

weblogic@SUSE-:/proc/sys/vm> cat /proc/sys/vm/zone_reclaim_mode

在申请内存时,内核在当前zone内没有足够内存可用的情况下,会根据zone_reclaim_mode的设置来决策是从下一个zone找空闲内存还是在zone内部进行回收。这个值为0时表示可以从下一个zone找可用内存,非0表示在本地回收。这个文件可以设置的值及其含义如下:

  1. echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。
  2. echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。
  3. echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
  4. echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap方式回收内存。

不同的参数配置会在NUMA环境中对其他内存节点的内存使用产生不同的影响。默认情况下,zone_reclaim模式是关闭的。这在很多应用场景下可以提高效率,比如文件服务器,或者依赖内存中cache比较多的应用场景。这样的场景对内存cache速度的依赖要高于进程本身对内存速度的依赖,所以我们宁可让内存从其他zone申请使用,也不愿意清本地cache。

如果确定应用场景是内存需求大于缓存,而且尽量要避免内存访问跨越NUMA节点造成的性能下降的话,则可以打开zone_reclaim模式。此时页分配器会优先回收容易回收的可回收内存(主要是当前不用的page cache页),然后再回收其他内存。

打开本地回收模式的写回可能会引发其他内存节点上的大量的脏数据写回处理。如果一个内存zone已经满了,那么脏数据的写回也会导致进程处理速度收到影响,产生处理瓶颈。这会降低某个内存节点相关的进程的性能,因为进程不再能够使用其他节点上的内存。但是会增加节点之间的隔离性,其他节点的相关进程运行将不会因为另一个节点上的内存回收导致性能下降。

min_unmapped_ratio

这个参数只在NUMA架构的内核上生效。这个值表示NUMA上每个内存区域的pages总数的百分比。在zone_reclaim_mode模式下,只有当相关区域的内存使用达到这个百分比,才会发生区域内存回收。在zone_reclaim_mode设置为4的时候,内核会比较所有的file-backed和匿名映射页,包括swapcache占用的页以及tmpfs文件的总内存使用是否超过这个百分比。其他设置的情况下,只比较基于一般文件的未映射页,不考虑其他相关页。

weblogic@SUSE-:/proc/sys/vm> cat /proc/sys/vm/min_unmapped_ratio

page-cluster

page-cluster是用来控制从swap空间换入数据的时候,一次连续读取的页数,这相当于对交换空间的预读。这里的连续是指在swap空间上的连续,而不是在内存地址上的连续。因为swap空间一般是在硬盘上,对硬盘设备的连续读取将减少磁头的寻址,提高读取效率。这个文件中设置的值是2的指数。就是说,如果设置为0,预读的swap页数是2的0次方,等于1页。如果设置为3,就是2的3次方,等于8页。同时,设置为0也意味着关闭预读功能。

文件默认值为3。我们可以根据我们的系统负载状态来设置预读的页数大小。

weblogic@SUSE-:/proc/sys/vm> cat /proc/sys/vm/page-cluster

手工清理缓存

在系统中除了内存将被耗尽的时候可以清缓存以外,还可以使用下面这个文件来人工触发缓存清除的操作:

weblogic@SUSE-:/sbin> cat /proc/sys/vm/drop_caches
0
weblogic@SUSE-33:/sbin>  echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches:表示清除page cache。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。

echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

查看linux中swap内存的相关参数的更多相关文章

  1. 【Linux】Linux中Swap与Memory内存简单介绍

    背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇.Linux的各种设计思想和使用也被传承(当然不乏各种黑Linux,而且黑的漂亮).Linux的很多独特的设计,对性 ...

  2. [svc]Linux中Swap与Memory内存简单介绍

    swap区域是干嘛的 cpu 内存(不常用到的进程swap区) 磁盘 当内存没有可用的,就必须要把内存中不经常运行的程序给踢出去.但是踢到哪里去,这时候swap就出现了. 背景介绍 对于Linux来说 ...

  3. Linux中Swap与Memory内存简单介绍

    1.背景介绍   这篇文章介绍一下Linux中swap与memory.对于memory没什么可说的就是机器的物理内存,读写速度低于cpu一个量级,但是高于磁盘不止一个量级.所以,程序和数据如果在内存的 ...

  4. Linux中Swap与Memory内存简单介绍 (转)

    https://blog.csdn.net/zwan0518/article/details/12059213 一.背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇 ...

  5. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  6. 全面了解 Linux 服务器 - 2. 查看 Linux 服务器的内存使用情况

    2. 查看 Linux 服务器的内存使用情况 liuqian@ubuntu:~$ free -m total used free shared buffers cached Mem: 1983 186 ...

  7. LSOF查看linux中文件打开情况

    如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...

  8. 查看linux中的TCP连接数【转】

     转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:   计算机网络知识库  分类: ...

  9. [转]Linux中进程内存与cgroup内存的统计

    From: http://hustcat.github.io/about/ Linux中进程内存与cgroup内存的统计 在Linux内核,对于进程的内存使用与Cgroup的内存使用统计有一些相同和不 ...

随机推荐

  1. Qt中的多线程技术(列表总结比较,多线程创建和销毁其实是有开销的,只是增加了用户体验而已)

    http://blog.csdn.net/u011012932/article/details/52943811

  2. QT 多线程程序设计

    参考:http://www.cnblogs.com/hicjiajia/archive/2011/02/03/1948943.html http://mobile.51cto.com/symbian- ...

  3. 自由软件VS开源软件

    自由软件VS开源软件 “自由软件运动”是一项倡导软件这种知识产品应该免费共享的社会运动,它主要是从社会伦理学,道德的高度,强调我们每个人都有自由使用软件的权利.这种权利不应该被软件私有所破坏. 反对软 ...

  4. CentOS单用户模式下修改ROOT密码和grub加密

    Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...

  5. PowerDesiger 15逆向生成工程E-R图及导出word表格

    应用环境:win8(64位)+oracle10g(32位)服务端+PowerDesigner15 需求:oracle数据库中的表结构是web工程框架hibernate 自动生成,现需要将数据库中已有的 ...

  6. PowerDesigner如何自定义报表模板

    PowerDesigner如何自定义报表模板 帅宏军 使用PowerDesigner设计数据库非常方便,但是它自带的报表模板一般不符合中国的使用情况.如何设计一个自己的报表模板,并在做项目的数据库设计 ...

  7. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  8. 结构体快排qsort()

    曾经用到过一次快排,感觉代码量没有减小,反而比较函数有点难编,但是这种排序一般不会出错(前提是比较函数写对了),而且速度很快,熟练后其实还是非常好用的! 用到快排是因为我做到一个题,是uva的1042 ...

  9. Python 学习记录

    记录一些 学习python 的过程 -------------------------------------- 1. 初始学习 @2013年10月6日 今天开始学习python 了 遇到好多困难但是 ...

  10. [HDOJ2639]Bone Collector II(第k优01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:求01背包的第k优解 dp(i, j)表示容量为j时的i优解 对于第二维的操作和01背包几 ...