web-dev-qa-db-ja.com

Linuxでのユーザーあたりのメモリ使用量?

Linuxボックスに20人のユーザーがログオンしているとしましょう。それぞれが使用しているメモリの量を知るにはどうすればよいですか?

20
Jakub Troszok

smem を使用してみてください(詳細については、 ELC2009:smemを使用したメモリ使用量の視覚化 を参照してください)。特に、 Sudo smem -uは、必要な情報を提供します。

19
CesarB

共有メモリの問題を無視して、ログインしたすべてのユーザーに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
9
jhclark

RSSの合計を取得するには、次のように機能すると思います。これは、ユーザーkbrandtとrootのRSSの合計を取得することになります。

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

同じことを探して、私はこれを理解しました

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

memで順序付けられたプロセスをユーザー(column1、$ 1)でグループ化して印刷するには、$ 1と$ 4を変更して、他のものでグループ化し、他のものを合計できます。

  • $ 1は最初の列です:ユーザー名(これでグループ化)
  • $ 4は4番目の列です:%mem(これを合計します)

解決策を見つけて嬉しかったです。共有したいと思っていました。

3
jperelli

それはトリッキーな質問です。 RSSとスワップの合計量を「ps」出力で簡単に合計できますが、共有メモリはどうでしょうか。異なるユーザーが同じプロセスを実行している場合、同じコードページを簡単に共有できます。それを誰に説明しますか?バッファとキャッシュはどうですか?実際の結果をどの程度正確にしたいかによります。より正確にしたいほど難しくなります。

3
David Pashley

ユーザーごとのメモリ使用量を報告する方法はわかりませんが、使用量の制御が心配な場合は、ulimitを調べてください。システム上のメモリおよびその他のリソースに対して、ユーザー/グループごとにハード制限とソフト制限を設定できます。

2
3dinfluence

あなたは次のようなことを試すかもしれません:

 ps auxU maxwell | awk '{memory + = $ 4}; END {印刷メモリ} '
2
Maxwell

この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メモリ出力を使用します。他の人がこの値を使用することには長所と短所があると説明しているからです。

2
Dave Drager

私のシステムではsmemが利用できず、何らかの理由でDaveのスクリプトが機能しなかったため、psの出力を処理するためにこの醜いPerlワンライナーを書きました。

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を使用して識別されていることに注意してください。 uglierを使用して、/ 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
1
Jeff
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

/etc/passwdからUIDを取得して、すべてのユーザーに対してこれを行うことができます

0
Juri

さて、このLinuxカーネルの状態では、メモリcgroupを使用して、このタスクを実行する適切な方法を1つだけ考えることができます。ユーザーをログオン時に自分のcgroupに配置する必要があります。これには、独自のPAMモジュールの開発または(むしろ)そのための既存のモジュールの変更が必要になる場合があります。

これを読むのに役立つドキュメントは次のとおりです。 Resource Management Guide byRedHat®。

0
poige

Bashスクリプトの使用

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