zoukankan      html  css  js  c++  java
  • Linux查看哪些进程用了Swap分区

    如果系统的物理内存用光了,则会用到swap。系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。所以要高度重视。

    free 

    free -m

    就能看出当前系统所使用的swap了。那么如何查看哪些进程使用了swap呢,这样好针对性的做出优化。

    top

    Centos(6.0之前):

    top只能看到swap总使用量

    网上很多人说top+f+p能显示出来swap。可是按完f查看的时候,man top里面swap的解释是:

    并不是实际的使用swap。而是VIRT-RES得来的。用我蹩脚的英文翻译就是,虚拟内存中所使用过的swap部分

    Centos(6.0之后):

    man top

    这样就明显看出是取出的每个进程的swap,能很方便的查看哪些进程使用了swap。从中也能看到一个信息。那就是读取了/proc/#/status

    vmstat

    vmstat -n 1

    也能查看到

    仍旧无法查看到哪些进程使用了。但是能看到si、so 

    Memory(内存):

    • swpd: 使用虚拟内存大小
    • free: 可用内存大小
    • buff: 用作缓冲的内存大小
    • cache: 用作缓存的内存大小

    Swap:

    • si: 每秒从交换区写到内存的大小
    • so: 每秒写入交换区的内存大小

    Shell脚本

    在Linux内核 2.6.16中引入了一个系统内存接口特性,这个接口位于/proc/$pid/目录下的smaps文件中 ,一看内容发现是进程内存映像信息,比同一目录下的maps文件更详细些。
    cat /proc/1/smaps
    这里解释下samps里面的内容:
    • bfdca000-bfddf000 是该虚拟内存段的开始和结束位置
    • rw-p 内存段的权限,rw是指可读写,p是指私有,如果是s则为共享
    • bffea000 该虚拟内存段在对应的映射文件中的偏移量
    • 00:00 文件的主设备和次设备号
    • 0 被映射到虚拟内存的文件的索引节点号
    • [stack] 被映射到虚拟内存的文件名称
    • Size 是进程使用内存空间,并不一定实际分配了内存(VSS)
    • Rss是实际分配的内存(不需要缺页中断就可以使用的)
    • Shared_Clean 和其他进程共享的未改写页面
    • Shared_Dirty 和其他进程共享的已改写页面
    • Private_Clean 未改写的私有页面页面
    • Private_Dirty 已改写的私有页面页面
    • Swap 存在于交换分区的数据大小(如果物理内存有限,可能存在一部分在主存一部分在交换分区)
    • Pss是平摊计算后的使用内存(有些内存会和其他进程共享,例如mmap进来的)

    这里能显示出swap

    那么查看你想要看的进程所使用的swap只需要:

    awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps  
    也可以写shell统计所以进程的:
    #!/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"  
    既然知道了原理,大家各自发挥,什么语言都可以统计

    iotop还是非常好用的,能看到哪些进程使用了swap

    参考:

    http://blog.csdn.net/xiangliangyu/article/details/8213127(以上内容转自此篇文章)

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/EasonJim/p/8100499.html
Copyright © 2011-2022 走看看