Використання пам'яті на користувача в Linux?


20

Скажімо, я маю 20 користувачів, які увійшли до моєї скриньки linux. Як я можу знати, скільки пам'яті використовує кожен з них?

Відповіді:


19

Ви можете спробувати використовувати smem ( для отримання додаткової інформації див. ELC2009: Візуалізація використання пам'яті за допомогою smem ). Зокрема, sudo smem -uслід надати вам потрібну інформацію.


1
Я згоден, це, мабуть, найкращий шлях до цього. Однак smem потребує справді сучасного ядра, яке не доставляє жоден із встановлених корпоративних дистрибутивів. Тому, якщо ви не використовуєте дистрибутив спільноти, наприклад Fedora, OpenSUSE або Ubuntu, який не є LTS, вам не пощастить.
wzzrd

Це чудово. Дуже дякую. Я не знав про smem. Схоже, це зробить роботу.
Якуб Трошок

4
FYI, smem вимагає ядра> = 2.6.27
xebeche

smem також вимагає купу таких матеріалів, як gtk тут, а не варіант.
anarcat

@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

Ну, на жаль, "ігнорування проблем із спільною пам'яттю" цей сценарій також видає повну помилку.
fgysin відновила Моніку

фальшивий? фіктивний що? як саме фіктивний вихід?
anarcat

o / p - у rss та vmem, що таке rss & vmem?
vidur punj

5

Щоб отримати суму RSS, я думаю, наступні роботи. Це було б для отримання суми RSS для користувачів kbrandt та root.

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

Я повинен додати, що я вкрав стовпець додавання частини чисел з: pixelbeat.org/cmdline.html
Кайл Брандт

3

Це складне питання. Ви можете легко підсумувати загальну кількість RSS + своп у виводі "ps", а як щодо спільної пам'яті? Різні користувачі можуть легко ділитися однією і тією ж кодовою сторінкою, якщо вони виконують один і той же процес. Кому ви це враховуєте? Що з буферами та кешем? Це дійсно залежить від того, наскільки точними ви хочете, щоб були ваші результати. Чим точніше ви хочете, тим важче буде.


Я думаю, що ваш правильний PS - це відповідь, але вам, мабуть, потрібно ігнорувати спільну пам'ять.
Джейсон Тан

smem (згаданий у моїй відповіді) вирішує проблему спільної пам'яті своїми вимірюваннями PSS та USS (PSS пропорційно розподіляє спільну пам'ять між процесами, які її ділять).
CesarB

2

Я не знаю, як повідомити користувач про використання пам’яті, але якщо ви стурбовані контролем за їх використанням, то вам слід шукати недолік. Це дозволить вам встановити жорсткі та м'які обмеження для кожного користувача / групи для пам’яті та інших ресурсів у вашій системі.


2

Ви можете спробувати щось на кшталт:

ps auxU maxwell | awk '{пам'ять + = $ 4}; END {пам'ять друку} '


Спасибі! Для поточного користувача це також можна зробити, наприклад, з ps -o користувачем, 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

для друку процесів, упорядкованих mem, згруповано за користувачем (колонка1, $ 1), ви можете згрупувати інші речі та підсумовувати інші речі, змінюючи $ 1 і $ 4

  • $ 1 - це перший стовпець: ім'я користувача (групується за цим)
  • $ 4 - четвертий стовпець:% mem (підсумовує це)

Я із задоволенням знайшов рішення, просто хотів поділитися.


1
Спасибі! Я зробив кілька змін , і я використовую це: ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2. Команді сортування потрібен -nпрапор, щоб він розібрав пам'ять як число. Також таким чином ви можете замінити слово "користувач" на "команда" для групування за назвою програми.
Тім

Насправді це має бути $ NF замість $ 2 у моєму коментарі вище, щоб отримати останній стовпець від awk (так як $ 2 не працює з командами, які мають в них пробіли). Здається, я більше не можу редагувати коментар.
Тім

2

Цей баш сценарій, мабуть, некрасивий, як пекло, але дякую за вправу, мій баш був (стає) іржавим!

#!/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, оскільки інші обговорювали, є плюси та мінуси використання цього значення.


У нього є невелика проблема - він не надрукує "Друк загальної пам'яті за $ ou: $ tempsum" для останнього користувача у виході ps. Цикл просто додасть останню програму до кількості, яку користувач використовує, і тоді вона вийде.
Якуб Трошок

Ого. Ваш сценарій був більш ніж корисним !!!! Ви не уявляєте! Чи можу я щось попросити, якщо його не надто багато? Чи можете ви змусити його показувати також загальне використання процесора? І, можливо, може це зробити так, щоб показати використання пам'яті, якщо його більше 100 Мб?

1

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

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

Ви можете отримати UID, /etc/passwdщоб зробити це для всіх користувачів


0

Що ж, у такому стані ядра Linux я можу придумати лише один належний спосіб виконання цього завдання - використання груп пам'яті. Вам потрібно буде ввійти користувача у свою власну групу, і для цього може знадобитися власна розробка модуля пам’яті або (вірніше) модифікація існуючого модуля для цього.

Корисним документом для читання про це є: Посібник з управління ресурсами RedHat®.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.