【问题标题】:How can I know which process is using swap?我如何知道哪个进程正在使用交换?
【发布时间】:2015-05-27 11:36:06
【问题描述】:

有很多可用内存(大约 4G),但在我的 Fedora 盒子中使用了交换(200+M)。

我想知道哪个进程正在使用交换。我怎么知道。

pstop 只显示内存使用情况。

提前致谢。

【问题讨论】:

  • VmSwap/proc/<pid>/status
  • 为什么你想知道这个?

标签: linux memory swap


【解决方案1】:

改进cyberciti.biz 命令以显示更简洁的答案:

(echo "COMM PID SWAP"; for file in /proc/*/status ; do awk '/^Pid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | grep -wv "0 kB" | sort -k 3 -n -r) | column -t

示例输出:

COMM             PID    SWAP  
dockerd          662    2736  kB
skypeforlinux    26865  1320  kB
NetworkManager   303    1112  kB
slim             392    1028  kB
redis-server     350    204   kB

【讨论】:

    【解决方案2】:

    来自here

    [a] /proc/meminfo - 此文件报告有关内存使用情况的统计信息 系统。由 free 使用来报告免费和使用的数量 系统上的内存(物理和交换)以及共享 内核使用的内存和缓冲区。也可以免费使用,vmstat 和其他工具来查找相同的信息。

    [b] /proc/${PID}/smaps、/proc/${PID}/status 和 /proc/${PID}/stat :使用 这些文件用于查找有关内存、页面和交换的信息 每个进程都使用它的 PID。

    [c] smem - 此命令(python 脚本)报告内存使用情况 共享内存按比例分配。

    您也可以参考Find out what is using your swap

    #!/bin/bash
    # Get current swap usage for all running processes
    # Erik Ljungstrom 27/05/2011
    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"
    

    【讨论】:

    • 我运行了那个脚本,它给了我一个全面的 0,但 free -m 仍然说我正在使用 1.5 GB 交换空间,还有什么可能吗??
    【解决方案3】:

    /proc/'processPID'/status 上,您可以在VmSwap 字段中找到该信息。

    使用此命令,您可以列出所有正在使用交换的进程。

    for file in /proc/*/status ; 
    do 
    awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; 
    done
    

    参考:http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

    【讨论】:

      【解决方案4】:

      我对使用 awk 输出一个按交换使用情况排序的漂亮表格的看法:

        awk 'function pr(){if (s ~ /^[1-9]/) print p,n,s;n="";p="";s=""}BEGIN{FS="\t *";OFS="\t"}/^Name:/{pr();n=$2}/^VmSwap:/{s=$2}/^Pid:/{p=$2}END{pr()}' /proc/*/status | sort -t $'\t' -k3 -n -r | column -t -s $'\t'
      

      样本输出:

        33992  httpd        13916 kB
        9331   httpd        10616 kB
        43124  httpd        1800 kB
        31353  httpd        592 kB
        8592   master       184 kB
        8606   crond        44 kB
        8653   mingetty     40 kB
        8655   mingetty     32 kB
      

      基于adrianlzt 答案。

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 2021-07-14
        • 2023-01-21
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        相关资源
        最近更新 更多