比方说,我有20个用户login我的Linux机器。 我怎么知道他们每个人使用了多less内存?
您可以尝试使用smem (请参阅ELC2009:使用smem 可视化内存以获取更多信息)。 特别是, sudo smem -u
应该给你你想要的信息。
忽略共享内存问题,下面是一个快速脚本,它为您提供所有login用户的RSS和VMEM(按vmemsorting),并组织成可爱的列:
(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的总和,我想下面的工作。 这将获得用户kbrandt和root的RSS的总和。
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
这是一个棘手的问题。 你可以简单地总结一下“ps”输出中的RSS +交换总量,但共享内存呢? 不同的用户如果运行相同的过程,可以轻松地共享相同的代码页。 你认为谁是谁? 缓冲区和caching怎么样? 这真的取决于你想要结果的准确程度。 你想要的越准确,越难。
我不知道如何报告用户的内存使用情况,但如果你担心控制他们的使用,那么你应该查找ulimit。 它将允许您为每个用户/组设置硬盘和软盘的限制,以适应系统上的内存和其他资源。
你可以尝试类似于:
ps auxU maxwell | awk'{memory + = $ 4}; END {打印记忆}'
寻找相同的,我想出了这一点
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
打印由memsorting的进程,按用户(column1,$ 1)分组,可以按其他方式进行分组,并对其他内容进行分组,将$ 1和$ 4更改
我很高兴find解决scheme,只是想分享。
这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][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
请评论/正确,我会更新答案。 另外我使用PS的rss内存输出,正如其他人所讨论的那样,使用这个值有利/弊。
smem在我的系统上是不可用的,Dave的脚本由于某种原因没有工作,所以我写了这个丑陋的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而不是用户名来识别的。 你可以使用uglier来parsing/ 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 um 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
pmap `pgrep -u 503` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}' 503 - UID
您可以从/etc/passwd
获取UID,以便为所有用户执行此操作
那么,在这种Linux内核的状态下,我只能想到一个合适的方法来完成这个任务 – 使用内存cgroups。 你需要把一个用户login到自己的cgroup中,这可能需要自己的pam模块开发或(而不是)修改现有的模块。
有用的文档阅读这是:由RedHat® 资源pipe理指南 。