查看进程内存占用

在 CentOS 系统中,通过 进程 ID(PID) 查看内存占用的方法有多种,以下是最常用的几种方式,涵盖基础命令、实时监控和进阶分析:

方法一:使用 ps 命令(快速查看静态数据)

ps 命令可以直接通过 PID 获取进程的内存占用信息,包括 物理内存(RSS)内存百分比(% MEM)

命令格式:

bash

ps -p <PID> -o %mem,rss,cmd

  • 参数说明
    • -p <PID>:指定进程 ID。
    • -o %mem,rss,cmd:指定输出字段(内存百分比、常驻内存、进程命令)。

示例:

假设 PID 为 12345,执行:

bash

ps -p 12345 -o %mem,rss,cmd

输出结果

plaintext

%MEM   RSS CMD
0.8  45678 /usr/local/go-app/main

  • %MEM:进程占用系统总内存的百分比(如 0.8%)。
  • RSS:常驻内存大小(单位为 KB,如 45678 KB ≈ 44.6 MB)。

方法二:使用 top 命令(实时动态监控)

top 命令可实时显示进程的资源占用,支持按 PID 过滤和动态刷新。

命令格式:

bash

top -p <PID>

  • 操作说明
    • 执行命令后,界面会实时刷新,显示该 PID 的详细信息。
    • 关键列:
      • RES:物理内存占用(单位为 KB,与 ps 中的 RSS 一致)。
      • %MEM:内存占用百分比。
      • SHR:共享内存(如共享库占用的内存)。

示例:

bash

top -p 12345

输出片段

plaintext

top - 14:23:45 up 1 day, 22:15,  2 users,  load average: 0.12, 0.15, 0.14
Tasks:  1 total,  0 running,  1 sleeping,  0 stopped,  0 zombie
%Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  32838120 total,   2345672 free,  28987652 used,   1504796 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2976544 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
12345 root      20   0  456789  45678   2348 S   0.0  0.1   0:04.23 /usr/local/go-app/main

方法三:使用 htop 工具(可视化增强版)

htoptop 的增强版,界面更友好,支持搜索 PID 和彩色显示。

操作步骤:

  1. 安装 htop(若未安装):

    bash

    sudo yum install htop -y
    
    
  2. 通过 PID 查找进程

    bash

    htop
    
    
    • F3(搜索)键,输入 PID 或进程名快速定位。
    • 查看 RES(物理内存)和 %MEM 列。

方法四:使用 pmap 命令(查看内存映射详情)

pmap 可显示进程的内存映射关系,包括各段内存的地址、大小和类型。

命令格式:

bash

pmap <PID>

示例:

bash

pmap 12345

输出片段

plaintext

12345:   /usr/local/go-app/main
000055b4a8c00000      44K r-x-- main
000055b4a8d0b000       4K r---- main
000055b4a8d0c000       4K rw--- main
00007f2a4c000000    1988K r-x-- libc-2.28.so
...
total kB          45678

  • 每一行代表一个内存段(如可执行代码、数据段、共享库等)。
  • total kB:进程占用的总内存(与 ps 中的 RSS 接近)。

方法五:通过 /proc 文件系统(底层查看)

Linux 系统将进程信息存储在 /proc/<PID> 目录中,可直接读取内存相关文件。

1. 查看 status 文件(简洁版):

bash

cat /proc/<PID>/status | grep -E "VmRSS|VmSize|%MEM"

  • 输出示例

    plaintext

    VmRSS:     45678 kB   # 常驻内存(物理内存)
    VmSize:   456789 kB   # 虚拟内存总量
    
    

2. 查看 smaps 文件(详细版):

bash

cat /proc/<PID>/smaps | grep "Size" -A 5  # 查看各内存段大小

  • 可获取每个内存区域的具体占用(如堆、栈、共享库等)。

方法六:使用 Go 内置的 pprof(精准分析内存结构)

如果是 Go 应用自身,可以通过 pprof 包获取更细致的内存数据(如堆内存分配、GC 状态等)。

前提条件:

在代码中导入 net/http/pprof 并启动 HTTP 服务(见 前文方法三)。

命令示例:

  1. 查看当前堆内存使用量

    bash

    curl http://localhost:6060/debug/pprof/heap | grep "in use"
    
    

    输出类似:

    plaintext

    inuse_space: total: 12345678 bytes
    
    
  2. 分析内存分配热点

    bash

    go tool pprof -inuse_space http://localhost:6060/debug/pprof/heap
    (pprof) top 10  # 显示前 10 个内存占用函数
    
    

关键概念区分

  • RSS(常驻内存):进程实际占用的物理内存(已分配且正在使用)。
  • VSS(虚拟内存):进程申请的虚拟内存总量(包含未实际分配的部分,通常大于 RSS)。
  • Go 应用的内存特点:Go 的垃圾回收(GC)会自动管理堆内存,因此需关注 堆内存增长趋势(通过 pprof分析),而非单纯看 RSS。

总结:按场景选择工具

场景 推荐工具 优势
快速查看当前占用 ps / pmap 命令简单,直接输出结果
实时动态监控 top / htop 可视化界面,支持实时刷新
深度性能分析 pprof 精准到函数级别的内存分布
系统级底层查看 /proc 文件系统 访问内核级进程信息

根据需求选择合适的工具,若需长期监控或告警,可结合 Prometheus + Grafana 等工具构建监控体系。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容