在 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)
Jus*_*ith 11
ps ef -o command,vsize,rss,%mem,size
我找不到共享内存的选项,但我确实找到了总物理内存的 % 和换出进程所需的交换空间量的选项。这以及更多内容记录在 ps 的手册页中。
小智 9
按内存使用情况列出进程
ps -e -orss=,args= | 排序 -b -k1,1n
小智 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)
小智 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 和%内存进行分组。它以用户友好的格式显示数据。
这个命令的灵感来自这个答案,它帮助我了解哪个进程占用了我的资源。