真可谓一文在手,SWAP从此不再忧闷。敬请笑纳。
概述本文谈论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常繁芜的系统,而swap只是个中一个很小的处理逻辑。
希望本文能让读者理解Linux对swap的利用大概是什么样子。阅读完本文,该当可以帮你办理以下问题:

1、 swap到底是干嘛的?
2、 swappiness到底是用来调节什么的?
3、 kswapd什么时候会进行swap操作?
4、 什么是内存水位标记?
5、 swap分区的优先级(priority)有啥用?
1、什么是SWAP,到底是干嘛的?
我们一样平常所说的swap,指的是一个交流分区或文件。在Linux上可以利用swapon -s命令查看当前系统上正在利用的交流空间有哪些,以及干系信息:
[zorro@zorrozou-pc0 linux-4.4]$ swapon -sFilename Type Size Used Priority/dev/dm-4 partition 33554428 0 -1
从功能上讲,交流分区紧张是在内存不足用的时候,将部分内存上的数据交流到swap空间上,以便让系统不会因内存不足用而导致oom或者更致命的情形涌现。
以是,当内存利用存在压力,开始触发内存回收的行为时,就可能会利用swap空间。
内核对swap的利用实际上是跟内存回收行为紧密结合的。那么关于内存回收和swap的关系,我们须要思考以下几个问题:
为什么要进行内存回收?哪些内存可能会被回收呢?回收的过程中什么时候会进行交流呢?详细怎么交流?下面我们就从这些问题出发,一个一个进行剖析。
为什么要进行内存回收?内核之以是要进行内存回收,紧张缘故原由有两个:
内核须要为任何时候突发到来的内存申请供应足够的内存。以是一样平常情形下担保有足够的free空间对付内核来说是必要的。其余,Linux内核利用cache的策略虽然是不用白不用,内核会利用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。以是内核有必要设计一个周期性回收内存的机制,以便cache的利用和其他干系内存的利用不至于让系统的剩余内存长期处于很少的状态。当真的有大于空闲内存的申请到来的时候,会触发逼迫内存回收。以是,内核在应对这两类回收的需求下,分别实现了两种不同的机制:
一个是利用 kswapd进程对内存进行周期检讨 ,以担保平常状态下剩余内存尽可能够用。另一个是 直接内存回收(directpagereclaim) ,便是当内存分配时没有空闲内存可以知足哀求时,触发直接内存回收。这两种内存回收的触发路径不同:
一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收;拜会mm/vmscan.c中的kswapd()主逻辑另一个是内存申请的时候进入slow path的内存申请逻辑进行回收。拜会内核代码中的mm/page_alloc.c中的__alloc_pages_slowpath方法这两个方法中实际进行内存回收的过程殊途同归,终极都是 调用shrink_zone() 方法进行针对每个zone的内存页缩减。
这个方法中会再调用shrink_lruvec()这个方法对每个组织页的链表进程检讨。找到这个线索之后,我们就可以清晰的看到内存回收操作究竟针对的page有哪些了。
这些链表紧张定义在mm/vmscan.c一个enum中:
根据这个enum可以看到,内存回收紧张须要进行扫描的链表有如下4个:
anon的inactiveanon的activefile的inactivefile的active便是说,内存回收操作紧张针对的便是内存中的文件页(file cache)和匿名页。
关于生动(active)还是不生动(inactive)的判断内核会利用lru算法进行处理并进行标记,我们这里不详细阐明这个过程。
全体扫描的过程分几个循环:
首先扫描每个zone上的cgroup组;然后再以cgroup的内存为单元进行page链表的扫描;内核会先扫描anon的active链表,将不频繁的放进inactive链表中,然后扫描inactive链表,将里面生动的移回active中;进行swap的时候,先对inactive的页进行换出;如果是file的文件映射page页,则判断其是否为脏数据,如果是脏数据就写回,不是脏数据可以直接开释。这样看来, 内存回收这个行为会对两种内存的利用进行回收:
一种是anon的匿名页内存,紧张回收手段是swap;另一种是file-backed的文件映射页,紧张的释放手段是写回和清空。由于针对filebased的内存,没必要进行交流,其数据原来就在硬盘上,回收这部分内存只要在有脏数据时写回,并清空内存就可以了,往后有须要再从对应的文件读回来。
内存对匿名页和文件缓存一共用了 四条链表 进行组织,回收过程紧张是针对这四条链表进行扫描和操作。
2、swappiness到底是用来调节什么的?
很多人该当都知道 /proc/sys/vm/swappiness 这个文件,是个可以用来调度跟swap干系的参数。这个文件的默认值是60,可以的取值范围是0-100。
这很随意马虎给大家一个暗示:我是个百分比哦!
那么这个文件详细到底代表什么意思呢?我们先来看一下解释:
======
swappiness
This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, lower values decrease the amount of swap.
A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.
The default value is 60.
======
这个文件的值用来定义内核利用swap的积极程度:
值越高,内核就会越积极的利用swap;值越低,就会降落对swap的利用积极性。如果这个值为0,那么内存在free和file-backed利用的页面总量小于高水位标记(high water mark)之前,不会发生交流。在这里我们可以理解file-backed这个词的含义了,实际上便是上文所说的文件映射页的大小。
那么这个swappiness到底起到了什么浸染呢?我们换个思路考虑这个事情。假设让我们设计一个内存回收机制,要去考虑将一部分内存写到swap分区上,将一部分file-backed的内存写回并清空,剩余部分内存出来,我们将怎么设计?
我想该当紧张考虑这样几个问题:
如果回收内存可以有两种路子(匿名页交流和file缓存清空),那么我该当考虑在本次回收的时候,什么情形下多进行file写回,什么情形下该当多进行swap交流。说白了便是平衡两种回收手段的利用,以达到最优。如果符合交流条件的内存较长,是不是可以不用全部交流出去?比如可以交流的内存有100M,但是目前只须要50M内存,实际只要交流50M就可以了,不用把能交流的都交流出去。剖析代码会创造,Linux内核对这部分逻辑的实当代码在 get_scan_count() 这个方法中,这个方法被 shrink_lruvec() 调用。
get_sacn_count()便是处理上述逻辑的,swappiness是它所须要的一个参数,这个参数实际上是辅导内核在清空内存的时候,是更方向于清空file-backed内存还是更方向于进行匿名页的交流的。
当然,这只是个方向性,是指在两个都够用的情形下,更乐意用哪个,如果不足用了,那么该交流还是要交流。
大略看一下get_sacn_count()函数的处理部分代码,个中关于swappiness的第一个处理是:
这里注释的很清楚:
如果swappiness设置为100,那么匿名页和文件将用同样的优先级进行回收。很明显,利用清空文件的办法将有利于减轻内存回收时可能造成的IO压力。由于如果file-backed中的数据不是脏数据的话,那么可以不用写回,这样就没有IO发生,而一旦进行交流,就一定会造成IO。以是系统默认将swappiness的值设置为60,这样回收内存时,对file-backed的文件cache内存的清空比例会更大,内核将会更方向于进行缓存清空而不是交流。这里的swappiness值如果是60,那么是不是说内核回收的时候,会按照60:140的比例去做相应的swap和清空file-backed的空间呢?并不是。在做这个比例打算的时候,内核还要参考当前内存利用的其他信息。对这里详细是怎么处理感兴趣的人,可以自己详细看get_sacn_count()的实现,本文就不多阐明了。我们在此要明确的观点是: swappiness的值是用来掌握内存回收时,回收的匿名页更多一些还是回收的file cache更多一些 。swappiness设置为0的话,是不是内核就根本不会进行swap了呢?这个答案也是否定的。首先是内存真的不足用的时候,该swap的话还是要swap。其次在内核中还有一个逻辑会导致直策应用swap, 内核代码 是这样处理的:这里的逻辑是说,如果触发的是全局回收,并且zonefile + zonefree <= high_wmark_pages(zone)条件成立时,就将scan_balance这个标记置为SCAN_ANON。
后续处理scan_balance的时候,如果它的值是SCAN_ANON,则一定会进行针对匿名页的swap操作。
要理解这个行为,我们首先要搞清楚什么是高水位标记(high_wmark_pages)。
3、kswapd什么时候会进行swap操作?我们回到kswapd周期检讨和直接内存回收的两种内存回收机制。
直接内存回收比较好理解,当申请的内存大于剩余内存的时候,就会触发直接管受接收。
那么kswapd进程在周期检讨的时候触发回收的条件是什么呢?
还是从设计角度来看,kswapd进程要周期对内存进行检测,达到一定阈值的时候开始进行内存回收。
这个所谓的阈值可以理解为内存目前的利用压力,便是说,虽然我们还有剩余内存,但是当剩余内存比较小的时候,便是内存压力较大的时候,就该当开始试图回收些内存了,这样才能担保系统尽可能的有足够的内存给突发的内存申请所利用。
4、什么是内存水位标记?(watermark)那么如何描述内存利用的压力呢?
Linux内核利用水位标记(watermark)的观点来描述这个压力情形。
Linux为内存的利用设置了三种内存水位标记:high、low、min。他们 所标记的含义分别为:
剩余内存在high以上表示内存剩余较多,目前内存利用压力不大;high-low的范围表示目前剩余内存存在一定压力;low-min表示内存开始有较大利用压力,剩余内存不多了;min是最小的水位标记,当剩余内存达到这个状态时,就解释内存面临很大压力。小于min这部分内存,内核是保留给特定情形下利用的,一样平常不会分配。内存回收行为便是基于剩余内存的水位标记进行决策的:
当系统剩余内存低于watermark[low]的时候,内核的kswapd开始起浸染,进行内存回收。直到剩余内存达到watermark[high]的时候停滞。
如果内存花费导致剩余内存达到了或超过了watermark[min]时,就会触发直接管受接收(direct reclaim)。
明白了水位标记的观点之后,zonefile + zonefree <= high_wmark_pages(zone)这个公式就能理解了。
这里的zonefile相称于内存中文件映射的总量,zonefree相称于剩余内存的总量。
内核一样平常认为,如果zonefile还有的话,就可以只管即便通过清空文件缓存得到部分内存,而不必只利用swap办法对anon的内存进行交流。
全体判断的观点是说,在全局回收的状态下(有global_reclaim(sc)标记),如果当前的文件映射内存总量+剩余内存总量的值评估小于即是watermark[high]标记的时候,就可以进行直接swap了。
这样是为了防止进入cache陷阱,详细描述可以见代码注释。
这个判断对系统的影响是, swappiness设置为0时,有剩余内存的情形下也可能发生交流。
那么watermark干系值是如何打算的呢?
所有的内存watermark标记都是根据当前内存总大小和一个可调参数进走运算得来的,这个参数是:/proc/sys/vm/min_free_kbytes
首先这个参数本身决定了系统中每个zone的watermark[min]的值大小。然后内核根据min的大小并参考每个zone的内存大小分别算出每个zone的low水位和high水位值。想理解详细逻辑可以拜会源代码目录下的该文件:
mm/page_alloc.c
在系统中可以从/proc/zoneinfo文件中查看当前系统的干系的信息和利用情形。
我们会创造以上内存管理的干系逻辑都因此zone为单位的,这里zone的含义是指内存的分区管理。
Linux将内存分成多个区,紧张有:
直接访问区(DMA)一样平常区(Normal)高端内存区(HighMemory)内核对内存不同区域的访问由于硬件构造成分会有寻址和效率上的差别。如果在NUMA架构上,不同CPU所管理的内存也是不同的zone。
干系参数设置
zone_reclaim_mode:
zone_reclaim_mode模式是在2.6版本后期开始加入内核的一种模式,可以用来管理当一个内存区域(zone)内部的内存耗尽时,是从其内部进行内存回收还是可以从其他zone进行回收的选项,我们可以通过/proc/sys/vm/zone_reclaim_mode 文件对这个参数进行调度。
在申请内存时(内核的get_page_from_freelist()方法中),内核在当前zone内没有足够内存可用的情形下,会根据zone_reclaim_mode的设置来决策是从下一个zone找空闲内存还是在zone内部进行回收。这个值为0时表示可以从下一个zone找可用内存,非0表示在本地回收。
这个文件可以设置的值及其含义如下:
echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap办法回收内存。不同的参数配置会在NUMA环境中对其他内存节点的内存利用产生不同的影响,大家可以根据自己的情形进行设置以优化你的运用。
默认情形下,zone_reclaim模式是关闭的。这在很多运用处景下可以提高效率,比如文件做事器,或者依赖内存中cache比较多的运用处景。
这样的场景对内存cache速率的依赖要高于进程进程本身对内存速率的依赖,以是我们宁肯让内存从其他zone申请利用,也不愿意清本地cache。
如果确定运用处景是内存需求大于缓存,而且只管即便要避免内存访问超过NUMA节点造成的性能低落的话,则可以打开zone_reclaim模式。
此时页分配器会优先回收随意马虎回收的可回收内存(紧张是当前不用的page cache页),然后再回收其他内存。
打开本地回收模式的写回可能会引发其他内存节点上的大量的脏数据写回处理。如果一个内存zone已经满了,那么脏数据的写回也会导致进程处理速率收到影响,产生处理瓶颈。
这会降落某个内存节点干系的进程的性能,由于进程不再能够利用其他节点上的内存。但是会增加节点之间的隔离性,其他节点的干系进程运行将不会由于另一个节点上的内存回收导致性能低落。
除非针对本地节点的内存限定策略或者cpuset配置有变革,对swap的限定会有效约束交流只发生在本地内存节点所管理的区域上。
min_unmapped_ratio:
这个参数只在NUMA架构的内核上生效。这个值表示NUMA上每个内存区域的pages总数的百分比。
在zone_reclaim_mode模式下,只有当干系区域的内存利用达到这个百分比,才会发生区域内存回收。
在zone_reclaim_mode设置为4的时候,内核会比较所有的file-backed和匿名映射页,包括swapcache占用的页以及tmpfs文件的总内存利用是否超过这个百分比。
其他设置的情形下,只比较基于一样平常文件的未映射页,不考虑其他干系页。
page-cluster:
page-cluster是用来掌握从swap空间换入数据的时候,一次连续读取的页数,这相称于对交流空间的预读。这里的连续是指在swap空间上的连续,而不是在内存地址上的连续。
由于swap空间一样平常是在硬盘上,对硬盘设备的连续读取将减少磁头的寻址,提高读取效率。
这个文件中设置的值是2的指数。便是说,如果设置为0,预读的swap页数是2的0次方,即是1页。如果设置为3,便是2的3次方,即是8页。
同时,设置为0也意味着关闭预读功能。文件默认值为3。我们可以根据我们的系统负载状态来设置预读的页数大小。
swap的干系操纵命令
可以利用mkswap将一个分区或者文件创建成swap空间。swapon可以查看当前的swap空间和启用一个swap分区或者文件。swapoff可以关闭swap空间。
我们利用一个文件的例子来演示一下全体操作过程:
制作swap文件:
启用swap文件:
关闭swap空间:
5、swap分区的优先级(priority)有啥用?
在利用多个swap分区或者文件的时候,还有一个优先级的观点(Priority)。
在swapon的时候,我们可以利用-p参数指定干系swap空间的优先级, 值越大优先级越高 ,可以指定的数字范围是-1到32767。
内核在利用swap空间的时候总是先利用优先级高的空间,后利用优先级低的。
当然如果把多个swap空间的优先级设置成一样的,那么两个swap空间将会以轮询办法并行进行利用。
如果两个swap放在两个不同的硬盘上,相同的优先级可以起到类似RAID0的效果,增大swap的读写效率。
其余,编程时利用mlock()也可以将指定的内存标记为不会换出,详细帮助可以参考man 2 mlock。
末了
关于swap的利用建议,针对不同负载状态的系统是不一样的。有时我们希望swap大一些,可以在内存不足用的时候不至于触发oom-killer导致某些关键进程被杀掉,比如数据库业务。
也有时候我们希望不要swap,由于昔时夜量进程爆发增长导致内存爆掉之后,会由于swap导致IO跑去世,全体系统都卡住,无法登录,无法处理。
这时候我们就希望不要swap,纵然涌现oom-killer也造成不了太大影响,但是不能许可做事器由于IO卡去世像多米诺骨牌一样全部去世机,而且无法上岸。跑cpu运算的无状态的apache便是类似这样的进程池架构的程序。
以是:
swap到底怎么用?要还是不要?设置大还是小?干系参数该当如何配置?是要根据我们自己的生产环境的情形而定的。
阅读完本文后希望大家可以明白一些swap的深层次知识。
Q&A:一个内存剩余还比较大的系统中,是否有可能利用swap?
A: 有可能,如果运行中的某个阶段出发了这个条件”zonefile+zonefree<=high_wmark_pages(zone) “,就可能会swap。
swappiness设置为0就相称于关闭swap么?
A: 不是的,关闭swap要利用swapoff命令。swappiness只是在内存发生回收操作的时候用来平衡cache回收和swap交流的一个参数,调度为0意味着,只管即便通过清缓存来回收内存。
swappiness设置为100代表系统会只管即便少用剩余内存而多利用swap么?
不是的,这个值设置为100表示内存发生回收时,从cache回收内存和swap交流的优先级一样。便是说,如果目前需求100M内存,那么较大机率会从cache中打消50M内存,再将匿名页换出50M,把回收到的内存给运用程序利用。但是这还要看cache中是否能有空间,以及swap是否可以交流50m。内核只是试图对它们平衡一些而已。
kswapd进程什么时候开始内存回收?
A: kswapd根据内存水位标记决定是否开始回收内存,如果标记达到low就开始回收,回收到剩余内存达到high标记为止。
如何查看当前系统的内存水位标记?
A: cat /proc/zoneinfo。
附Swap交流分区观点
什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文先容资料:
Linux divides its physical RAM (random access memory) into chucks of memory called pages. Swapping is the process whereby a page of memory is copied to the preconfigured space on the hard disk, called swap space, to free up that page of memory. The combined sizes of the physical memory and the swap space is the amount of virtual memory available.
Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory.Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files.
Linux内核为了提高读写效率与速率,会将文件在内存中进行缓存,这部分内存便是Cache Memory(缓存内存)。纵然你的程序运行结束后,Cache Memory也不会自动开释。这就会导致你在Linux系统中程序频繁读写文件后,你会创造可用物理内存变少。当系统的物理内存不足用的时候,就须要将物理内存中的一部分空间开释出来,以供当前运行的程序利用。那些被开释的空间可能来自一些很永劫光没有什么操作的程序,这些被开释的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中规复保存的数据到内存中。这样,系统总是在物理内存不足时,才进行Swap交流。
关于Swap分区,实在我们有很多疑问,如果能弄清楚这些疑问,那么你对Swap的理解节制就差不多了。如何查看Swap分区大小? Swap分区大小该当如何设置?系统在什么时候会利用Swap分区? 是否可以调度? 如何调度Swap分区的大小?Swap分区有什么利害和要把稳的地方? Swap分区是否必要?那么我一个一个来看看这些疑问吧!
查看Swap分区大小
查看Swap分区的大小以及利用情形,一样平常利用free命令即可,如下所示,Swap大小为2015M,目前没有利用Swap分区
[root@DB-Server ~]# free -m total used free shared buffers cachedMem: 1000 855 145 0 28 296-/+ buffers/cache: 530 470Swap: 2015 0 2015
其余我们还可以利用swapon命令查看当前swap干系信息:例如swap空间是swap partition,Swap size,利用情形等详细信息
[root@DB-Server ~]# swapon -sFilename Type Size Used Priority/dev/sda3 partition 2064344 0 -1[root@DB-Server ~]# cat /proc/swapsFilename Type Size Used Priority/dev/sda3 partition 2064344 0 -1[root@DB-Server ~]#
Swap分区大小设置
系统的Swap分区大小设置多大才是最优呢? 关于这个问题,该当说只能有一个统一的参考标准,详细还该当根据系统实际情形和内存的负荷综合考虑,像ORACLE的官方文档就推举如下设置,这个是根据物理内存来做参考的。
RAM
Swap Space
Up to 512 MB
2 times the size of RAM
Between 1024 MB and 2048 MB
1.5 times the size of RAM
Between 2049 MB and 8192 MB
Equal to the size of RAM
More than 8192 MB
0.75 times the size of RAM
其余在其它博客中看到下面一个推举设置,当然我不清楚其怎么得到这个标准的。是否合理也无从考证。可以作为一个参考。
4G以内的物理内存,SWAP 设置为内存的2倍。
4-8G的物理内存,SWAP 即是内存大小。
8-64G 的物理内存,SWAP 设置为8G。
64-256G物理内存,SWAP 设置为16G。
高下两个标准确实也很让人无所适从。我就有一次在一台ORACLE数据库做事器(64G的RAM),按照官方推举设置了一个很大的Swap分区,但是我创造实在这个Swap险些很少用到,实在是摧残浪费蹂躏了磁盘空间。以是如果根据系统实际情形和内存的负荷综合考虑,实在该当按照第二个参考标准设置为8G即可。当然这个只是个人的一些认知。
开释Swap分区空间
[root@testlnx ~]# free -m total used free shared buffers cachedMem: 64556 55368 9188 0 926 51405-/+ buffers/cache: 3036 61520Swap: 65535 13 65522[root@testlnx ~]# swapon -sFilename Type Size Used Priority/dev/mapper/VolGroup00-LogVol01 partition 67108856 14204 -1
利用swapoff关闭交流分区
[root@testlnx ~]# swapoff /dev/mapper/VolGroup00-LogVol01
利用swapon启用交流分区,此时查看交流分区的利用情形,你会创造used为0了
[root@testlnx ~]# swapon /dev/mapper/VolGroup00-LogVol01[root@testlnx ~]# free -m total used free shared buffers cachedMem: 64556 55385 9171 0 926 51406-/+ buffers/cache: 3052 61504Swap: 65535 0 65535[root@testlnx ~]#
Swap分区空间什么时候利用
系统在什么情形或条件下才会利用Swap分区的空间呢? 实在是Linux通过一个参数swappiness来掌握的。当然还涉及到繁芜的算法。
这个参数值可为 0-100,掌握系统 swap 的利用程度。高数值可优先系统性能,在进程不生动时主动将其转换出物理内存。低数值可优先互动性并只管即便避免将进程转换处物理内存,并降落反应延迟。默认值为 60。把稳:这个只是一个权值,不是一个百分比值,涉及到系统内核繁芜的算法。关于该参数请参考这篇文章[转载]调度虚拟内存,在此不做过多赘述。下面是关于swappiness的干系资料
The Linux 2.6 kernel added a new kernel parameter called swappiness to let administrators tweak the way Linux swaps. It is a number from 0 to 100. In essence, higher values lead to more pages being swapped, and lower values lead to more applications being kept in memory, even if they are idle. Kernel maintainer Andrew Morton has said that he runs his desktop machines with a swappiness of 100, stating that "My point is that decreasing the tendency of the kernel to swap stuff out is wrong. You really don't want hundreds of megabytes of BloatyApp's untouched memory floating about in the machine. Get it out on the disk, use the memory for something useful."
Swappiness is a property of the Linux kernel that changes the balance between swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space. The default value is 60, and for most desktop systems, setting it to 100 may affect the overall performance, whereas setting it lower (even 0) may improve interactivity (by decreasing response latency.
有两种临时修正swappiness参数的方法,系统重启后失落效
方法1:[root@DB-Server ~]# more /proc/sys/vm/swappiness60[root@DB-Server ~]# echo 10 > /proc/sys/vm/swappiness[root@DB-Server ~]# more /proc/sys/vm/swappiness10 方法2[root@DB-Server ~]#sysctl vm.swappiness=10
永久修正swappiness参数的方法便是在配置文件/etc/sysctl.conf里面修正vm.swappiness的值,然后重启系统
echo 'vm.swappiness=10' >>/etc/sysctl.conf
如果有人会问是否物理内存利用到某个百分比后才会利用Swap交流空间,可以明确的见告你不是这样一个算法,如下截图所示,及时物理内存只剩下8M了,但是依然没有利用Swap交流空间,而其余一个例子,物理内存还剩下19G,居然用了一点点Swap交流空间。
其余调度/proc/sys/vm/swappiness这个参数,如果你没有绝对把握,就不要随便调度这个内核参数,这个参数符合大多数情形下的一个最优值。
Swap交流分区对性能的影响
我们知道Linux可以利用文件系统中的一个常规文件或独立分区作为Swap交流空间,相对而言,交流分区要快一些。但是和RAM比较而言,Swap交流分区的性能依然比不上物理内存,目前的做事器上RAM基本上都相称充足,那么是否可以考虑抛弃Swap交流分区,是否不须要保留Swap交流分区呢?这个实在是我的疑问之一。在这篇What Is a Linux SWAP Partition, And What Does It Do?博客中,作者给出了swap交流空间的利害
Advantages:
Provides overflow space when your memory fills up completelyCan move rarely-needed items away from your high-speed memoryAllows you to hibernateDisadvantages:
Takes up space on your hard drive as SWAP partitions do not resize dynamicallyCan increase wear and tear to your hard driveDoes not necessarily improve performance (see below)实在保留swap分区概括起来可以从下面来看:
首先,当物理内存不敷以支撑系统和运用程序(进程)的运作时,这个Swap交流分区可以用作临时存放利用率不高的内存分页,把腾出的内存交给急需的运用程序(进程)利用。有点类似机房的UPS系统,虽然正常情形下不须要利用,但是非常情形下, Swap交流分区还是会发挥其关键浸染。
其次,纵然你的做事器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对付有发生内存泄露几率的运用程序(进程),Swap交流分区更是主要,由于谁也不想看到由于物理内存不敷导致系统崩溃。
末了,现在很多个人用户在利用Linux,有些乃至是PC的虚拟机上跑Linux系统,此时可能常用到休眠(Hibernate),这种情形下也是推举划分Swap交流分区的。
实在少量利用Swap交流空间是不会影响性能,只有当RAM资源涌现瓶颈或者内存透露,进程非常时导致频繁、大量利用交流分区才会导致严重性能问题。其余利用Swap交流分区频繁,还会引起kswapd0进程(虚拟内存管理中, 卖力换页的)耗用大量CPU资源,导致CPU飙升。
关于Swap分区的利害以及是否该当舍弃,我有点恶意见意义的想到了这个事情:人身上的两个器官,阑尾和扁桃体。切除阑尾或扁桃体是否也是辩论不休。其余,实在不要Swap交流分区,Linux也是可以正常运行的(有人提及过这个问题)
调度Swap分区的大小
如下测试案例所示,Swap分区大小为65535M,我现在想将Swap分区调度为8G,那么我们来看看详细操作吧
1:查看Swap的利用情形以及干系信息
[root@getlnx14uat ~]# swapon -sFilename Type Size Used Priority/dev/mapper/VolGroup00-LogVol01 partition 67108856 878880 -1[root@getlnx14uat ~]# free -m total used free shared buffers cachedMem: 3957 3920 36 0 39 3055-/+ buffers/cache: 825 3132Swap: 65535 858 64677
2: 关闭Swap交流分区
[root@getlnx14uat ~]# swapoff /dev/mapper/VolGroup00-LogVol01[root@getlnx14uat ~]# swapon -sFilename Type Size Used Priority
3: 这里是缩小Swap分区大小,如果是增大Swap分区大小,那么就须要扩展正在利用的swap分区的逻辑卷,此处利用lvreduce命令紧缩逻辑卷。
[root@getlnx14uat ~]# lvreduce -L 8G /dev/mapper/VolGroup00-LogVol01 WARNING: Reducing active logical volume to 8.00 GB THIS MAY DESTROY YOUR DATA (filesystem etc.)Do you really want to reduce LogVol01? [y/n]: y Reducing logical volume LogVol01 to 8.00 GB Logical volume LogVol01 successfully resized
4:格式化swap分区
[root@getlnx14uat ~]# mkswap /dev/mapper/VolGroup00-LogVol01Setting up swapspace version 1, size = 8589930 kB
5:启动swap分区,并增加到/etc/fstab自动挂载
[root@getlnx14uat ~]# swapon -sFilename Type Size Used Priority[root@getlnx14uat ~]# swapon /dev/mapper/VolGroup00-LogVol01[root@getlnx14uat ~]# swapon -sFilename Type Size Used Priority/dev/mapper/VolGroup00-LogVol01 partition 8388600 0 -1
参考资料:
https://wiki.archlinux.org/index.php/swap
http://blog.csdn.net/tianlesoftware/article/details/8741873
http://www.makeuseof.com/tag/swap-partition/