ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 转:Linux check mem,cpu,Swap

转:Linux check mem,cpu,Swap

Linux操作系统 作者:luckyfriends 时间:2016-12-28 21:01:52 0 删除 编辑

1.什么是swap

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

Swap对于系统过来说非常重要:

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

2.swap会带来哪些问题

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

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

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

关于swap的swap in和swap out可以从vmstat命令查看(si表示swap in, so表示swap out).参考: http://xiaobaoqiu.github.io/blog/2015/01/26/vmstatgong-ju/

3.查看swap占用

free命令, 参考: http://xiaobaoqiu.github.io/blog/2014/09/04/linux-memory-usage/

4.找到swap占用元凶

Linux系统中有一个文件smaps文件,记录了当前进程所对应的内存映像信息,路径为/proc/$pid/smaps.以本机的一个线程为例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
xiaobaoqiu@xiaobaoqiu:~/octopress$ sudo cat /proc/3555/smaps | head -16 00400000-00401000 r-xp 00000000 08:13 3444936                            /usr/local/jdk1.7.0_72/bin/java Size:                  4 kB Rss:                   4 kB Pss:                   4 kB Shared_Clean:          0 kB Shared_Dirty:          0 kB Private_Clean:         4 kB Private_Dirty:         0 kB Referenced:            4 kB Anonymous:             0 kB AnonHugePages:         0 kB Swap:                  0 kB KernelPageSize:        4 kB MMUPageSize:           4 kB Locked:                0 kB VmFlags: rd ex mr mw me dw

其中Swap表示这个线程占有Swap的情况.

查看swap的占有情况的脚本,按照占用swap的占用多少从高到底排序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
#!/bin/bash  function getswap { SUM=0 OVERALL=0 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do PID=`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 }'` do let SUM=$SUM+$SWAP done echo "PID=$PID    Swap used(KB): $SUM    ($PROGNAME )" let OVERALL=$OVERALL+$SUM SUM=0  done echo "Overall swap used: $OVERALL" }  getswap|sort -k4nr

然后运行:

1 
sudo ~/check_swap.sh

5.清除被占用的swap

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

1.重启吃swap的服务,比如重启一下我们的java进程;
2.swapoff + swapon
这个方法的好处是,不用重启服务,但是需要确保现在有足够的物理内存可以容下从swap中释放出来的数据。下面给出了swapoff和swapon的具体做法,注意看swapoff后和swapon后,free的输出有什么异同;

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

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

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

http://xiaobaoqiu.github.io/blog/2015/06/23/linux-swap/
http://blog.csdn.net/longerzone/article/details/8015941
http://www.xlgps.com/article/222621.html
http://www.cnblogs.com/lidabo/p/4738113.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14710393/viewspace-2131566/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
长期从事IT相关工作。

注册时间:2009-06-06

  • 博文量
    465
  • 访问量
    3307366