Использование памяти для пользователя в Linux?

Предположим, что у меня есть 20 пользователей, которые вошли в мою linux-бокс. Как я могу узнать, сколько памяти использует каждый из них?

19 голосов | спросил Jakub Troszok 24 J0000006Europe/Moscow 2009, 18:07:52

12 ответов


19

Вы можете попробовать использовать smem (см. ELC2009: просмотр использования памяти с помощью smem для получения дополнительной информации). В частности, sudo smem -u должен предоставить вам необходимую информацию.

ответил CesarB 24 J0000006Europe/Moscow 2009, 18:55:57
8

Игнорирование проблем с общей памятью - вот быстрый сценарий, который дает вам 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
ответил jhclark 28 J0000006Europe/Moscow 2012, 17:34:36
5

Чтобы получить сумму RSS, я думаю, что работает следующее. Это должно было бы получить сумму RSS для пользователей kbrandt и root.

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc
ответил Kyle Brandt 24 J0000006Europe/Moscow 2009, 18:25:27
3

Это сложный вопрос. Вы можете легко суммировать общие суммы RSS + swap в выводе «ps», но как насчет общей памяти? Различные пользователи могут легко использовать одну и ту же страницу кода, если они работают с одним и тем же процессом. За кого вы это делаете? Что относительно буферов и кеш? Это зависит от того, насколько точны ваши результаты. Чем точнее вы хотите, тем сложнее будет.

ответил David Pashley 24 J0000006Europe/Moscow 2009, 18:13:19
2

Я не уверен, как сообщить об использовании памяти пользователем, но если вы беспокоитесь о контроле за их использованием, вам следует искать ulimit. Это позволит вам устанавливать жесткие и мягкие ограничения для каждого пользователя /группы для памяти и других ресурсов в вашей системе.

ответил 3dinfluence 24 J0000006Europe/Moscow 2009, 18:11:46
2

Вы можете попробовать что-то вроде:

ps auxU maxwell | awk '{memory + = $ 4}; END {print memory} '
ответил Maxwell 24 J0000006Europe/Moscow 2009, 18:55:54
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 (суммирует это)

Я был рад найти решение, просто хотел поделиться.

ответил jperelli 5 J0000006Europe/Moscow 2012, 02:17:05
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][[email protected]:~]$ ./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, так как другие обсуждали, что есть плюсы /минусы использования этого значения.

ответил Dave Drager 24 J0000006Europe/Moscow 2009, 19:40:55
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
ответил Jeff 29 12010vEurope/Moscow11bEurope/MoscowMon, 29 Nov 2010 18:31:25 +0300 2010, 18:31:25
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

OUTPUT

User      MemUsage(%)
apache    4.8
dbus      0.0
mysql     3.8
nagios    3.1
ответил Rahul Patil 29 PMpMon, 29 Apr 2013 15:59:25 +040059Monday 2013, 15:59:25
0
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

Вы можете получить UID из /etc/passwd, чтобы сделать это для всех пользователей

ответил Juri 15 J000000Wednesday15 2015, 05:29:55
0

Ну, в этом состоянии ядра Linux я могу придумать только один правильный путь для выполнения этой задачи - с использованием групп памяти. Вам нужно будет ввести пользователя в систему в собственную группу, и для этого может потребоваться разработка собственного модуля pam или (скорее) изменение существующего модуля для этого.

Полезный документ для чтения: Руководство по управлению ресурсами от RedHat®.

ответил poige 15 J000000Wednesday15 2015, 09:03:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132