【问题标题】:Finding memory usage of a process in Linux [closed]在Linux中查找进程的内存使用情况[关闭]
【发布时间】:2014-04-11 06:30:13
【问题描述】:

我正在尝试查找特定进程的当前内存使用情况。到目前为止,我在网上找到的每个指南都提供了有关如何获取使用量占总内存百分比的说明。我希望将进程的 ram 用作离散值(即以兆字节为单位)。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    您可以在终端中运行top。它将为您提供每个进程的内存使用情况的千字节表示。您甚至可以使用grep 对某个进程的使用情况进行快照。

    【讨论】:

    • 在我的,它为每个进程提供 %mem
    • 如果您使用的是 Debian/Ubuntu。安装htopsudo apt-get install htop
    • 我有 htop,同样的事情(还有,我在拱门上)
    • 您可以尝试选项opq。请参阅文档:unixhelp.ed.ac.uk/CGI/man-cgi?top+1
    【解决方案2】:

    您可能想了解您的process 使用的virtual memoryaddress space,例如C memory management(即malloc(3) 等...)正在消耗(并释放)虚拟内存(通过mmap(2) 等...获得)。

    那么您应该使用/proc/ 文件系统(参见proc(5) ....)。特别是对于 pid 1234 的进程,请尝试cat /proc/1234/mapscat /proc/1234/status。另请参阅pmap(1) 并尝试pmap 1234

    顺便说一句,/proc/ 是内核提供有关进程信息的方式(以及大多数系统状态;另请参阅/sys/)。特别是pstoppmaphtop都在使用/proc/

    FWIW,我使用 zsh 作为我的交互式外壳,这是 cat /proc/$$/maps 给我的:

     00400000-004a5000 r-xp 00000000 08:01 2883633                            /bin/zsh5
     006a4000-006a5000 r--p 000a4000 08:01 2883633                            /bin/zsh5
     006a5000-006ab000 rw-p 000a5000 08:01 2883633                            /bin/zsh5
     006ab000-006bf000 rw-p 00000000 00:00 0 
     01e5c000-01faf000 rw-p 00000000 00:00 0                                  [heap]
     7f2fa1533000-7f2fa1564000 rw-p 00000000 00:00 0 
     7f2fa1564000-7f2fa1574000 r-xp 00000000 08:01 1049819                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/computil.so
     7f2fa1574000-7f2fa1773000 ---p 00010000 08:01 1049819                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/computil.so
     7f2fa1773000-7f2fa1774000 r--p 0000f000 08:01 1049819                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/computil.so
     7f2fa1774000-7f2fa1775000 rw-p 00010000 08:01 1049819                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/computil.so
     7f2fa1775000-7f2fa1785000 rw-p 00000000 00:00 0 
     7f2fa1785000-7f2fa1788000 r-xp 00000000 08:01 1049839                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/rlimits.so
     7f2fa1788000-7f2fa1988000 ---p 00003000 08:01 1049839                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/rlimits.so
     7f2fa1988000-7f2fa1989000 r--p 00003000 08:01 1049839                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/rlimits.so
     7f2fa1989000-7f2fa198a000 rw-p 00004000 08:01 1049839                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/rlimits.so
     7f2fa198a000-7f2fa19c0000 rw-p 00000000 00:00 0 
     7f2fa19c0000-7f2fa19c3000 r-xp 00000000 08:01 1049830                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/stat.so
     7f2fa19c3000-7f2fa1bc2000 ---p 00003000 08:01 1049830                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/stat.so
     7f2fa1bc2000-7f2fa1bc3000 r--p 00002000 08:01 1049830                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/stat.so
     7f2fa1bc3000-7f2fa1bc4000 rw-p 00003000 08:01 1049830                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/stat.so
     7f2fa1bc4000-7f2fa1bcd000 r-xp 00000000 08:01 1055723                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/parameter.so
     7f2fa1bcd000-7f2fa1dcd000 ---p 00009000 08:01 1055723                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/parameter.so
     7f2fa1dcd000-7f2fa1dce000 r--p 00009000 08:01 1055723                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/parameter.so
     7f2fa1dce000-7f2fa1dcf000 rw-p 0000a000 08:01 1055723                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/parameter.so
     7f2fa1dcf000-7f2fa1dd6000 r-xp 00000000 08:01 1056697                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zutil.so
     7f2fa1dd6000-7f2fa1fd5000 ---p 00007000 08:01 1056697                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zutil.so
     7f2fa1fd5000-7f2fa1fd6000 r--p 00006000 08:01 1056697                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zutil.so
     7f2fa1fd6000-7f2fa1fd7000 rw-p 00007000 08:01 1056697                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zutil.so
     7f2fa1fd7000-7f2fa1ff9000 r-xp 00000000 08:01 1049816                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/complete.so
     7f2fa1ff9000-7f2fa21f9000 ---p 00022000 08:01 1049816                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/complete.so
     7f2fa21f9000-7f2fa21fa000 r--p 00022000 08:01 1049816                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/complete.so
     7f2fa21fa000-7f2fa21fb000 rw-p 00023000 08:01 1049816                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/complete.so
     7f2fa21fb000-7f2fa21fc000 rw-p 00000000 00:00 0 
     7f2fa21fc000-7f2fa223d000 r-xp 00000000 08:01 1049825                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zle.so
     7f2fa223d000-7f2fa243d000 ---p 00041000 08:01 1049825                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zle.so
     7f2fa243d000-7f2fa243e000 r--p 00041000 08:01 1049825                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zle.so
     7f2fa243e000-7f2fa2445000 rw-p 00042000 08:01 1049825                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/zle.so
     7f2fa2445000-7f2fa2446000 rw-p 00000000 00:00 0 
     7f2fa2446000-7f2fa2448000 r-xp 00000000 08:01 1055724                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/terminfo.so
     7f2fa2448000-7f2fa2647000 ---p 00002000 08:01 1055724                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/terminfo.so
     7f2fa2647000-7f2fa2648000 r--p 00001000 08:01 1055724                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/terminfo.so
     7f2fa2648000-7f2fa2649000 rw-p 00002000 08:01 1055724                    /usr/lib/x86_64-linux-gnu/zsh/5.0.5/zsh/terminfo.so
     7f2fa2649000-7f2fa2655000 r-xp 00000000 08:01 4985164                    /lib/x86_64-linux-gnu/libnss_files-2.18.so
     7f2fa2655000-7f2fa2854000 ---p 0000c000 08:01 4985164                    /lib/x86_64-linux-gnu/libnss_files-2.18.so
     7f2fa2854000-7f2fa2855000 r--p 0000b000 08:01 4985164                    /lib/x86_64-linux-gnu/libnss_files-2.18.so
     7f2fa2855000-7f2fa2856000 rw-p 0000c000 08:01 4985164                    /lib/x86_64-linux-gnu/libnss_files-2.18.so
     7f2fa2856000-7f2fa2860000 r-xp 00000000 08:01 4985173                    /lib/x86_64-linux-gnu/libnss_nis-2.18.so
     7f2fa2860000-7f2fa2a5f000 ---p 0000a000 08:01 4985173                    /lib/x86_64-linux-gnu/libnss_nis-2.18.so
     7f2fa2a5f000-7f2fa2a60000 r--p 00009000 08:01 4985173                    /lib/x86_64-linux-gnu/libnss_nis-2.18.so
     7f2fa2a60000-7f2fa2a61000 rw-p 0000a000 08:01 4985173                    /lib/x86_64-linux-gnu/libnss_nis-2.18.so
     7f2fa2a61000-7f2fa2a76000 r-xp 00000000 08:01 4985159                    /lib/x86_64-linux-gnu/libnsl-2.18.so
     7f2fa2a76000-7f2fa2c75000 ---p 00015000 08:01 4985159                    /lib/x86_64-linux-gnu/libnsl-2.18.so
     7f2fa2c75000-7f2fa2c76000 r--p 00014000 08:01 4985159                    /lib/x86_64-linux-gnu/libnsl-2.18.so
     7f2fa2c76000-7f2fa2c77000 rw-p 00015000 08:01 4985159                    /lib/x86_64-linux-gnu/libnsl-2.18.so
     7f2fa2c77000-7f2fa2c79000 rw-p 00000000 00:00 0 
     7f2fa2c79000-7f2fa2c80000 r-xp 00000000 08:01 4985166                    /lib/x86_64-linux-gnu/libnss_compat-2.18.so
     7f2fa2c80000-7f2fa2e7f000 ---p 00007000 08:01 4985166                    /lib/x86_64-linux-gnu/libnss_compat-2.18.so
     7f2fa2e7f000-7f2fa2e80000 r--p 00006000 08:01 4985166                    /lib/x86_64-linux-gnu/libnss_compat-2.18.so
     7f2fa2e80000-7f2fa2e81000 rw-p 00007000 08:01 4985166                    /lib/x86_64-linux-gnu/libnss_compat-2.18.so
     7f2fa2e81000-7f2fa2e85000 r-xp 00000000 08:01 4980783                    /lib/x86_64-linux-gnu/libattr.so.1.1.0
     7f2fa2e85000-7f2fa3084000 ---p 00004000 08:01 4980783                    /lib/x86_64-linux-gnu/libattr.so.1.1.0
     7f2fa3084000-7f2fa3085000 r--p 00003000 08:01 4980783                    /lib/x86_64-linux-gnu/libattr.so.1.1.0
     7f2fa3085000-7f2fa3086000 rw-p 00004000 08:01 4980783                    /lib/x86_64-linux-gnu/libattr.so.1.1.0
     7f2fa3086000-7f2fa3226000 r-xp 00000000 08:01 4985168                    /lib/x86_64-linux-gnu/libc-2.18.so
     7f2fa3226000-7f2fa3425000 ---p 001a0000 08:01 4985168                    /lib/x86_64-linux-gnu/libc-2.18.so
     7f2fa3425000-7f2fa3429000 r--p 0019f000 08:01 4985168                    /lib/x86_64-linux-gnu/libc-2.18.so
     7f2fa3429000-7f2fa342b000 rw-p 001a3000 08:01 4985168                    /lib/x86_64-linux-gnu/libc-2.18.so
     7f2fa342b000-7f2fa342f000 rw-p 00000000 00:00 0 
     7f2fa342f000-7f2fa3530000 r-xp 00000000 08:01 4985165                    /lib/x86_64-linux-gnu/libm-2.18.so
     7f2fa3530000-7f2fa3730000 ---p 00101000 08:01 4985165                    /lib/x86_64-linux-gnu/libm-2.18.so
     7f2fa3730000-7f2fa3731000 r--p 00101000 08:01 4985165                    /lib/x86_64-linux-gnu/libm-2.18.so
     7f2fa3731000-7f2fa3732000 rw-p 00102000 08:01 4985165                    /lib/x86_64-linux-gnu/libm-2.18.so
     7f2fa3732000-7f2fa3757000 r-xp 00000000 08:01 4980894                    /lib/x86_64-linux-gnu/libtinfo.so.5.9
     7f2fa3757000-7f2fa3957000 ---p 00025000 08:01 4980894                    /lib/x86_64-linux-gnu/libtinfo.so.5.9
     7f2fa3957000-7f2fa395b000 r--p 00025000 08:01 4980894                    /lib/x86_64-linux-gnu/libtinfo.so.5.9
     7f2fa395b000-7f2fa395c000 rw-p 00029000 08:01 4980894                    /lib/x86_64-linux-gnu/libtinfo.so.5.9
     7f2fa395c000-7f2fa395f000 r-xp 00000000 08:01 4985160                    /lib/x86_64-linux-gnu/libdl-2.18.so
     7f2fa395f000-7f2fa3b5e000 ---p 00003000 08:01 4985160                    /lib/x86_64-linux-gnu/libdl-2.18.so
     7f2fa3b5e000-7f2fa3b5f000 r--p 00002000 08:01 4985160                    /lib/x86_64-linux-gnu/libdl-2.18.so
     7f2fa3b5f000-7f2fa3b60000 rw-p 00003000 08:01 4985160                    /lib/x86_64-linux-gnu/libdl-2.18.so
     7f2fa3b60000-7f2fa3b64000 r-xp 00000000 08:01 4980821                    /lib/x86_64-linux-gnu/libcap.so.2.22
     7f2fa3b64000-7f2fa3d63000 ---p 00004000 08:01 4980821                    /lib/x86_64-linux-gnu/libcap.so.2.22
     7f2fa3d63000-7f2fa3d64000 rw-p 00003000 08:01 4980821                    /lib/x86_64-linux-gnu/libcap.so.2.22
     7f2fa3d64000-7f2fa3d84000 r-xp 00000000 08:01 4985158                    /lib/x86_64-linux-gnu/ld-2.18.so
     7f2fa3d85000-7f2fa3d91000 rw-p 00000000 00:00 0 
     7f2fa3d91000-7f2fa3f59000 r--p 00000000 08:01 7083454                    /usr/lib/locale/locale-archive
     7f2fa3f59000-7f2fa3f5e000 rw-p 00000000 00:00 0 
     7f2fa3f60000-7f2fa3f70000 rw-p 00000000 00:00 0 
     7f2fa3f72000-7f2fa3f7a000 rw-p 00000000 00:00 0 
     7f2fa3f7a000-7f2fa3f81000 r--s 00000000 08:01 7112364                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
     7f2fa3f81000-7f2fa3f83000 rw-p 00000000 00:00 0 
     7f2fa3f83000-7f2fa3f84000 r--p 0001f000 08:01 4985158                    /lib/x86_64-linux-gnu/ld-2.18.so
     7f2fa3f84000-7f2fa3f85000 rw-p 00020000 08:01 4985158                    /lib/x86_64-linux-gnu/ld-2.18.so
     7f2fa3f85000-7f2fa3f86000 rw-p 00000000 00:00 0 
     7ffff69af000-7ffff69d0000 rw-p 00000000 00:00 0                          [stack]
     7ffff69fe000-7ffff6a00000 r-xp 00000000 00:00 0                          [vdso]
     ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    

    另请阅读ASLRAdvanced Linux Programming

    【讨论】:

      【解决方案3】:

      如果你知道进程 ID:

      cat /proc/$pid/status
      

      如果您想在流程中使用:

      cat /proc/self/status # or read the file with fopen() or whatnot
      

      这将输出如下内容:

      # cat /proc/7049/status
      Name:   bash
      State:  S (sleeping)
      Tgid:   7049
      Pid:    7049
      PPid:   7042
      TracerPid:      0
      Uid:    500     500     500     500
      Gid:    500     500     500     500
      Utrace: 0
      FDSize: 256
      Groups: 10 500
      VmPeak:   108524 kB
      VmSize:   108492 kB
      VmLck:         0 kB
      VmHWM:      2080 kB
      VmRSS:      2072 kB
      VmData:      532 kB
      VmStk:        88 kB
      VmExe:       848 kB
      VmLib:      1876 kB
      VmPTE:        60 kB
      VmSwap:        0 kB
      Threads:        1
      SigQ:   0/14888
      SigPnd: 0000000000000000
      ShdPnd: 0000000000000000
      SigBlk: 0000000000010000
      SigIgn: 0000000000384004
      SigCgt: 000000004b813efb
      CapInh: 0000000000000000
      CapPrm: 0000000000000000
      CapEff: 0000000000000000
      CapBnd: ffffffffffffffff
      Cpus_allowed:   1
      Cpus_allowed_list:      0
      Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
      Mems_allowed_list:      0
      voluntary_ctxt_switches:        164
      nonvoluntary_ctxt_switches:     4
      

      Vm* 字段包含您寻找的信息。

      注意:具体格式可能因发行版而异。

      或者,更简单地说:

      ps up $pid
      

      这给出了类似的东西:

      # ps up 7049
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      stack     7049  0.0  0.1 108492  2072 pts/0    Ss   20:23   0:00 -bash
      

      【讨论】:

        【解决方案4】:

        你可以使用

        ps aux --sort=%mem,%cpu
        

        按内存和 CPU 使用率对所有正在运行的进程进行排序。

        如果您只想限制在当前终端运行的进程:

        ps v
        

        如果你知道 pid 使用:

        ps v <pid>
        

        示例输出:

        PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND
        36626  pts/3 A     0:00    0   316   408 32768    51    60  0.0  0.0 ps v
        

        在哪里

        PGIN 页面错误导致的页面调入数。由于所有 I/O 都归类为页面错误,因此这基本上是 I/O 量的衡量标准。

        尺寸 进程数据部分的虚拟大小(在分页空间中)(以千字节为单位)(由其他标志显示为 SZ)。这个数等于进程被触摸的工作段页数的4倍。如果当前有一些工作段页被调出,这个数大于正在使用的实际内存量。 SIZE 包括进程的私有段和共享库数据段中的页面。

        RSS 进程的实内存(驻留集)大小(以千字节为单位)。这个数字等于内存中工作段和代码段页数的总和乘以 4。请记住,代码段页在所有当前运行的程序实例之间共享。如果有 26 个 ksh 进程正在运行,则 ksh 可执行程序的任何给定页面只有一个副本在内存中,但 ps 命令会将该代码段大小报告为 ksh 程序每个实例的 RSS 的一部分。

        TSIZ 文本(共享程序)图像的大小。这是可执行文件的文本部分的大小。可执行程序的文本部分的页面仅在它们被触摸时才被带入内存,即分支到或加载自。此数字仅表示可以加载的文本量的上限。 TSIZ 值不反映实际内存使用情况。通过对可执行程序(例如,dump -ov /usr/bin/ls)执行 dump -ov 命令也可以看到此 TSIZ 值。

        TRS 文本的驻留集(实际内存)的大小。这是代码段页数乘以 4。这个数字夸大了运行多个实例的程序的内存使用量。 TRS 值可以高于 TSIZ 值,因为代码段中可能包含其他页面,例如 XCOFF 标头和加载程序部分。

        %MEM 计算为内存中工作段和代码段页数之和乘以4(即RSS值),除以实际使用内存的大小,以KB为单位,乘以100,四舍五入为最接近的完整百分点。此值试图传达进程正在使用的实际内存的百分比。不幸的是,像 RSS 一样,它倾向于夸大与其他进程共享程序文本的进程的成本。此外,四舍五入到最接近的百分比会导致系统中所有 RSS 值低于 0.005 倍实际内存大小的进程的 %MEM 为 0.0。

        【讨论】:

          【解决方案5】:

          要仅获取单个感兴趣的内存使用数,请尝试($pid 是感兴趣的 PID 的占位符;在 bash 中,使用 @例如 987654325@ 引用当前的 shell 进程):

           ps -o rss= $pid   # resident set in kbytes; e.g., 2461016
           ps -o vsz= $pid   # virtual size in kbytes; e.g., 1048
          

          正如Sammitch 指出的那样,在一个以空格分隔的输出行中获取两个 值的方法是:

           ps -o vsz=,rss= $pid
          

          将单个值转换为 MB(四舍五入为整数,根据需要进行调整),请尝试以下操作:

          ps -o rss= $pid | awk '{printf "%.0f\n", $1 / 1024}' # e.g., 1
          

          PowerShell 中,您可以简化为(注意这里的$PID 实际上是指shell 的进程本身,类似于$$ 在POSIX 兼容的shell 中,例如bash):

          (ps -o rss= $pid) / 1mb  # e.g., 1.0443000793457031
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多