swap交换分区被占用分析

本文深入讲解Linux系统的内存管理机制,包括物理内存与虚拟内存的区别、Swap分区的作用及如何避免Swap颠簸现象。同时介绍了如何利用free和sar命令来监控内存使用情况,并提供了查看进程占用Swap的实用脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、先了解一下linux对内存的管理方式: 
在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会把它翻译成物理内存地址。很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,解决方法是限制使用Swap: 

shell> sysctl -w vm.swappiness=0 查看内存情况最常用的是free命令: 
shell> free -m 

             total       used       free     shared    buffers     cached 
Mem:         32101      29377       2723          0        239      25880 
-/+ buffers/cache:       3258      28842 
Swap:         2047          0       2047 

新手看到used一栏数值偏大,free一栏数值偏小,往往会认为内存要用光了。其实并非如此,之所以这样是因为每当我们操作文件的时候,Linux都会尽可能的把文件缓存到内存里,这样下次访问的时候,就可以直接从内存中取结果,所以cached一栏的数值非常的大,不过不用担心,这部分内存是可回收的,操作系统会按照LRU算法淘汰冷数据。除了cached,还有一个buffers,它和cached类似,也是可回收的,不过它的侧重点在于缓解不同设备的操作速度不一致造成的阻塞,这里就不多做解释了。 
知道了原理,我们就可以推算出系统可用的内存是free + buffers + cached: 
shell> echo "2723 + 239 + 25880" | bc -l 
28842 

至于系统实际使用的内存是used –buffers –cached: 

shell> echo "29377 - 239 - 25880" | bc -l 

3258 
除了free命令,还可以使用sar命令: 
shell> sar -r 

kbmemfree kbmemused  %memused kbbuffers  kbcached 

  3224392  29647732     90.19    246116  26070160 

  3116324  29755800     90.52    245992  26157372 

  2959520  29912604     91.00    245556  26316396 

  2792248  30079876     91.51    245680  26485672 

  2718260  30153864     91.73    245684  26563540 

shell> sar -W 
pswpin/s pswpout/s 

    0.00      0.00 

    0.00      0.00 

    0.00      0.00 

    0.00      0.00 

    0.00      0.00 

二、简单命令方式查看swap被那些进程占用: 

简单脚本递归,列出swap使用pid ,top 10 
for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10 

查看指定进程所使用的swap命令: 
awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps  

三、查看所有进程占用情况swap的脚本: 

    #!/bin/bash  
    # Get current swap usage for all running processes  
    # writted by xly  
      
    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: $SUM - ($PROGNAME )"  
    let OVERALL=$OVERALL+$SUM  
    SUM=0  
      
    done  
    echo "Overall swap used: $OVERALL"  
    }  
      
    getswap  
    #getswap|egrep -v "Swap used: 0"  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值