Linux服务端swap配置和监控

转载地址:http://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=206046053&idx=1&sn=76f7a31003d80c3089c3a266e4b139e0#rd


什么是swap

Linux操作系统将物理内存分为多个小的内存块,称之为页(pages). 当应用请求的物理内存不够分配时,操作系统会将一段时间之内不用的内存页交换至swap分区,从而为应用释放内存空间。

Swap对于系统过来说非常重要:
首先,当主内存不够用时,操作系统可以swap out一部分内存页,迅速为当前急需内存的应用或者进程分配内存;其次,某些内存页只在应用初始化阶段用到,之后可能就不再使用了,操作系统可以将这些内存页swap out,从而为应用或者磁盘cache腾出更多的内存空间。

swap有哪些缺陷

我们知道,计算机磁盘I/O通常是系统的瓶颈所在。主内存的读写速度是纳秒级别,而磁盘读写速度是毫秒级别,两者相差3、4个数量级。然而,即使是当前广泛使用的SSD,读写速度相比主内存或者CPU cache也相差2、3个数量级。系统发生swap交换越多,那么系统自然也越慢。

特别对于web服务器来说,都是面对用户的交互式应用,因此响应速度尤其重要。如果系统经常因为swap交换而变得响应迟钝,那么用户体验效果可想而知。

总结成一句话:swap分区要有,在关键时刻不至于让你的应用因为内存不够用而被操作系统OOM KILLER干掉;但是不到关键时刻不要进行swap交换,因为这些操作会影响系统的响应速度。

人为干预Linux的swap行为——配置Swappiness

Swappiness是Linux的一个属性,取值范围0-100,用于控制操作系统进行swap out交换以及丢弃内存cache页的倾向程度:数值越高,表示操作系统进行swap out的“积极性”越高。

简而言之:
vm.swappiness = 0,表示只有在避免OOM的时候才进行swap操作;
vm.swappiness = 60,系统默认值;
vm.swappiness = 100,系统主动的进行swap操作。

查看当前swappiness参数,linux系统一般默认值为60:

$ cat /proc/sys/vm/swappiness 60

修改Swappiness参数:

$ sudo echo 0 > /proc/sys/vm/swappiness

为了使上面的修改永久生效,还需要在/etc/sysctl.conf后面加上

vm.swappiness = 0

目前酒店搜索组所属的服务器该参数都被配置为0.

监控服务器swap的使用

查看swap的整体使用情况

$ free -m
             total       used       free     shared    buffers     cached
Mem:          7836       6078       1758          0        165       3000
-/+ buffers/cache:       2911       4924
Swap:         7999          0       7999

关注最后一行就可以了,一目了然。

vmstat查看swap in 和 swap out

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 1721436 170864 3090256    0    0    53    50  153   28  3 10 87  0  0
1  0      0 1721548 170864 3090300    0    0     0    44 7220 5693  5 11 84  0  0
1  0      0 1721424 170864 3090300    0    0     0     0 6826 5196  5 10 85  0  0

其中si和so分别代表swap in和swap out,上图表明我的系统当前时间没有进行swap操作。

查看每个进程使用swap的情况

Linux系统中有一个文件smaps文件,记录了当前进程所对应的内存映像信息,路径为/proc/$pid/smaps,以酒店搜索组hslist系统的Java进程为例(只输出一个内存块镜像信息):

$ sudo cat /proc/25665/smaps | head -n9
40000000-40009000 r-xp 00000000 ca:07 1312980                            /home/q/java/jdk1.6.0_37/bin/java
Size:                36 kB
Rss:                 36 kB
Shared_Clean:        36 kB
Shared_Dirty:         0 kB
Private_Clean:        0 kB
Private_Dirty:        0 kB
Swap:                 0 kB
Pss:                 11 kB

其中Swap字段代表该内存块存在于swap分区的数据大小,其它字段的意思请戳这里。

了解了这个就可以用脚本统计了,以下脚本摘自网络,直接拿来用:

#!/bin/bash

function getswap {
SUM=0
OVERALL=0for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; doPID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`dolet SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"let OVERALL=$OVERALL+$SUM
SUM=0

done
echo "Overall swap used: $OVERALL"}

getswap
#getswap|egrep -v "Swap used: 0"

运行结果:

$ getswap|egrep -v "Swap used: 0"Overall swap used: 0

当然,多数时候我们只需要关注我们的java进程是否吃swap,这就更简单了,不需要上面那个复杂的脚本,单行awk就搞定了:

pgrep java | xargs -I{} sudo cat /proc/{}/smaps | grep 'Swap' | awk '{a+=$(NF-1)}END{print a}'

如何清除被占用的swap

在我们明确知道哪些进程吃swap以后,接下来的问题就是我们如何释放这些swap,释放swap的意思就是把交换到swap中的数据swap in到物理内存页中。有两种做法可以达到目的:

重启吃swap的服务,比如重启一下我们的java进程

swapoff && swapon
这个方法的好处是,不用重启服务,但是需要确保现在有足够的物理内存可以容下从swap中释放出来的数据。下面给出了swapoff和swapon的具体做法,大家注意看swapoff后和swapon后,free的输出有什么异同。


可以看到swapoff后,free的输出里,swap分区的大小变为0,占用变为0,也就是说swap分区中的数据已经释放到物理内存中,同时swap分区被禁用。swapon后,free的输出里,swap分区的容量又恢复为4094M,也就是说swap分区重新被启用了。当然我们可以把这两个命令写到一起:

sudo /sbin/swapoff -a && sudo /sbin/swapon -a

参考文献

http://www.data-recovery-app.com/datarecovery/linux-swap.html
http://arminds.com/forums/linux-talk/226-configure-linux-swap-to-improve-server-performance
http://en.wikipedia.org/wiki/Swappiness



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值