捕获每个PID的命令并计算GIGA中命令的内存消耗(以排序方式)

捕获每个PID的命令并计算GIGA中命令的内存消耗(以排序方式)

我运行这种方法是为了验证在linux redhat机器上从高到低消耗内存的命令

我将此方法写为 1024/1024 ,以便获取 GIGA 中的值

ps -eo size,pid,user,command --sort -size |
awk '{ hr=$1/1024/1024 ; printf("%13.2f GIGA ",hr) }
     { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |
cut -d "" -f2 | cut -d "-" -f1 | more

        58.13 GIGA java
        38.39 GIGA /home/mc/lok_agent/mc.pl
        36.00 GIGA /usr/lib/jvm/java
        23.99 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        19.42 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        19.39 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        19.37 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        17.42 GIGA java
        15.43 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        15.42 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        15.23 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
        10.18 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
         7.22 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
         7.02 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
         5.71 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
         5.57 GIGA /usr/bin/gnome
.
.
.

到目前为止,以上命令的总和已超过 200G

但是当我运行 free -g 时我习惯了 168

free -g
              total        used        free      shared  buff/cache   available
Mem:            251         168           2           0          81          82
Swap:            15          11           4

所以我的方法有些不对

ps -eo size,pid,user,command --sort -size |     awk '{ hr=$1/1024/1024 ; printf("%13.2f GIGA ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |    cut -d "" -f2 | cut -d "-" -f1 |more

有什么建议我的语法有什么问题吗?

答案1

有多种方法可以测量进程中使用的内存。问题是进程共享内存(想象两个进程使用同一个共享库,它一次在内存中),并且您可以驻留(在 RAM 芯片上)、交换(在磁盘上)或虚拟(两者之一/两者)。

使用 rss 而不是 size 将消除交换/虚拟问题,但不会消除共享问题。

(可能)下一个版本的 procps 将具有 ps 和 top,使 PSS 和 USS 字段可用,以实现比例/唯一的段大小。它们要么分配(例如,使用共享库的 3 个进程获得该库大小的 1/3),要么忽略共享部分。

相关内容