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

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

在 Linux 中,如果我执行 ,如何显示每个进程的内存使用情况ps -ef?我想查看每个进程的“虚拟内存”、“可重新分配内存”和“共享内存”。我可以通过 获得这些信息top,但我想要相同的信息,以便我可以使用进程名称ps -ef将输出传送到。grep

答案1

通过 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

答案2

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

我找不到共享内存的选项,但我找到了占总物理内存的百分比以及交换进程所需的交换空间量的选项。ps 的手册页中记录了这些内容以及更多内容。

答案3

@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

答案4

我发现很多时候同一个进程会 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 进行分组。它以用户友好的格式显示数据。

此命令的灵​​感来自于答案并且它帮助我了解哪个过程正在占用我的资源。

相关内容