
1、swap的工作原理
在计算机发展早期,内存相对来说还是比较昂贵的,而且容量普遍不大,计算机在运行程序时难免会遇到内存不足的情况。如果能够在磁盘上划分一块区域当做内存来使用,就可以轻松解决不足的问题了,所以swap便出现了。
但是磁盘的读写性能远远不如内存,所以一定程序上来说,程序真到了使用swap的地步,那说明内存已经不足了。对于高性能应用来说,一般来说一是加大内容配置,再就是不使用swap。
那在使用到时,swap内会存放什么内存数据呢?
我们从之前的文章中知道内存主要用来存储系统的应用、指令、缓存等,这里面可以分类两类:文件页、匿名页。
什么是文件页?
文件页,顾名思义就是内存读取的系统中文件的数据放到内存中,也就是缓存中。什么是匿名页?
匿名页包含了应用程序进程动态分配的内存,例如堆栈等。
一般使用swap的是匿名页。我们一般称这部分内存数据写入swap叫换入,读取出叫换出。当内存不足时,系统要么利用系统的回收机制回收内存,要么使用swap换入换出,若还是不够,程序便会oom杀掉进程,以确保系统的正常运行。
2、内存的回收机制
前面讲了内存包含文件页和匿名页,但对于这两种类型的回收是不一样的。对文件页的回收,就是直接回收缓存,或者把脏页写回磁盘后再回收。而对匿名页的回收,其实就是通过
Swap的机制,把它们写入磁盘后再释放掉内存。
不管使用哪种方式,在系统内部都要有一套机制来控制何时才会进行回收。在系统有一个值叫pages_min,也就是页最小阈值,可以通过 **
/proc/sys/vm/min_free_kbytes ** 查看。
与之匹配的就有页低阈值(pages_low)和页高阈值(pages_high),而剩余的内存就使用pages_free 来表示。
在系统底层会通过kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。
- 剩余内存小于页最小阈值,说明进程的可用内存已经耗尽了,只有内核才可以分配内存。
- 剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
- 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力了,但还可以满足新内存的请求。
- 剩余内存大于页高阈值,说明剩余内存还比较多,没有内存压力。
3、优化swap的使用
1.开启 Swap 后,你可以设置 /proc/sys/vm/min_free_kbytes ,来调整系统定期回收内存的阈值。
在/proc/zoneinfo文件中可以看到内存的使用分配情况,这里面不仅包含Normal,还有DMA、DMA32等,只是这两个使用比较少。
$ cat /proc/zoneinfo
...
Node 0, zone Normal
pages free 227894
min 14896
low 18620
high 22344
...
nr_free_pages 227894
nr_zone_inactive_anon 11082
nr_zone_active_anon 14024
nr_zone_inactive_file 539024
nr_zone_active_file 923986
...
2.还可以设置 /proc/sys/vm/swappiness ,来调整文件页和匿名页的回收倾向。
swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
** 这里需要注意,即使参数设置为0,也照样会用swap。 **
linux的基本默认设置为60,也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。因为内存的速度会比磁盘要快很多,这样子会加大系统IO,同时造的成大量页的换入换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
#临时设置
sysctl -w vm.swappiness=1或者0
#永久生效 在/etc/sysctl.conf增加
vm.swappiness = 0
执行生效:sysctl -p
4、快速定位swap占用高的进程
按VmSwap使用量对进程排序,输出进程名称、进程ID以及SWAP用量
$ for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
以上命令是对占用swap高的进程进程筛选排序。
5、常用的swap清理方法
swapoff -a && swapon -a
需要说明的是,系统已经开始使用swap了,说明内存已经有压力了,这么强制换出有可能会导致内存问题,还是需要谨慎使用。
3119

被折叠的 条评论
为什么被折叠?



