리눅스에서 사용자 당 메모리 사용량?


20

내 리눅스 박스에 20 명의 사용자가 로그인했다고 가정 해 봅시다. 각 메모리가 얼마나 많은 메모리를 사용하고 있는지 어떻게 알 수 있습니까?

답변:


19

smem을 사용해 볼 수 있습니다 (자세한 내용은 ELC2009 : smem사용한 메모리 사용 시각화 참조 ). 특히, sudo smem -u원하는 정보를 제공해야합니다.


1
나는 이것이 아마도 가장 좋은 방법이라는 데 동의합니다. 그러나 smem 에는 기존 엔터프라이즈 배포판 중 어느 것도 제공하지 않는 정말 현대적인 커널이 필요합니다 . 따라서 Fedora, OpenSUSE 또는 비 LTS 우분투와 같은 커뮤니티 배포판을 실행하지 않으면 운이 없습니다.
wzzrd 2016 년

대단하다. 고마워요 나는 smem에 대해 몰랐다. 그것은 일을 할 것 같습니다.
Jakub Troszok 2016 년

4
참고로, smem에는 커널> = 2.6.27이 필요합니다
xebeche

smem에는 옵션이 아닌 gtk와 같은 많은 것들이 필요합니다.
anarcat

@anarcat : 사실이 아닙니다 (적어도 Debian jessie의 경우). 유일한 의존성은 python이며, python-matplotlib는 건너 뛸 수있는 권장 패키지 일뿐입니다 --no-install-recommends.
Léo Lam

9

공유 메모리 문제를 무시하는 다음은 로그인 한 모든 사용자에게 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

슬프게도 '공유 메모리 문제 무시'는이 스크립트도 완전한 가짜를 출력합니다.
fgysin reinstate Monica

가짜? 가짜 무엇? 출력은 어떻게 가짜입니까?
anarcat

o / p는 rss와 vmem에 있습니다. rss & vmem은 무엇입니까?
vidur punj

5

RSS의 합계를 얻으려면 다음과 같이 작동한다고 생각합니다. 이것은 사용자 kbrandt와 root에 대한 RSS의 합계를 얻는 것입니다.

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc

: 나는에서 숫자 부분의 추가 열 훔친 것을 추가해야 pixelbeat.org/cmdline.html
카일 브랜

3

까다로운 질문입니다. "ps"출력의 총 RSS + 스왑 양을 쉽게 요약 할 수 있지만 공유 메모리는 어떻습니까? 동일한 프로세스를 실행하는 경우 다른 사용자가 동일한 코드 페이지를 쉽게 공유 할 수 있습니다. 누구에게 그것을 설명합니까? 버퍼와 캐시는 어떻습니까? 실제로 결과가 얼마나 정확한지에 달려 있습니다. 더 정확할수록 더 어려워집니다.


올바른 PS가 답이라고 생각하지만 공유 메모리를 무시해야 할 수도 있습니다.
Jason Tan

smem (내 대답에서 언급)은 PSS 및 USS 측정으로 공유 메모리 문제를 해결합니다 (PSS는 공유 메모리를 공유하는 프로세스간에 공유 메모리를 비례 적으로 분배합니다).
CesarB 2016 년

2

사용자별로 메모리 사용량을보고하는 방법을 잘 모르겠지만 사용량 제어에 관심이 있다면 ulimit를 찾아야합니다. 시스템의 메모리 및 기타 리소스에 대해 사용자 / 그룹별로 하드 및 소프트 제한을 설정할 수 있습니다.


2

다음과 같은 것을 시도해 볼 수 있습니다.

ps auxU maxwell | awk '{memory + = $ 4}; END {인쇄 메모리} '


감사! 현재 사용자의 경우 ps -o user, rss --no-headers | awk '{mem + = $ 2}; END {print mem} '
xebeche

나는 이것을 ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'mysql을 사용자 또는 프로세스의 이름으로 바꿀 수있는 것처럼 약간 편집했다 .
jeshurun

2

같은 것을 찾고, 나는 이것을 알아 냈습니다.

ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2

mem별로 정렬 된 프로세스를 사용자별로 그룹화하여 (column1, $ 1) 다른 항목별로 그룹화하고 다른 항목을 합산하여 $ 1 및 $ 4를 변경

  • $ 1은 첫 번째 열입니다 : 사용자 이름 (이에 따라 그룹화)
  • $ 4는 네 번째 열입니다 : % mem (이 요약)

나는 해결책을 찾아서 기꺼이 공유하고 싶었습니다.


1
감사! 나는 약간의 수정을했고 이것을 사용하고있다 : 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"로 바꾸어 대신 응용 프로그램 이름별로 그룹화 할 수 있습니다.
Tim

실제로 awk에서 마지막 열을 얻으려면 위의 설명에서 $ 2 대신 $ NF이어야합니다 ($ 2는 공백이있는 명령에서는 작동하지 않기 때문에). 댓글을 더 이상 편집 할 수 없습니다.
Tim

2

이 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 메모리 출력을 사용합니다. 다른 사람들 이이 값을 사용하는 장단점이 있다고 논의했습니다.


그것은 작은 문제가 있습니다-ps 출력에서 ​​마지막 사용자에 대한 "$ ou에 대한 총 mem 인쇄 : $ tempsum"을 인쇄하지 않습니다. 루프는 사용자가 사용한 양에 마지막 프로그램을 추가 한 다음 종료됩니다.
Jakub Troszok 2016 년

와. 당신의 스크립트는 도움이되었습니다 !!!! 당신은 상상할 수 없습니다! 너무 많지 않은 경우 뭔가를 요청할 수 있습니까? 총 CPU 사용량도 보여줄 수 있습니까? 그리고 아마도 100MB 이상이면 메모리 사용량을 보여줄 수 있습니까?

1

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

0

배쉬 스크립트 사용하기

#!/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

0
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

/etc/passwd모든 사용자에게 UID를 제공 할 수 있습니다.


0

글쎄,이 리눅스 커널 상태에서 나는 메모리 cgroup을 사용 하여이 작업을 수행하는 적절한 방법 중 하나만 생각할 수 있습니다 . 사용자를 로그인으로 자신의 cgroup에 넣어야하며,이를 위해서는 자체 pam 모듈 개발 또는 기존 모듈 수정이 필요할 수 있습니다.

이에 대한 유용한 문서는 RedHat®의 자원 관리 안내서 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.