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

hap*_*497 29 linux

在 Linux 中,如果我执行 a ,如何显示每个进程的内存使用情况ps -ef?我想看看每个进度的“虚拟内存”、“资源内存”、“共享内存”。我可以通过 获得它top,但我想要相同的信息,ps -ef以便我可以grep使用我的进程名称将输出传输到管道。

evs*_*ith 13

@ 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
Run Code Online (Sandbox Code Playgroud)

  • @evsmith 为什么要在 Pss 中添加 0.5? (2认同)

Jus*_*ith 11

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

我找不到共享内存的选项,但我确实找到了总物理内存的 % 和换出进程所需的交换空间量的选项。这以及更多内容记录在 ps 的手册页中。


小智 9

按内存使用情况列出进程

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

  • 使用`ps -e -orss=,pid=,args= | sort -b -k1,1n` 以包含进程 ID (2认同)

小智 8

通过 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
Run Code Online (Sandbox Code Playgroud)

  • 您应该对“大小”列求和。请参阅下面的 ezsmith 的回答。 (2认同)

小智 5

我发现很多时候同一个进程有 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
Run Code Online (Sandbox Code Playgroud)

它负责很多事情,例如以 MB 为单位显示内存、对内存进行排序以及主要按命令进行分组。它还对%CPU 和%内存进行分组。它以用户友好的格式显示数据。

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