如果我做'ps -ef',如何显示每个进程的内存使用情况?
在Linux中,如果我做了ps -ef
,怎样才能显示每个进程的内存使用情况?我想看到每个进程的 “虚拟内存"、"res内存"、"共享内存"。我可以通过top
得到这些信息,但我希望在ps -ef
中得到同样的信息,这样我就可以用进程名称将输出结果管到grep
。
在Linux中,如果我做了ps -ef
,怎样才能显示每个进程的内存使用情况?我想看到每个进程的 “虚拟内存"、"res内存"、"共享内存"。我可以通过top
得到这些信息,但我希望在ps -ef
中得到同样的信息,这样我就可以用进程名称将输出结果管到grep
。
@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
ps ef -o command,vsize,rss,%mem,size
我找不到共享内存的选项,但我找到了总物理内存的%和交换进程所需的交换空间的选项。这些以及更多的内容在ps的man页面中都有记载。
通过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
更新:
下面的单行本也提供了当前用户的总内存消耗信息。
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=
来显示完整的路径进程。
=
只是删除了列标题。
我发现很多时候同一个进程会有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进行了分组。它以用户友好的格式显示数据。
这个命令的灵感来自于这个的回答,它帮助我了解了哪些进程占用了我的资源。