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

QEMU для Windows или QEMU являются очень портативными, но медленными. Должен быть хорошо для упрощенной машины. После этого Чертовски Маленький Linux довольно хорош, или пользовательский хинду устанавливают (там какой-либо другой вид? :D).

20
задан 24 June 2009 в 17:07
12 ответов

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

19
ответ дан 2 December 2019 в 20:07
  • 1
    Я соглашаюсь, что это - вероятно, лучший способ к этому. Однако smem нужно действительно современное ядро, которое ни один из установленных дистрибутивов предприятия не поставляет. Таким образом, если Вы не выполняете общественный дистрибутив как Fedora, OpenSUSE или non-LTS Ubuntu, you' ре не повезло. –  wzzrd 24 June 2009 в 18:29
  • 2
    Здорово. Большое спасибо. Я didn' t знают о smem. Похоже, что это сделает задание. –  Jakub Troszok 25 June 2009 в 01:26
  • 3
    smem также требует набора материала как gtk здесь, не опции. –  anarcat 28 October 2014 в 21:18

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

ps -U kbrandt,root --no-headers  -o rss | (tr '\n' +; echo 0) | bc
5
ответ дан 2 December 2019 в 20:07

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

3
ответ дан 2 December 2019 в 20:07
  • 1
    Я думаю, что Ваша правильная PS является ответом, но, вероятно, необходимо проигнорировать общую память. –  Jason Tan 24 June 2009 в 17:26
  • 2
    smem (упомянутый в моем ответе) решает проблему с общей памятью со своим PSS, и измерения USS (PSS пропорционально распределяет общую память между процессами, которые совместно используют его). –  CesarB 24 June 2009 в 18:06

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

2
ответ дан 2 December 2019 в 20:07

Можно попробовать что-то как:

ps auxU maxwell | awk '{memory +=$4}; END {print memory }'
2
ответ дан 2 December 2019 в 20:07

Этот сценарий удара, вероятно, ужасен как черт, но спасибо за осуществление, мой удар был становится ржавым!

#!/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, как другие обсудили существуют профессионалы/недостатки к использованию этого значения.

2
ответ дан 2 December 2019 в 20:07
  • 1
    Это имеет небольшую проблему - это не распечатает " Печатающая общая мадам за $ou: $tempsum" поскольку последний пользователь в PS произвел. Цикл просто добавит последнюю программу к сумме, используемой пользователем, и затем это выйдет. –  Jakub Troszok 25 June 2009 в 01:25

smem не был доступен в моей системе, и сценарий Dave не работал по некоторым причинам, таким образом, я записал, что эта ужасная острота Perl для обработки 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
1
ответ дан 2 December 2019 в 20:07

В поисках того же, я понял это

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 (суммирует)

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

2
ответ дан 2 December 2019 в 20:07

Игнорируя проблемы с общей памятью, вот быстрый сценарий, который предоставляет вам 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
9
ответ дан 2 December 2019 в 20:07

Использование сценария 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
ответ дан 2 December 2019 в 20:07
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'

503 - UID

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

0
ответ дан 2 December 2019 в 20:07

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

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

0
ответ дан 2 December 2019 в 20:07

Теги

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