单个进程的内存使用总量

单个进程的内存使用总量

我想获得特定进程的全部内存使用量。例如,假设我想要获得的内存总量httpd。因此,如果我执行 tail 命令tail -M,我会得到:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                 
10036 mysql     20   0  417m  76m 3820 S  0.3 15.5   0:13.55 mysqld                                                                                  
10453 apache    20   0  229m  67m  42m S  0.0 13.7   0:10.81 httpd                                                                                   
10447 apache    20   0  230m  64m  38m S  0.0 13.0   0:11.54 httpd                                                                                   
10479 apache    20   0  226m  64m  42m S  0.0 13.0   0:09.75 httpd                                                                                   
10478 apache    20   0  230m  63m  38m S  0.0 12.9   0:11.02 httpd                                                                                   
10451 apache    20   0  230m  63m  37m S  0.0 12.8   0:10.37 httpd                                                                                   
 9599 apache    20   0  227m  61m  38m S  0.0 12.4   0:10.80 httpd                                                                                   
10454 apache    20   0  226m  60m  38m S  0.0 12.2   0:09.56 httpd                                                                                   
10476 apache    20   0  225m  58m  38m S  0.0 11.9   0:09.87 httpd                                                                                   
10332 apache    20   0  228m  50m  24m S  0.0 10.2   0:13.73 httpd                                                                                   
10445 apache    20   0  220m  42m  24m S  0.0  8.5   0:10.17 httpd                                                                                   
  637 root      10 -10 32816  25m 1712 S  0.0  5.2   0:00.01 iscsiuio                                                                                
  652 root      10 -10  5128 2972 1876 S  0.0  0.6   0:05.86 iscsid                                                                                  
 9592 root      20   0  207m 2872  900 S  0.0  0.6   0:00.39 httpd                                                                                   
10196 nobody    20   0  136m 2408  500 S  0.0  0.5   0:00.79 memcached              

在这种情况下,我希望为输出的每一行添加“VIRT”、“RES”、“SHR”、“%CUP”和“%MEM”。

我能做到吗?

答案1

尝试使用以下方法执行此操作

top -b -n1 -c | 
    awk -vOFS=$'\t' '
        $2 == "apache"{
            virt+=$5; res+=$6; shr+=$7; cpu+=$9; mem+=$10; count++
        }
        END{
            print "virt", "res", "shr", "cpu", "mem"
            print virt, res, shr, cpu/count, mem/count
        }
    '

答案2

进程的内存使用情况并不是一个定义明确的概念:存在共享内存区域(共享库、共享可执行文件的多个进程、父/子进程共享未修改的数据)。如果现在使用线程,则根据定义,所有线程都共享包含进程的资源。

答案3

top由于共享内存,无法统计报告的内存值,尤其是像 apache 这样的东西,其中您有同一进程的多个副本。有一个脚本叫ps_mem.py这将使您更好地了解什么在使用内存,因为它考虑了共享内存,只要您有一个 > 2.6.23 的内核报告“成比例的套装尺寸“或每个进程的 PSS。

如果您需要更多地了解每个 pid 的内存使用情况,您还可以计算Private_*中的值/proc/[0-9]*/smaps,其中私有内存是唯一有意义的值。

相关内容