如果执行“ ps -ef”,如何显示每个进程的内存使用情况?


24

在Linux中,如果执行a,如何显示每个进程的内存使用情况ps -ef?我希望看到每个进度的“虚拟内存”,“ res内存”,“共享内存”。我可以通过获得该信息top,但我希望输入相同的信息,ps -ef以便可以grep使用我的进程名称将输出传递给。

Answers:


8

通过ps获取内存使用情况非常不可靠。如果您有较新的内核,它应该支持/ proc / pid#/ smaps,它为您提供了有关每个进程内存使用情况的一些详细信息。以下是一个非常肮脏又快速的脚本,它可以循环浏览每个打开的进程,并掌握Size,Rss,Pss和Shared Clean / Dirty用法。希望它可以以某种方式有用。

#!/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

1
您应该对“大小”列求和。请参阅下面的ezsmith的答案。
罗勒

11

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

我找不到共享内存的选项,但确实找到了占总物理内存百分比和交换该进程所需的交换空间数量的选项。ps的手册页中对此进行了记录。


Linux在每个进程的内存中都占共享内存,如果您将多个进程附加到一个较大的共享内存段,则可能导致虚假的总和。 topps以及类似的程序都以相同的方式受此影响。
Peter Eisentraut 2010年

我知道共享内存的工作原理,但ps似乎无法提供该信息(或者至少在ps文档中找不到该信息)。top或htop实际上可以显示每个进程的共享内存使用情况。
贾斯汀·史密斯

9

@ user26528的答案不能完全正确地计算内存-您需要smap中映射的总和,而不仅仅是顶部的。该脚本应执行以下操作:

#!/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

输出:第16行:+:语法错误:预期的操作数(错误令牌为“ +”),该行包含:echo“ Private $((($ pd + $ pc))kB”,我在CentOS 7上运行。
罗勒一个

2
@evsmith为什么将Pss加0.5?
皮特

1
运行10,000个小的Awk脚本是一个庞大的反模式,您应该将所有这些重构到一个Awk脚本中。
三人房

但是此脚本本身消耗了太多内存
mehmet riza oz

8

按内存使用情况列出进程

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


使用ps -e -orss=,pid=,args= | sort -b -k1,1n包括进程ID
雅各布

ps可以自行排序:ps -eo rss=,args= --sort +rss
phil294



3

更新:

以下单行代码还提供了有关当前用户消耗的总内存的信息。

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

我发现很多时候同一进程都有fork子进程,并且您对该进程使用的总内存感兴趣。例如,谷歌浏览器启动了多个进程,您希望了解浏览器占用的总内存。我发现以下一行命令非常有用

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和%meory分组。它以用户友好的格式显示数据。

这个命令是从这个答案中得到启发的,它帮助我弄清楚了哪个进程占用了我的资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.