【问题标题】:How to find user memory usage in linux如何在linux中查看用户内存使用情况
【发布时间】:2012-12-22 06:23:34
【问题描述】:

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

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

【问题讨论】:

    标签: linux centos centos6


    【解决方案1】:

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

    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 报告的每个进程的内存百分比。第二个版本改为以字节为单位汇总内存,然后计算总百分比,从而导致更高的精度。

    【讨论】:

    • 它工作但不正常。我的内存使用量已满 (99%),但您的命令结果总和显示不到 15%
    • 你的 99% 是从哪里得到的?
    • 我正在使用free 命令,它显示total:2047372 used:2014592
    • 您将free 的输出解释错了,请阅读similar questions 的答案(关键字:缓冲区/缓存)。我的答案的输出是正确的。
    • 逻辑不错,但我在 SUSE 13.2 上的ps 使用长用户名做了一些奇怪的事情,例如“garfieldthecat”会显示为“garfiel+”,然后求和就不起作用了。另请注意,$USER 是大多数 shell 中当前用户的内置变量。
    【解决方案2】:

    这将返回用户的总内存使用量,以 GB 为单位,反向排序

    sudo ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]/1024/1024}}' | sort -nk2 -r
    

    【讨论】:

      【解决方案3】:

      您可以使用以下 Python 脚本仅使用 sys 和 os 模块来查找每个用户的内存使用情况。

      import sys
      import os
      
      # Get list of all users present in the system
      allUsers = os.popen('cut -d: -f1 /etc/passwd').read().split('\n')[:-1]
      
      for users in allUsers:
          # Check if the home directory exists for the user
          if os.path.exists('/home/' + str(users)):
              # Print the current usage of the user
              print(os.system('du -sh /home/' + str(users)))
      

      【讨论】:

      • 我似乎将内存使用与存储使用混淆了。内存使用量指的是 RAM,而您提供的解决方案是指磁盘上使用的空间。
      【解决方案4】:

      如果你的系统支持,尝试安装使用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
      

      【讨论】:

        【解决方案5】:

        这个单行程序至少在四个不同发行版和版本的不同 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),因此不计算任何共享内存段。

        EDIT:更易读的版本。

        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
        

        【讨论】:

        • 为什么是“+0.5”?
        • @Daniel,awk 的int( ) 函数是一个楼层函数。添加 0.5 使其进行适当的舍入。因此,如果一个进程正在使用 3.9 MB,则 int(3.9) 将仅显示为 3。但 int(3.9+0.5) = 4。
        • 是否可以只选择使用特定命令(比如 R)运行的进程?
        • @utobi 试试ps --no-headers -o rss,user $(pidof R) | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2
        • @utobi,试试echo "USER RSS PROCS" ; echo "-------------------- -------- -----" ; pidof R | while read PID ; do ps --no-header -o rss,user -p $PID ; done | 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
        猜你喜欢
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2015-09-24
        • 2016-08-29
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多