欢迎光临
我们一直在努力

如何查看ubuntu上占用内存最多的进程

在AI模型训练和部署环境中,内存(RAM)和显存(VRAM)的管理是性能优化和稳定性保障的关键。当系统出现性能下降、交换空间(Swap)使用过多,或者直接触发OOM(Out of Memory)错误时,首要任务是找到并分析占用系统内存最多的进程。本文将聚焦于如何使用标准Ubuntu工具精确地定位这些“内存大户”,并将其与AI基础设施的调试场景相结合。

1. 为什么定位内存进程对AI Infra至关重要?

对于运行大型模型的服务器,如LLM推理服务或大规模数据加载的训练任务,高内存占用可能由以下原因引起:

  1. 数据加载过度: 使用PyTorch或TensorFlow时,如果数据预处理或缓存逻辑设计不当,可能将整个数据集(或过多批次)加载到系统RAM中。
  2. 进程泄露: 自定义的模型服务(如基于Flask/Gunicorn或Go/Rust包装器)可能存在内存泄漏。
  3. 子进程共享内存: 像使用multiprocessing库进行数据并行或数据加载时,不恰当的进程间通信可能导致内存副本过多。

2. 交互式查看:tophtop

这是最常用的快速检查方法。这些工具提供了实时的、交互式的系统概览。

使用 top

运行 top 后,按下 Shift + M (或大写 M),即可按内存使用量(%MEM)从高到低排序。


1
2
top
# 在 top 界面按 M 键排序

使用 htop (推荐)

htoptop 的增强版本,提供了更友好的界面和鼠标操作支持。如果尚未安装,请运行:


1
sudo apt update && sudo apt install htop

运行 htop 后,可以通过光标移动到 MEM% 列,然后按 F6 (排序) 选择该列进行降序排列。

3. 精确定位:使用 ps 命令(最佳实践)

对于需要精确、非交互式输出(例如用于脚本或自动化监控)的场景,ps 命令是最佳选择。我们可以利用 ps 的格式化输出和排序功能。

我们将按驻留内存大小 (RSS) 进行排序。RSS是进程当前实际占用在物理内存中的非交换内存量,是衡量进程内存消耗最准确的指标。

以下命令可以列出PID、父进程PID、命令、内存百分比和RSS(单位为KiB),并按RSS降序排列,只显示前10行(包括标题行):


1
2
3
4
5
6
7
# ps 命令的关键参数说明:
# -e: 显示所有进程
# -o: 指定输出格式
# pid, ppid, cmd, %mem, rss: 输出字段 (cmd为完整命令行, rss为实际物理内存使用量)
# --sort=-rss: 按照 rss 字段降序排列 (负号表示降序)

ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | head -n 10

示例输出:


1
2
3
4
5
    PID  PPID CMD                         %MEM      RSS
  21584     1 /usr/bin/python3 /path/to/my_llm_service.py 45.3 12587440
   3102     1 /usr/bin/python3 /opt/venv/bin/pytorch_train 15.0  4194304
   1055     1 /usr/lib/systemd/systemd --user 0.1    89760
   ...

在上述示例中,PID 21584 占用了大约 12.5GB (12587440 KiB) 的系统内存,这极有可能是一个正在运行的大型模型推理服务。

4. 深入分析内存占用:smaps

一旦定位到高内存占用的进程PID,我们就可以使用 /proc/[PID]/smaps 文件来进一步分析该进程的内存映射区域。这对于诊断复杂的内存共享和库依赖非常有用。

例如,要查看 PID 为 21584 的进程详细内存映射信息,并汇总其私有内存(Private Clean/Dirty):


1
2
3
4
5
6
7
8
9
10
11
12
13
# 假设我们定位到的内存大户是 PID 21584

cat /proc/21584/smaps | grep -E 'Private|Shared' | grep -E 'Clean|Dirty' | awk '{
    if ($1 == "Private_Clean:") private_clean += $2;
    if ($1 == "Private_Dirty:") private_dirty += $2;
    if ($1 == "Shared_Clean:") shared_clean += $2;
    if ($1 == "Shared_Dirty:") shared_dirty += $2;
} END {
    print "Private Clean (KiB): ", private_clean;
    print "Private Dirty (KiB): ", private_dirty;
    print "Shared (KiB): ", shared_clean + shared_dirty;
    print "Total Private RAM (KiB): ", private_clean + private_dirty;
}'

Private Dirty 通常是内存泄漏或数据重复加载最直接的信号,因为这块内存是进程独占且被修改过的,不能被系统回收或共享。

5. 总结与调试思路

  1. 定位: 使用 ps -eo … –sort=-rss | head 快速确定内存占用最多的PID及其命令行。
  2. 分析: 查看该进程对应的代码或服务配置,特别是数据加载部分(DataLoader workers, 缓存大小)。
  3. 优化: 如果是AI训练任务,考虑减少批次大小、使用内存映射文件(memory-mapped files)、或检查是否有不必要的张量被意外留在RAM中(例如,未调用.cpu()后即销毁)。
  4. 确认: 如果是服务进程,重启服务后观察内存是否持续增长(典型的内存泄漏)。

掌握这些命令行工具是任何AI基础设施工程师确保系统稳定和资源优化的基础技能。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 如何查看ubuntu上占用内存最多的进程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址