2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26
Advertisement

如果我做'ps -ef',如何显示每个进程的内存使用情况?

Advertisement

在Linux中,如果我做了ps -ef,怎样才能显示每个进程的内存使用情况?我想看到每个进程的 “虚拟内存"、"res内存"、"共享内存"。我可以通过top得到这些信息,但我希望在ps -ef中得到同样的信息,这样我就可以用进程名称将输出结果管到grep

Advertisement
Advertisement

答案 (8)

11
11
11
2015-03-11 13:16:28 +0000

@user26528 的答案并没有正确计算内存–你需要的是 smaps 中所有映射的总和,而不仅仅是顶部的映射。这个脚本应该可以做到。

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [-f /proc/$pid/smaps]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done
11
11
11
2010-01-29 07:09:40 +0000

ps ef -o command,vsize,rss,%mem,size

我找不到共享内存的选项,但我找到了总物理内存的%和交换进程所需的交换空间的选项。这些以及更多的内容在ps的man页面中都有记载。

8
Advertisement
8
8
2012-02-04 10:26:12 +0000
Advertisement

按内存使用情况列出进程

ps -e -orss=,args= | sort -b -k1,1n

7
7
7
2010-01-29 11:20:18 +0000

通过ps获取内存使用情况是非常不可靠的。如果你有一个新的内核,它应该支持/proc/pid#/smaps,它可以给你一些关于每个进程的内存使用情况的详细信息。下面是一个非常肮脏和快速的脚本,它可以循环浏览每个打开的进程,并抓取大小、Rss、Pss和共享的清洁/肮脏使用情况。希望它能在某种程度上有用。

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [-f /proc/$pid/smaps]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done
4
Advertisement
4
4
2010-01-29 04:20:47 +0000
Advertisement

你可以使用

top -n 1
```。
3
3
3
2016-09-23 15:51:44 +0000

更新:

下面的单行本也提供了当前用户的总内存消耗信息。

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

我刚刚把所有用户进程按最高内存使用量(MB)排序,像这样列出。

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

你可以用command=代替comm=来显示完整的路径进程。

=只是删除了列标题。

3
Advertisement
3
3
2017-04-04 12:27:34 +0000
Advertisement

我发现很多时候同一个进程会有fork子进程,而你对这个进程使用的总内存很感兴趣。例如,google chrome启动了多个进程,你想知道chrome占用的总内存。我发现下面一行命令非常有用

echo "%CPU %MEM MEM PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

它可以处理很多事情,比如以MB为单位显示内存,对内存进行排序,主要是通过命令进行分组。它还对%CPU和%memory进行了分组。它以用户友好的格式显示数据。

这个命令的灵感来自于这个的回答,它帮助我了解了哪些进程占用了我的资源。

3
3
3
2014-12-05 07:40:22 +0000

按内存使用情况列出进程

命令: ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS\

Advertisement

相关问题

6
10
5
37
7
Advertisement