Linux性能调优 为什么swap升高了

cover_image

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了,说明内存已经有压力了,这么强制换出有可能会导致内存问题,还是需要谨慎使用。

🔥运维干货分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值