如何在linux中查找用户内存使用情况

如何我可以看到用户在Linux中的内存使用情况6

For example: USER USAGE root 40370 admin 247372 user2 30570 user3 967373 

使用标准工具的每用户内存使用率(百分比):

 for USER in $(ps haux | awk '{print $1}' | sort -u) do ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }' done 

或者为了更精确:

 TOTAL=$(free | awk '/Mem:/ { print $2 }') for USER in $(ps haux | awk '{print $1}' | sort -u) do ps hux -U $USER | awk -v user=$USER -v total=$TOTAL '{ sum += $6 } END { printf "%s %.2f\n", user, sum / total * 100; }' done 

第一个版本只是总结了ps所报告的每个进程的内存百分比。 第二个版本以字节为单位总结内存,然后计算总的百分比,从而导致更高的精度。

如果您的系统支持,请尝试安装并使用smem :

 smem -u User Count Swap USS PSS RSS gdm 1 0 308 323 820 nobody 1 0 912 932 2240 root 76 0 969016 1010829 1347768 

要么

 smem -u -t -k User Count Swap USS PSS RSS gdm 1 0 308.0K 323.0K 820.0K nobody 1 0 892.0K 912.0K 2.2M root 76 0 937.6M 978.5M 1.3G ameskaas 46 0 1.2G 1.2G 1.5G 

  124 0 2.1G 2.2G 2.8G 

在Ubuntu中,可以通过键入来安装smem

 sudo apt install smem 

这一行代码至少在四个不同的发行版和版本的Linux系统上为我工作。 它也在FreeBSD 10上工作。

 ps hax -o rss,user | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2 

关于这个实现,这里没有shell的循环结构。 这在awk使用关联数组来进行分组和求和。

以下是我的一台服务器运行体面大小的MySQL,Tomcat和Apache的示例输出。 数字以MB为单位。

 mysql 1566 joshua 1186 tomcat 353 root 28 wwwrun 12 vbox 1 messagebus 1 avahi 1 statd 0 nagios 0 

警告:与大多数类似的解决方案一样,这只考虑驻留集(RSS),因此它不会计算任何共享内存段。

编辑 :一个更可读的版本。

 echo "USER RSS PROCS" ; echo "-------------------- -------- -----" ; ps hax -o rss,user | awk '{rss[$2]+=$1;procs[$2]+=1;}END{for(user in rss) printf "%-20s %8.0f %5.0f\n", user, rss[user]/1024, procs[user];}' | sort -rnk2 

而输出:

 USER RSS PROCS -------------------- -------- ----- mysql 1521 1 joshua 1120 28 tomcat 379 1 root 19 107 wwwrun 10 10 vbox 1 3 statd 1 1 nagios 1 1 messagebus 1 1 avahi 1 1