Скажімо, я маю 20 користувачів, які увійшли до моєї скриньки linux. Як я можу знати, скільки пам'яті використовує кожен з них?
Скажімо, я маю 20 користувачів, які увійшли до моєї скриньки linux. Як я можу знати, скільки пам'яті використовує кожен з них?
Відповіді:
Ви можете спробувати використовувати smem ( для отримання додаткової інформації див. ELC2009: Візуалізація використання пам'яті за допомогою smem ). Зокрема, sudo smem -u
слід надати вам потрібну інформацію.
--no-install-recommends
.
Ігноруючи проблеми спільної пам’яті, ось швидкий сценарій, який дає вам 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
Щоб отримати суму RSS, я думаю, наступні роботи. Це було б для отримання суми RSS для користувачів kbrandt та root.
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
Це складне питання. Ви можете легко підсумувати загальну кількість RSS + своп у виводі "ps", а як щодо спільної пам'яті? Різні користувачі можуть легко ділитися однією і тією ж кодовою сторінкою, якщо вони виконують один і той же процес. Кому ви це враховуєте? Що з буферами та кешем? Це дійсно залежить від того, наскільки точними ви хочете, щоб були ваші результати. Чим точніше ви хочете, тим важче буде.
Ви можете спробувати щось на кшталт:
ps auxU maxwell | awk '{пам'ять + = $ 4}; END {пам'ять друку} '
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
, де mysql можна було б замінити на ім’я користувача або процес.
Шукаючи те саме, я зрозумів це
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
для друку процесів, упорядкованих mem, згруповано за користувачем (колонка1, $ 1), ви можете згрупувати інші речі та підсумовувати інші речі, змінюючи $ 1 і $ 4
Я із задоволенням знайшов рішення, просто хотів поділитися.
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
. Команді сортування потрібен -n
прапор, щоб він розібрав пам'ять як число. Також таким чином ви можете замінити слово "користувач" на "команда" для групування за назвою програми.
Цей баш сценарій, мабуть, некрасивий, як пекло, але дякую за вправу, мій баш був (стає) іржавим!
#!/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
Будь ласка, прокоментуйте / виправте, і я оновлю відповідь. Також я використовую вихідну пам'ять rss з PS, оскільки інші обговорювали, є плюси та мінуси використання цього значення.
smem не був доступний у моїй системі, і сценарій Дейва чомусь не працював, тому я написав цей потворний Perl oneliner для обробки виводу ps:
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
Використання сценарію 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
Що ж, у такому стані ядра Linux я можу придумати лише один належний спосіб виконання цього завдання - використання груп пам'яті. Вам потрібно буде ввійти користувача у свою власну групу, і для цього може знадобитися власна розробка модуля пам’яті або (вірніше) модифікація існуючого модуля для цього.
Корисним документом для читання про це є: Посібник з управління ресурсами RedHat®.