Linuxのユーザーごとのメモリ使用量は?


20

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

回答:


19

smemの使用を試すことができます(詳細については、ELC2009:smemによるメモリ使用量の視覚化を参照してください)。特に、sudo smem -u必要な情報を提供する必要があります。


1
これはおそらくこれが最善の方法だと思います。しかし、SMEMは必要本当に確立し、企業のディストリビューションのいずれも提供しない近代的なカーネルを、。したがって、Fedora、OpenSUSE、または非LTS Ubuntuなどのコミュニティディストリビューションを実行しているのでなければ、運が悪い。
wzzrd 2009年

これは素晴らしい。どうもありがとう。私はスメムについて知りませんでした。それは仕事をするようです。
ヤクブトロソク09年

4
参考までに、smemには2.6.27以上のカーネルが必要です
-xebeche

smemには、オプションではなくgtkのようなものも必要です。
anarcat 14年

@anarcat:正しくありません(少なくともDebian jessieの場合)。唯一の依存関係はpythonです。python-matplotlibは、でスキップできる推奨パッケージです--no-install-recommends
レオラム

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

さて、悲しいことに「共有メモリの問題を無視する」このスクリプトは完全な偽物も出力します。
フジシンはモニカを14年

偽物?にせ何?出力は正確にどのように偽物ですか?
アナルキャット

o / pはrssとvmemにありますが、rssとvmemとは何ですか?
vidur punj


3

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


正しいPSが答えだと思いますが、おそらく共有メモリを無視する必要があります。
ジェイソンタン

smem(私の回答で述べました)は、PSSとUSSの測定で共有メモリの問題を解決します(PSSは共有メモリを共有するプロセス間で共有メモリを比例配分します)。
CesarB 2009年

2

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


2

次のようなものを試すことができます:

ps auxU maxwell | awk '{メモリ+ = $ 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

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

  • $ 1は最初の列です:ユーザー名(これでグループ化)
  • $ 4は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、メモリを数値として解析するためのフラグが必要です。また、この方法では、「ユーザー」という単語を「コマンド」に置き換えて、代わりにアプリケーション名でグループ化できます。
ティム

実際、awkから最後の列を取得するには、上記のコメントで$ 2ではなく$ NFにする必要があります($ 2はスペースを含むコマンドでは機能しないため)。これ以上コメントを編集できないようです。
ティム

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の合計メモリの印刷:$ tempsum」を印刷しません。このループは、ユーザーが使用した量に最後のプログラムを追加するだけで終了します。
ヤクブトロゾク09年

ワオ。あなたのスクリプトは有用以上のものでした!!!! 想像できません!それが多すぎない場合でも、何かをお願いできますか?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

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
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

/etc/passwdすべてのユーザーに対してこれを行うためのUIDを取得できます


0

さて、Linuxカーネルのこの状態では、このタスクを達成する適切な方法は1つしかありません。それは、メモリcgroupを使用することです。ログインしているユーザーを独自のcgroupに配置する必要があります。これには、独自のpamモジュールの開発、またはそのための既存のモジュールの変更が必要になる場合があります。

これを読むのに役立つドキュメントは、RedHat®のリソース管理ガイドです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.