如何找出 Linux 中哪些进程正在使用交换空间?

2024-10-22 08:28:00
admin
原创
56
摘要:问题描述:在 Linux 下,如何找出哪个进程使用交换空间较多?解决方案 1:我发现的最佳脚本在此页面上:http ://northernmost.org/blog/find-out-what-is-using-your-swap/这是脚本的一个变体,不需要root:#!/bin/bash # Get cur...

问题描述:

在 Linux 下,如何找出哪个进程使用交换空间较多?


解决方案 1:

我发现的最佳脚本在此页面上:http ://northernmost.org/blog/find-out-what-is-using-your-swap/

这是脚本的一个变体,不需要root:

#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
    PID=`echo $DIR | cut -d / -f 3`
    PROGNAME=`ps -p $PID -o comm --no-headers`
    for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
    do
        let SUM=$SUM+$SWAP
    done
    if (( $SUM > 0 )); then
        echo "PID=$PID swapped $SUM KB ($PROGNAME)"
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "Overall swap used: $OVERALL KB"

解决方案 2:

运行top然后按O`p`Enter。现在进程应该根据其交换使用情况进行排序。

以下是更新,因为我的原始答案并未提供评论中指出的问题的确切答案。来自htop FAQ:

无法获取进程已用交换空间的确切大小。Top 通过使 SWAP = VIRT - RES 伪造此信息,但这不是一个很好的指标,因为其他内容(例如视频内存)也依赖于 VIRT(例如:top 说我的 X 进程正在使用 81M 的交换空间,但它还报告我的整个系统仅使用了 2M 的交换空间。因此,我不会在 htop 中添加类似的 Swap 列,因为我不知道获取此信息的可靠方法(实际上,由于共享页面,我认为不可能获得确切的数字)。

解决方案 3:

这是该脚本的另一种变体,但旨在提供更易读的输出(您需要以 root 身份运行该脚本才能获得准确的结果):

#!/bin/bash

    # find-out-what-is-using-your-swap.sh
    # -- Get current swap usage for all running processes
    # --
    # -- rev.0.3, 2012-09-03, Jan Smid          - alignment and intendation, sorting
    # -- rev.0.2, 2012-08-09, Mikko Rantalainen - pipe the output to "sort -nk3" to get sorted output
    # -- rev.0.1, 2011-05-27, Erik Ljungstrom   - initial version


SCRIPT_NAME=`basename $0`;
SORT="kb";                 # {pid|kB|name} as first parameter, [default: kb]
[ "$1" != "" ] && { SORT="$1"; }

[ ! -x `which mktemp` ] && { echo "ERROR: mktemp is not available!"; exit; }
MKTEMP=`which mktemp`;
TMP=`${MKTEMP} -d`;
[ ! -d "${TMP}" ] && { echo "ERROR: unable to create temp dir!"; exit; }

>${TMP}/${SCRIPT_NAME}.pid;
>${TMP}/${SCRIPT_NAME}.kb;
>${TMP}/${SCRIPT_NAME}.name;

SUM=0;
OVERALL=0;
    echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;

for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/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

    if (( $SUM > 0 ));
    then
        echo -n ".";
        echo -e "${PID}    ${SUM}    ${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.pid;
        echo -e "${SUM}    ${PID}    ${PROGNAME}" >> ${TMP}/${SCRIPT_NAME}.kb;
        echo -e "${PROGNAME}    ${SUM}    ${PID}" >> ${TMP}/${SCRIPT_NAME}.name;
    fi
    let OVERALL=$OVERALL+$SUM
    SUM=0
done
echo "${OVERALL}" > ${TMP}/${SCRIPT_NAME}.overal;
echo;
echo "Overall swap used: ${OVERALL} kB";
echo "========================================";
case "${SORT}" in
    name )
        echo -e "name    kB    pid";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.name|sort -r;
        ;;

    kb )
        echo -e "kB    pid    name";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.kb|sort -rh;
        ;;

    pid | * )
        echo -e "pid    kB    name";
        echo "========================================";
        cat ${TMP}/${SCRIPT_NAME}.pid|sort -rh;
        ;;
esac
rm -fR "${TMP}/";

解决方案 4:

使用smem

smem -s swap -r

这里有一个链接告诉您如何安装和使用它: http ://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

解决方案 5:

我的 bash 版本

更快更准确的答案:

仔细 阅读man 5 proc手册页,您可能会注意到:

   /proc/pid/status
          VmSwap Swapped-out virtual  memory  size  by  anonymous  private
                 pages;  shmem  swap  usage  is  not included (since Linux
                 2.6.34).  This value is inaccurate;  see  /proc/pid/statm
                 above.

从 Linux 2.6.34 开始,这个值不准确!!

那么,滚动proc/pid/statm就是更复杂的事情......(请注意,即使滚动smaps条目,我的脚本仍然比其他版本快得多;-)

#!/bin/bash

txtsize() { # Convert integer into readable string, store result in $2 varname
    local i=$(($1>=1<<50?5:$1>=1<<40?4:$1>=1<<30?3:$1>=1<<20?2:$1>1023?1:0))
    local a=(K M G T P)
    ((i>4?i+=-2:0)) && a=(${a[@]:2}) && set -- $(($1>>20)) $2
    local r=00$((1000*$1/(1024**i)))
    printf -v $2 %.2f%s ${r::-3}.${r: -3} ${a[i]}
}
topSwapped() {
    local -i total=0 cnt=${1:-3} used
    local -a bypid=() bysize=() sizes=()
    local pid swaped cmd field val
    LANG=C
    printf 'Show swap usage %20s %10s
' Pid Swapped
    while read -r pid swaped cmd; do
        rSwaped=$(( rSwaped=0$(sed -ne < /proc/$pid/smaps \n                                   's/Swap: *([1-9][0-9]+) kB/+/p;d' ),
                        rSwaped > 0 ? rSwaped : swaped  ))
        bysize[$rSwaped]+="${pid} " bypid[$pid]=${cmd}
    done< <( sed -ne' /^Name:/h; /^Pid:/H; /^VmSwap:[[:space:]]*[1-9]/{
        s/.* ([0-9]+) +kB//; /^0/!{
        H; x; s/^.*:o11(.*)
.*:o11(.*)
(.*)/  /; p; }}'\n                /proc/[1-9]*/status 2>/dev/null ) 2> >(
        grep -v 'Permission denied')
    while read field val _; do case $field in
        SwapTotal:) used=$val;; SwapFree:) used+=-$val; break;;
    esac; done < /proc/meminfo

    sizes=(${!bysize[@]})
    for ((i=${#sizes[@]};i--;)); do
        read -ra pids <<<${bysize[sizes[i]]}
        for pid in ${pids[@]}; do
            total+=sizes[i]
            if ((cnt-->0)); then
                txtsize ${sizes[i]} swaped
                printf ' - %-20s %12s %10s
' "${bypid[pid]}" "$pid" "$swaped"
            fi
        done
    done
    txtsize $total swaped
    txtsize $used hused
    cnt=${#bypid[@]}
    printf  'Total: %d pids %*s. Swap used: %s
' "$cnt" \n            $((34-${#cnt})) $swaped $hused
}
topSwapped ${1:-12}   # show only top 12 if no arguments

如果没有参数,此列表仅列出前 12 个 pid。

输出样例:

Show swap usage                  Pid    Swapped
 - wallam-desktop             513829      7.54M
 - mate-geyes-appl              3361      4.16M
 - wnck-applet                  3368      4.06M
 - parcellite                   3133      3.71M
 - xterm                     1477112      1.40M
 - mono-didactic              476146      1.28M
 - mate-panel                   3079      1.23M
 - mate-extended-p            513267    916.00K
 - bash                      1477118    836.00K
 - mutt                        72890    832.00K
 - mate-volume-con              3167    772.00K
 - pipewire-pulse               2751    552.00K
Total: 37 pids                           28.81M. Swap used: 35.96M

在总行中,最后的Swap 使用值是从中提取的/proc/meminfo

这个答案现在与另一个答案紧密相关,如果有可用 RAM,如何清空交换?

还有两个**三个变体:

**编辑2023-07-23!

避免 shell 中的循环:

#!/bin/bash
printf '%12s %15s  %s
' Pid Swap Usage Command
sort -nk2 < <(
    sed -ne '
        /^Name:/h;
        /^Pid:/H;
        /^VmSwap:/{
          H;
          x;
          s/^.*:o11(.*)
.*:o11(.*)
.*:[[:space:]]*(.*) kB/                        /;
          s/^ *([0-9 ]{12}) *([0-9 ]{12}) /  kB /p;
          s/^ *[0-9]+ +([0-9]+) .*/+/;
          w /dev/fd/9' \n              -e '}' /proc/[1-9]*/status 9> >(
        printf 'Total:%19d Kb
' $(( $( cat ) ))
    )
)
         Pid      Swap Usage  Command
     1016977            0 kB  cupsd
     1017018            0 kB  cups-browsed
...
       95905        82376 kB  snort
     4123941        86052 kB  Xorg
Total:             927964 Kb

任务并行化的情况:

  • 所有状态文件都直接由打开sed

  • 输出列的格式和对齐方式如下sed

  • sed命令还将发送所有带有+符号的金额,FD/9

  • 汇总,通过一次操作完成,bash(使用 1 个forkcat),

  • sort然后整个输出按命令、按交换使用情况排序。

  • 这个版本确实非常快!!

与其他答案相比,在相同条件下:

Method                              Duration

lolotux's script                    0m14.165s
j3nda's script                      0m15.467s
Tom's `smem`                        0m3.109s
My perl version                     0m0.443s
Tensibai's grep + awk script        0m0.053s
This bash + sed + sort script       0m0.037s

少于 4 百分之一秒 vs 多于 12 秒:快 300 倍以上!(也比我的 perl 版本快 12 倍!;)

Tensibai 的答案也提供了一个并行化版本,但是grep速度较慢sed并且awk没有用,因为唯一的计算可以由bash他自己快速完成。

与评论相同

#!/bin/bash
printf '%12s %15s  %s
' Pid Swap Usage Command # Head line
sort -nk2 < <( # Sort all output by 2nd colunm
    sed -ne '  # Run sed -n for "no output"
        /^Name:/h; # Replace ``hold space'' by current line
        /^Pid:/H;  # Add current line to ``hold space''
        /^VmSwap:/{ # On line that begin by VmSwap, do...
          H;       # Add current line to ``hold space''
          x;       # Swap current line and ``hold space''
          # Drop field names and newlines, add 11 space before numbers
          s/^.*:o11(.*)
.*:o11(.*)
.*:[[:space:]]*(.*) kB/                        /;
          # format number align to 12 chars, then print line
          s/^ *([0-9 ]{12}) *([0-9 ]{12}) /  kB /p;
          # replace everything by sign ``+'' and 2nd number.
          s/^ *[0-9]+ +([0-9]+) .*/+/;
          # write to FD9
          w /dev/fd/9' -e \n              '} # done (on VmSwap line...)' /proc/[1-9]*/status 9> >(
        printf 'Total:%19d Kb
' $(($(cat)))
    )
)

相同浓缩

对于快速测试,简单copy'n paste

printf '%12s %15s  %s
' Pid Swap Usage Command;sort -nk2 < <(sed -ne'/^Name:/h
/^Pid:/H;/^VmSwap:/{H;x;s/^.*:o11(.*)
.*:o11(.*)
.*:[[:space:]]*(.*)\n? kB/o1o1  /;s/o1/           /g;s/^ *([0-9 ]{12}) *(\n?[0-9 ]{12}) /  kB /p;s/^ *[^ ]+ +([0-9]+) .*/+/;w /dev/fd/9'\n -e } /proc/[1-9]*/status 9> >(printf 'Total:%19d Kb
' $(($(cat)))))

(注意:为了将行数限制在 80 个字符以内,sed脚本稍微长一些(增加了一个用于o1格式化的步骤和一些用于允许正则表达式中换行的无用测试),但执行时间似乎不受影响。)

旧答案

由于在小型系统上无法安装,top因此始终可以进行浏览。htop`/proc`

即使在小型系统上,您也会发现shell...

一个壳变体!(不仅限于 bash)

这和lolotux 脚本完全相同,但不需要任何分叉grepawkps。这要快得多!

并且狂欢是最贫穷的国家之一壳关于性能,做了一些工作以确保这个脚本可以在短跑,忙碌箱还有一些其他的。然后,(感谢 Stéphane Chazelas,)又变得更快了!

#!/bin/sh 
# Get current swap usage for all running processes
# Felix Hauri 2016-08-05
# Rewritted without fork. Inspired by first stuff from
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk4" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo

OVERALL=0
for FILE in /proc/[0-9]*/status ;do
    SUM=0
    while read FIELD VALUE;do
        case $FIELD in
            Pid:)    PID=$VALUE         ;;
            Name:)   PROGNAME="$VALUE"  ;;
            VmSwap:) SUM=${VALUE%% *} ; break ;;
        esac
    done <$FILE
    [ $SUM -gt 0 ] &&
        printf "PID: %9d  swapped: %11d KB (%s)
" $PID $SUM "$PROGNAME"
    OVERALL=$((OVERALL+SUM))
done
printf "Total swapped memory: %14u KB
" $OVERALL

别忘了加双引号"$PROGNAME"!参见Stéphane Chazelas 的评论:

read FIELD PROGNAME < <(
    perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/status
)
echo $FIELD "$PROGNAME"

不要echo $PROGNAME在合理的系统上尝试不使用双引号,并且要做好终止当前 shell 的准备!

以及perl版本

由于这已经成为一个不那么简单的脚本,因此是时候使用更高效的语言编写一个专用的工具了。

#!/usr/bin/perl -w

use strict;
use Getopt::Std;
my ($tot,$mtot)=(0,0);
my %procs;

my %opts;
getopt('', %opts);

sub sortres {
    return $a <=> $b                                          if $opts{'p'};
    return $procs{$a}->{'cmd'} cmp $procs{$b}->{'cmd'}        if $opts{'c'};
    return $procs{$a}->{'mswap'} <=> $procs{$b}->{'mswap'}    if $opts{'m'};
    return $procs{$a}->{'swap'} <=> $procs{$b}->{'swap'};
};

opendir my $dh,"/proc";

for my $pid (grep {/^d+$/} readdir $dh) {
    if (open my $fh,"</proc/$pid/status") {
        my ($sum,$nam)=(0,"");
        while (<$fh>) {
            $sum+=$1 if /^VmSwap:s+(d+)s/;
            $nam=$1 if /^Name:s+(S+)/;
        }
        if ($sum) {
            $tot+=$sum;
            $procs{$pid}->{'swap'}=$sum;
            $procs{$pid}->{'cmd'}=$nam;
            close $fh;
            if (open my $fh,"</proc/$pid/smaps") {
                $sum=0;
                while (<$fh>) {
                    $sum+=$1 if /^Swap:s+(d+)s/;
                };
            };
            $mtot+=$sum;
            $procs{$pid}->{'mswap'}=$sum;
        } else { close $fh; };
    };
};
map {
    printf "PID: %9d  swapped: %11d (%11d) KB (%s)
",
        $_, $procs{$_}->{'swap'}, $procs{$_}->{'mswap'}, $procs{$_}->{'cmd'};
} sort sortres keys %procs;
printf "Total swapped memory: %14u (%11u) KB
", $tot,$mtot;

可以通过运行其中一个

-c  sort by command name
-p  sort by pid
-m  sort by swap values
by default, output is sorted by status's vmsize

解决方案 6:

目前还不完全清楚您的意思是想找到交换出最多页面的进程还是导致交换出最多页面的进程。

对于第一个,您可以运行top并按交换排序(按“Op”),对于后者,您可以运行vmstat并查找“so”的非零条目。

解决方案 7:

另一个避免 shell 中循环的脚本变体:

#!/bin/bash
grep VmSwap /proc/[0-9]*/status | awk -F':' -v sort="$1" '
  {
    split($1,pid,"/") # Split first field on /
    split($3,swp," ") # Split third field on space
    cmdlinefile = "/proc/"pid[3]"/cmdline" # Build the cmdline filepath
    getline pname[pid[3]] < cmdlinefile # Get the command line from pid
    swap[pid[3]] = sprintf("%6i %s",swp[1],swp[2]) # Store the swap used (with unit to avoid rebuilding at print)
    sum+=swp[1] # Sum the swap
  }
  END {
    OFS="    " # Change the output separator to tabulation
    print "Pid","Swap used","Command line" # Print header
    if(sort) {
      getline max_pid < "/proc/sys/kernel/pid_max"
      for(p=1;p<=max_pid;p++) {
        if(p in pname) print p,swap[p],pname[p] # print the values
      }
    } else {
      for(p in pname) { # Loop over all pids found
        print p,swap[p],pname[p] # print the values
      }
    }
    print "Total swap used:",sum # print the sum
  }'

标准用法是以script.sh随机顺序获取每个程序的使用情况(直到如何awk存储其哈希值)或script.sh 1按 pid 对输出进行排序。

我希望我已经对代码进行了足够的注释以说明它的作用。

解决方案 8:

top 命令还包含一个字段,用于显示进程的页面错误数。页面错误数最多的进程将是交换次数最多的进程。对于长时间运行的守护进程,它们可能在开始时产生大量页面错误,而这个数字后来并没有增加。所以我们需要观察页面错误是否在增加。

解决方案 9:

我在网上改编了一个不同的脚本来编写这一长行代码:

 { date;for f in /proc/[0-9]*/status; do 
   awk '{k[$1]=$2} END { if (k["VmSwap:"]) print k["Pid:"],k["Name:"],k["VmSwap:"];}' $f 2>/dev/null; 
   done | sort -n ; }

然后我将其放入 cronjob 并将输出重定向到日志文件。此处的信息与累积 smaps 文件中的条目相同Swap:,但如果您想确定,可以使用:

{ date;for m in /proc/*/smaps;do 
  awk '/^Swap/ {s+=$2} END { if (s) print FILENAME,s }' $m 2>/dev/null;
  done | tr -dc ' [0-9]
' |sort -k 1n; }

此版本的输出分为两列:pid、交换量。在上述版本中,删除tr了非数字部分。在这两种情况下,输出都按 pid 按数字排序。

解决方案 10:

给出使用交换的进程的总数和百分比

smem -t -p

在此处输入图片描述

来源:https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

解决方案 11:

这是我的一句话:

cat /proc/*/status | grep -E 'VmSwap:|Name:' | grep VmSwap -B1 | cut -d':' -f2 | grep -v '--' | grep -o -E '[a-zA-Z0-9]+.*$' | cut -d' ' -f1 | xargs -n2 echo | sort -k2 -n

此行中的步骤如下:

  • /proc/process/status获取所有流程的所有数据

  • 为每个字段选择 VmSwap 和 Name

  • 删除没有 VmSwap 字段的进程

  • 删除字段名称(VmSwap: 和 Name:)

  • 删除上一步添加的带有 -- 的行

  • 删除行首的空格

  • 删除每个进程名称的第二部分以及交换使用量数字后的“kB”

  • 获取名称和编号(进程名称和交换使用情况)并将它们放在一行中,一个接一个

  • 根据交换使用情况对行进行排序

解决方案 12:

在 MacOSX 上,您也可以运行 top 命令,但需要先输入“o”,然后输入“vsize”,然后按 ENTER。

解决方案 13:

这是输出与 @loolotux 脚本相同的版本,但速度更快(但可读性较差)。该循环在我的计算机上大约需要 10 秒,我的版本需要 0.019 秒,这对我来说很重要,因为我想将其变成 cgi 页面。

    join -t / -1 3 -2 3 \n    <(grep VmSwap /proc/*/status  |egrep -v '/proc/self|thread-self' | sort -k3,3 --field-separator=/ ) \n    <(grep -H  '' --binary-files=text /proc/*/cmdline |tr '' ' '|cut -c 1-200|egrep -v '/proc/self|/thread-self'|sort -k3,3 --field-separator=/ ) \n    | cut -d/ -f1,4,7- \n    | sed 's/status//; s/cmdline//' \n    | sort -h -k3,3 --field-separator=:\n    | tee >(awk -F: '{s+=$3} END {printf "
Total Swap Usage = %.0f kB
",s}') /dev/null

解决方案 14:

自 2015 年添加内核补丁SwapPss( https://lore.kernel.org/patchwork/patch/570506/ ) 以来,终于可以获得比例交换计数,这意味着如果一个进程交换了很多,然后它分叉,则两个分叉进程将报告各自交换 50%。如果其中一个然后分叉,则每个进程计为交换页面的 33%,因此如果将所有这些交换使用量加在一起,您将获得真正的交换使用量,而不是将值乘以进程数。

简而言之:

(cd /proc; for pid in [0-9]*; do printf "%5s %6s %s
" "$pid" "$(awk 'BEGIN{sum=0} /SwapPss:/{sum+=$2} END{print sum}' $pid/smaps)" "$(cat $pid/comm)"; done | sort -k2n,2 -k1n,1)

第一列是 pid,第二列是交换使用情况(以 KiB 为单位),其余行是正在执行的命令。相同的交换计数按 pid 排序。

上面可能会出现如下行

awk: cmd. line:1: fatal: cannot open file `15407/smaps' for reading (No such file or directory)

这仅仅意味着 pid 为 15407 的进程在看到它出现在列表中/proc/和读取进程smaps文件之间结束。如果这对您来说很重要,只需将其添加2>/dev/null到末尾即可。请注意,您还可能会丢失任何其他可能的诊断信息。

在现实世界的示例中,这会将其他工具报告的一台服务器上运行的每个 Apache 子程序的交换使用量约为 40 MB 更改为每个子程序实际使用的 7-3630 KB 之间的交换使用量。

解决方案 15:

top我想你可以通过运行并查找使用大量内存的活动进程来获得一个很好的猜测。以编程方式执行此操作更难——只需看看有关 Linux OOM killer 启发式方法的无休止争论即可。

交换是指使用中的内存多于安装的内存,因此通常很难将其归咎于单个进程。如果这是一个持续存在的问题,最好的解决方案是安装更多内存或进行其他系统更改。

解决方案 16:

我不知道如何找到使用交换空间的进程的直接答案,但是,此链接可能会有所帮助。另一个不错的链接在这里

另外,使用像 htop 这样的好工具来查看哪些进程正在使用大量内存以及总共使用了多少交换空间。

解决方案 17:

iotop是一款非常有用的工具。它提供每个进程/线程的 I/O 和交换使用情况的实时统计数据。默认情况下,它显示每个线程,但您可以iotop -P获取每个进程的信息。默认情况下此功能不可用。您可能必须通过 rpm/apt 安装。

解决方案 18:

您可以使用Procpath(作者在这里)来简化VmSwap来自的解析/proc/$PID/status

$ procpath record -f stat,cmdline,status -r 1 -d db.sqlite
$ sqlite3 -column db.sqlite \n  'SELECT status_name, status_vmswap FROM record ORDER BY status_vmswap DESC LIMIT 5'
Web Content  192136       
okular       186872       
thunderbird  183692       
Web Content  143404       
MainThread   86300

您还可以VmSwap像这样随时间绘制感兴趣的进程。在这里,我记录了我的 Firefox 进程树,同时打开了几十个选项卡,并启动了一个内存占用大的应用程序,试图使其交换(这对 Firefox 来说并不令人信服,但您的里程可能会有所不同)。

$ procpath record -f stat,cmdline,status -i 1 -d db2.sqlite \n  '$..children[?(@.stat.pid == 6029)]'
# interrupt by Ctrl+C
$ procpath plot -d db2.sqlite -q cpu --custom-value-expr status_vmswap \n  --title "CPU usage, % vs Swap, kB"

CPU 使用率,% vs Swap,kB

解决方案 19:

与@lolotux的答案相同,但具有排序的输出:

printf 'Computing swap usage...
';
swap_usages="$(
    SUM=0
    OVERALL=0

    for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
    do
        PID="$(printf '%s' "$DIR" | cut -d / -f 3)"
        PROGNAME=`ps -p $PID -o comm --no-headers`
        for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
        do
            let SUM=$SUM+$SWAP
        done
        if (( $SUM > 0 )); then
            printf "$SUM KB ($PROGNAME) swapped PID=$PID\\n"
        fi
        let OVERALL=$OVERALL+$SUM
        SUM=0
        break
    done
    printf '9999999999 Overall swap used: %s KB
' "$OVERALL"
)"

printf '%s' "$swap_usages" | sort -nk1

示例输出:

Computing swap usage...
2064 KB (systemd) swapped PID=1
59620 KB (xfdesktop) swapped PID=21405
64484 KB (nemo) swapped PID=763627
66740 KB (teamviewerd) swapped PID=1618
68244 KB (flameshot) swapped PID=84209
763136 KB (plugin_host) swapped PID=1881345
1412480 KB (java) swapped PID=43402
3864548 KB (sublime_text) swapped PID=1881327
9999999999 Overall swap used: 2064 KB

解决方案 20:

我使用这个,如果你只有 /proc 而没有其他有用的东西,它很有用。只需将 nr 设置为你想要查看的顶级交换器的数量,它就会告诉你进程名称、交换占用空间(MB)以及 ps -ef 的完整进程行:

nr=10;对于 $ 中的 pid(对于 /proc/ /status 中的文件;执行 awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r|head -${nr}|awk '{ print $2 }');执行 awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' /proc/$pid/status|awk '{print $1" "$2" "$3/1024" MB"}'|sed -e 's/.[0-9] //g';ps -ef|awk "$2==$pid {print}";echo;完成

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用