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

Ham*_*eza 25 linux centos centos6

我如何在linux centos 6中看到用户的内存使用情况

For example:
    USER    USAGE
    root    40370
    admin   247372
    user2   30570
    user3   967373
Run Code Online (Sandbox Code Playgroud)

Jos*_*ber 28

这个单行程序在我的至少四个不同发行版和版本的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
Run Code Online (Sandbox Code Playgroud)

关于实现,这里没有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
Run Code Online (Sandbox Code Playgroud)

警告:像大多数类似的解决方案一样,这只考虑驻留集(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
Run Code Online (Sandbox Code Playgroud)

并输出:

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
Run Code Online (Sandbox Code Playgroud)

  • @ Daniel,awk的`int()`函数是一个下限函数。加0.5使其进行适当的舍入。因此,如果一个进程使用3.9 MB,则int(3.9)仅显示为3。但是int(3.9 + 0.5)= 4。 (2认同)

sca*_*cai 27

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

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
Run Code Online (Sandbox Code Playgroud)

或者更精确:

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
Run Code Online (Sandbox Code Playgroud)

第一个版本只是总结了报告的每个进程的内存百分比ps.第二个版本以字节为单位对内存进行求和,然后计算总百分比,从而提高精度.

  • 很好的逻辑,但我在SUSE 13.2上的`ps`做了很长的用户名,例如"garfieldthecat"会显示为"garfiel +",然后求和就行不通了.还要注意`$ USER`是大多数shell中当前用户的内置变量. (2认同)

h22*_*h22 15

如果您的系统支持,请尝试安装并使用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 
Run Code Online (Sandbox Code Playgroud)

要么

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 
Run Code Online (Sandbox Code Playgroud)
           124        0     2.1G     2.2G     2.8G 
Run Code Online (Sandbox Code Playgroud)

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

sudo apt install smem
Run Code Online (Sandbox Code Playgroud)