Answers:
通过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
ps ef -o command,vsize,rss,%mem,size
我找不到共享内存的选项,但确实找到了占总物理内存百分比和交换该进程所需的交换空间数量的选项。ps的手册页中对此进行了记录。
top,ps以及类似的程序都以相同的方式受此影响。
@ 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
按内存使用情况列出进程
命令:ps -e -orss =,args = | 排序-b -k1,1n | pr -TW $ COLUMNS \
更新:
以下单行代码还提供了有关当前用户消耗的总内存的信息。
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子进程,并且您对该进程使用的总内存感兴趣。例如,谷歌浏览器启动了多个进程,您希望了解浏览器占用的总内存。我发现以下一行命令非常有用
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分组。它以用户友好的格式显示数据。
这个命令是从这个答案中得到启发的,它帮助我弄清楚了哪个进程占用了我的资源。