![捕获每个PID的命令并计算GIGA中命令的内存消耗(以排序方式)](https://linux22.com/image/193808/%E6%8D%95%E8%8E%B7%E6%AF%8F%E4%B8%AAPID%E7%9A%84%E5%91%BD%E4%BB%A4%E5%B9%B6%E8%AE%A1%E7%AE%97GIGA%E4%B8%AD%E5%91%BD%E4%BB%A4%E7%9A%84%E5%86%85%E5%AD%98%E6%B6%88%E8%80%97%EF%BC%88%E4%BB%A5%E6%8E%92%E5%BA%8F%E6%96%B9%E5%BC%8F%EF%BC%89.png)
我运行这种方法是为了验证在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),要么忽略共享部分。