답변:
ps를 통해 메모리 사용을 얻는 것은 신뢰할 수 없습니다. 최신 커널을 사용하는 경우 각 프로세스 메모리 사용량에 대한 자세한 정보를 제공하는 / proc / pid # / smaps를 지원해야합니다. 아래는 열려있는 각 프로세스를 반복하고 크기, 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 man 페이지에 문서화되어 있습니다.
top, ps및 유사한 프로그램은 모두 동일한 방식으로 영향을받습니다.
@ user26528의 대답은 메모리를 올바르게 계산하지 못합니다. 상단의 맵뿐만 아니라 스맵의 매핑 합계가 필요합니다. 이 스크립트는 다음을 수행해야합니다.
#!/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
최신 정보:
다음 원 라이너는 현재 사용자의 총 메모리 소비에 대한 정보도 제공합니다.
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=.
은 =단지 열 제목을 제거합니다.
동일한 프로세스에 포크 하위 프로세스가 여러 번 있으며 프로세스에서 사용하는 총 메모리에 관심이 있다는 것을 알았습니다. 예를 들어 Google 크롬은 여러 프로세스를 시작하며 크롬이 차지한 총 메모리를 알고 싶습니다. 아래 한 줄 명령이 매우 유용하다는 것을 알았습니다.
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를 그룹화합니다. 사용자 친화적 인 형식으로 데이터를 표시합니다.
이 명령은 이 답변 에서 영감을 얻어 어떤 프로세스가 내 리소스를 차지하는 지에 대한 아이디어를 얻는 데 많은 도움이되었습니다.