Linux'ta kullanıcı başına bellek kullanımı?


20

Diyelim ki linux kutumda 20 kullanıcı var. Her birinin ne kadar bellek kullandığını nasıl bilebilirim?

Yanıtlar:


19

Smem kullanmayı deneyebilirsiniz ( daha fazla bilgi için bkz. ELC2009: Bellek kullanımını smem ile görselleştirme ). Özellikle, sudo smem -usize istediğiniz bilgileri vermelisiniz.


1
Bunun muhtemelen en iyi yol olduğunu kabul ediyorum. Bununla birlikte, smem , yerleşik kurumsal dağıtımların hiçbirinin sunmadığı gerçekten modern bir çekirdeğe ihtiyaç duyar . Fedora, OpenSUSE veya LTS olmayan bir Ubuntu gibi bir topluluk dağıtımı yapmadığınız sürece, şansınız kalmaz.
09:29

Bu harika. Çok teşekkürler. Kokuyu bilmiyordum. İşi yapacak gibi görünüyor.
Jakub Troszok

4
FYI, smem bir çekirdek gerektirir> = 2.6.27
xebeche

smem ayrıca burada bir seçenek değil, gtk gibi bir sürü şey gerektirir.
anarcat

@anarcat: Doğru değil (en azından Debian jessie için). Tek bağımlılık python, python-matplotlib sadece atlayabileceğiniz önerilen bir pakettir --no-install-recommends.
Léo Lam

9

Paylaşılan bellek sorunlarını göz ardı ederek, oturum açmış tüm kullanıcılar için vmem'e göre sıralanmış ve sevimli sütunlar halinde düzenlenmiş RSS ve VMEM sağlayan hızlı bir komut dosyası:

(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

Ne yazık ki 'paylaşılan bellek sorunlarını görmezden gelmek' bu komut dosyası da tam bir sahte çıktı.
fgysin Monica

sahte? sahte ne? çıktı sahte tam olarak nasıl?
anarcat

o / p rss ve vmem'de, rss & vmem nedir?
vidur punj

5

RSS toplamını almak için aşağıdaki çalışmaları düşünüyorum. Bu kbrandt ve root kullanıcıları için RSS toplamı almak olacaktır.

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


3

Bu zor bir soru. Kolayca "ps" çıktısında toplam RSS + takas miktarlarını özetleyebilir, ama paylaşılan bellek? Farklı kullanıcılar, aynı işlemi yürütüyorlarsa aynı kod sayfasını kolayca paylaşabilirler. Bunu kime açıklıyorsun? Tamponlar ve önbellek ne olacak? Bu gerçekten sonuçlarınızın ne kadar doğru olmasını istediğinize bağlıdır. Ne kadar doğru isterseniz, o kadar zor olacaktır.


Sanırım doğru PS'niz cevap ama muhtemelen paylaşılan hafızayı görmezden gelmeniz gerekiyor.
Jason Tan

smem (cevabımda bahsedildi) PSS ve USS ölçümleriyle paylaşılan hafıza problemini çözer (PSS, paylaşılan hafızayı paylaşan işlemler arasında orantılı olarak dağıtır).
CesarB

2

Bellek kullanımını kullanıcıya göre nasıl bildireceğinizden emin değilim ancak kullanımlarını kontrol etmekle ilgileniyorsanız ulimit'e bakmalısınız. Sisteminizdeki bellek ve diğer kaynaklar için kullanıcı başına / grup bazında sert ve yumuşak sınırlar belirlemenize olanak tanır.


2

Şöyle bir şey deneyebilirsiniz:

ps auxU maxwell | awk '{bellek + = 4 $}; END {baskı belleği} '


Teşekkürler! Mevcut kullanıcı için bu örneğin ps -o kullanıcısı ile de yapılabilir, rss --no-headers | awk '{mem + = 2 $}; END {print mem} '
xebeche

Bunu biraz ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'değiştirdim, burada mysql bir kullanıcı veya işlemin adıyla değiştirilebilir.
jeshurun

2

Aynı şeyi arıyorum, bunu anladım

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

mem tarafından sipariş edilen, kullanıcı tarafından gruplandırılmış (sütun1, $ 1) işlemleri yazdırmak için, diğer şeylere göre gruplayabilir ve 1 $ ve 4 $ değiştirerek diğer şeyleri toplayabilirsiniz

  • İlk sütun $ 1: kullanıcı adı (buna göre gruplar)
  • $ 4 dördüncü sütundur:% mem (bunu toplar)

Çözümü bulduğum için mutluydum, sadece paylaşmak istedim.


1
Teşekkürler! Birkaç değişiklik yapılmış ve bu kullanıyorum: ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2. Sort komutunun -n, belleği bir sayı olarak ayrıştırması için bayrağa ihtiyacı vardır . Ayrıca bu şekilde uygulama adına göre gruplandırmak için "kullanıcı" kelimesini "komut" ile değiştirebilirsiniz.
Tim

Aslında, yukarıdaki yorumumda awk'den almak için yukarıdaki yorumumda $ 2F yerine $ NF olmalıdır ($ 2, içinde boşluk olan komutlarla çalışmaz). Açıklamayı artık düzenleyemiyorum.
Tim

2

Bu bash senaryosu muhtemelen cehennem kadar çirkin, ama egzersiz için teşekkür ederim, bash'ım paslandı!

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

Sonuç:

[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

Lütfen yorum / düzeltme yapın ve cevabı güncelleyeceğim. Ayrıca PS rss bellek çıkışı kullanın, diğerleri tartışıldığı gibi bu değeri kullanmak için artıları / eksileri vardır.


Küçük bir sorunu var - ps çıkışında son kullanıcı için "$ ou: $ tempsum için toplam mem yazdırma" yazdırmaz. Döngü son programı bir kullanıcı tarafından kullanılan miktara ekler ve sonra kapanır.
Jakub Troszok

Vay. Senaryonuz daha yararlı oldu !!!! Hayal bile edemezsiniz! Çok fazla değilse bir şey isteyebilir miyim? Toplam cpu kullanımını da gösterebilir misiniz? Ve belki de 100mb'den fazla ise bellek kullanımını göstermek için yapılabilir?

1

smem sistemimde mevcut değildi ve Dave'in senaryosu bir nedenden dolayı çalışmadı, bu yüzden ps çıkışını işlemek için bu çirkin Perl oneliner'ı yazdım:

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

Bazı kullanıcıların kullanıcı adları yerine UID'leri kullanılarak tanımlandığını unutmayın. Uglier kullanarak / etc / passwd kullanıcı adlarını ayrıştırarak bununla başa çıkabilirsiniz:

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 Komut Dosyasını Kullanma

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

ÇIKTI

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

UID'leri /etc/passwdtüm kullanıcılar için bunu yapabilirsiniz.


0

Bu Linux çekirdeğinde, bellek görev gruplarını kullanarak bu görevi yerine getirmenin tek bir doğru yolunu düşünebilirim. Bir kullanıcının kendi oturum açma grubuna giriş yapması gerekir ve bunun için kendi pam modülü geliştirmesi veya (daha doğrusu) bunun için mevcut modülü değiştirmesi gerekebilir.

Bunu okumak için yararlı bir doküman: RedHat® tarafından sağlanan Kaynak Yönetimi Kılavuzu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.