Diyelim ki linux kutumda 20 kullanıcı var. Her birinin ne kadar bellek kullandığını nasıl bilebilirim?
Diyelim ki linux kutumda 20 kullanıcı var. Her birinin ne kadar bellek kullandığını nasıl bilebilirim?
Yanıtlar:
Smem kullanmayı deneyebilirsiniz ( daha fazla bilgi için bkz. ELC2009: Bellek kullanımını smem ile görselleştirme ). Özellikle, sudo smem -u
size istediğiniz bilgileri vermelisiniz.
--no-install-recommends
.
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
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
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.
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.
Şöyle bir şey deneyebilirsiniz:
ps auxU maxwell | awk '{bellek + = 4 $}; END {baskı belleği} '
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.
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
Çözümü bulduğum için mutluydum, sadece paylaşmak istedim.
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.
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.
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
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
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 .