내 리눅스 박스에 20 명의 사용자가 로그인했다고 가정 해 봅시다. 각 메모리가 얼마나 많은 메모리를 사용하고 있는지 어떻게 알 수 있습니까?
내 리눅스 박스에 20 명의 사용자가 로그인했다고 가정 해 봅시다. 각 메모리가 얼마나 많은 메모리를 사용하고 있는지 어떻게 알 수 있습니까?
답변:
smem을 사용해 볼 수 있습니다 (자세한 내용은 ELC2009 : smem 을 사용한 메모리 사용 시각화 참조 ). 특히, sudo smem -u
원하는 정보를 제공해야합니다.
--no-install-recommends
.
공유 메모리 문제를 무시하는 다음은 로그인 한 모든 사용자에게 RSS 및 VMEM을 제공하고 vmem별로 정렬하여 귀여운 열로 구성하는 빠른 스크립트입니다.
(echo "user rss(KiB) vmem(KiB)";
for user in $(users | tr ' ' '\n' | sort -u); do
echo $user $(ps -U $user --no-headers -o rss,vsz \
| awk '{rss+=$1; vmem+=$2} END{print rss" "vmem}')
done | sort -k3
) | column -t
RSS의 합계를 얻으려면 다음과 같이 작동한다고 생각합니다. 이것은 사용자 kbrandt와 root에 대한 RSS의 합계를 얻는 것입니다.
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
까다로운 질문입니다. "ps"출력의 총 RSS + 스왑 양을 쉽게 요약 할 수 있지만 공유 메모리는 어떻습니까? 동일한 프로세스를 실행하는 경우 다른 사용자가 동일한 코드 페이지를 쉽게 공유 할 수 있습니다. 누구에게 그것을 설명합니까? 버퍼와 캐시는 어떻습니까? 실제로 결과가 얼마나 정확한지에 달려 있습니다. 더 정확할수록 더 어려워집니다.
같은 것을 찾고, 나는 이것을 알아 냈습니다.
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
mem별로 정렬 된 프로세스를 사용자별로 그룹화하여 (column1, $ 1) 다른 항목별로 그룹화하고 다른 항목을 합산하여 $ 1 및 $ 4를 변경
나는 해결책을 찾아서 기꺼이 공유하고 싶었습니다.
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
. sort 명령 -n
에는 메모리를 숫자로 구문 분석하기위한 플래그가 필요합니다 . 또한이 방법으로 "user"라는 단어를 "command"로 바꾸어 대신 응용 프로그램 이름별로 그룹화 할 수 있습니다.
이 bash 스크립트는 아마도 못 생겼을 것입니다.하지만 운동에 감사드립니다. 내 bash는 녹슬 었습니다!
#!/bin/sh
OLDIFS=$IFS
IFS=$'\n'
tempsum=0
totalmem=0
for m in `ps -eo user,rss --sort user | sed -e 's/ */ /g' | awk -F'[ ]' {'print $0'}`; do
nu=`echo $m|cut -d" " -f1`
nm=`echo $m|cut -d" " -f2`
# echo "$nu $nm $nu"
if [ "$nu" != "$ou" ] && [ $(echo "$nm"|grep -E "^[0-9]+$") ]
then
if [ "$tempsum" -ne 0 ]; then echo "Printing total mem for $ou: $tempsum"; fi
ou=$nu
tempsum=$nm
let "totalmem += $nm"
else
let "tempsum += $nm"
let "totalmem += $nm"
fi
done
echo "Total Memory in Use: $totalmem/$(free | grep Mem: | awk '{print $2}')"
IFS=$OLDIFS
결과:
[20:34][root@server2:~]$ ./memorybyuser.sh
Printing total mem for admin: 1387288
Printing total mem for apache: 227792
Printing total mem for avahi: 1788
Printing total mem for dbus: 980
Printing total mem for 68: 3892
Printing total mem for root: 55880
Printing total mem for rpc: 292
Printing total mem for rpcuser: 740
Printing total mem for smmsp: 720
Printing total mem for xfs: 680
Total Memory in Use: 1682360/4152144
의견 / 수정하십시오. 답변을 업데이트하겠습니다. 또한 PS의 rss 메모리 출력을 사용합니다. 다른 사람들 이이 값을 사용하는 장단점이 있다고 논의했습니다.
smem을 내 시스템에서 사용할 수 없었고 Dave의 스크립트가 어떤 이유로 작동하지 않았으므로 ps 출력을 처리하기 위해이 추한 Perl oneliner를 작성했습니다.
ps -eo user,rss | perl -e 'foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys %mem) { if ($mem{$u}) { print "$u - $mem{$u}\n" }}' | sort
일부 사용자는 사용자 이름이 아닌 UID를 사용하여 식별되었습니다. 못생긴 것을 사용하여 / etc / passwd에서 사용자 이름을 구문 분석하여이를 처리 할 수 있습니다.
ps -eo user,rss | perl -e 'open(F, "/etc/passwd"); foreach $l (<F>) { if ($l=~/(.*?):.*?:(\d+)/) { $users{$2}=$1; }}; foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys (%mem)) { $UN = $u; if ($UN=~/^\d+$/) { $UN = $users{$UN};}; if ($mem{$u}) { print "$UN - $mem{$u}\n" }}' | sort
배쉬 스크립트 사용하기
#!/bin/bash
total_mem=0
printf "%-10s%-10s\n" User MemUsage'(%)'
while read u m
do
[[ $old_user != $u ]] && { printf "%-10s%-0.1f\n" $old_user $total_mem;
total_mem=0; }
total_mem="$(echo $m + $total_mem | bc)"
old_user=$u
done < <(ps --no-headers -eo user,%mem| sort -k1)
#EOF
산출
User MemUsage(%)
apache 4.8
dbus 0.0
mysql 3.8
nagios 3.1