Jetson内存审计Skill jetson-memory-audit

用于测量Jetson设备的内存使用情况(DRAM/NvMap),诊断内存占用并验证内存回收效果。提供内存快照与缓存清理辅助,解决CUDA工作负载停止后内存不释放的常见问题。关键词:Jetson、内存审计、DRAM、NvMap、drop_caches、tegrastats、内存回收

平台管理与诊断 0 次安装 0 次浏览 更新于 9/6/2026
名称 jetson-memory-audit
描述 ‘测量Jetson DRAM/NvMap使用情况,并通过实时审计数据验证内存回收前后的变化。’
版本 0.0.1
开源协议 ‘Apache-2.0’ metadata:
作者 ‘Jetson Team’ tags: [jetson, 内存, 审计] languages: [bash] data-classification: public

Jetson 内存审计

面向Jetson的只读内存快照,以及drop_caches验证循环辅助脚本,用于确认释放的内存确实显示为可用而不是缓存。

目的

测量当前Jetson内存消耗者,捕获前后基线,并验证用户批准的更改是否实际回收了DRAM。使用实时设备数据,而不是根据容器大小、模型大小或通用进程内存来估算。

关键:停止vLLM / sglang后内存似乎卡住(JetPack低于7.2 / L4T低于r39.0)

这是JetPack 7.2之前或L4T r39.0之前的Jetson版本上最常见的内存困惑。

停止vLLM、sglang或Ollama服务器(或任何CUDA工作负载)后,free -htegrastats显示的空闲内存可能不会恢复——即使进程已消失。nvidia-smi也可能显示误导性的低GPU空闲内存。

根本原因: Thor RM(资源管理器)在CUDA上下文退出后,将已释放的sysmem页面保留在自己的池中。在像Jetson这样的统一内存架构(UMA)设备上,cudaMemGetInfo读取的是RM池状态,因此报告的空闲内存远低于新进程实际可用的内存。

解决方法(适用于JetPack低于7.2或L4T低于r39.0):

sudo sync && sudo sysctl -w vm.drop_caches=3

宿主机上运行,不要在容器内。关键操作是 sudo sysctl -w vm.drop_caches=3;在此之前保持 sudo sync 以确保脏数据在可回收的页/目录项/inode缓存被丢弃之前刷新。运行后,free -htegrastats将反映真实可用内存。

对于受影响的版本,当用户说以下话时建议使用此命令:

  • “停止vLLM/sglang后内存没有释放”
  • “为什么我的容器退出后tegrastats仍显示高使用率?”
  • “尽管没有运行任何东西,仍出现OOM”
  • “昨天内存还好好的,现在满了”

在JetPack低于7.2或L4T低于r39.0时,drop_caches是CUDA工作负载退出后内存看起来卡住时的可靠解决方法;在更新版本上,仅当观察到相同症状且用户批准时使用。

何时使用

  • “这个Jetson上使用了多少内存?什么占用了它?”
  • “我禁用了GUI / 停止了vLLM / 退出了容器——内存真的释放了吗?”
  • “为什么停止工作负载后free -h仍然显示低空闲内存?”
  • 在应用jetson-headless-mode或其他内存相关更改之前的基线,以及之后再次用于计算实际差异。

先决条件

  • 在Jetson宿主机上运行,或在能够看到主机/proc/etc/nv_tegra_releasetegrastats和进程数据的沙箱/容器中运行。
  • NvMap debugfs读取可能需要root权限。如果不可用,请报告GPU内存归因受限,而不是猜测。
  • drop_caches.sh需要root或免密sudo -n;仅在用户明确授权缓存丢弃后运行。

可用脚本

脚本 用途 参数
scripts/audit.sh jetson-diagnostic/scripts/snapshot.sh发出JSON快照,用于内存审计工作流。 无参数。
scripts/drop_caches.sh 刷新可回收的页/目录项/inode缓存,并打印前后内存差异。 --mode 1|2|3, --quiet

如果您的代理运行时支持run_script,请使用它运行scripts/audit.shscripts/drop_caches.sh并总结返回的输出。否则,请从仓库根目录使用bash运行脚本。

说明

对于“现在用了多少内存?”的问题,运行scripts/audit.sh并仅报告JSON快照中的值。

报告指南

不要只打印或提及辅助脚本的路径。调用辅助脚本,然后总结返回的数据。

  • 对于“使用了多少内存”的提示,运行scripts/audit.sh并引用mem_total_gbmemory_kb.available以及领先的procrank_top进程或nvmap.top_clients消费者。
  • 对于GUI/桌面内存提示,运行scripts/audit.sh并报告default_systemd_target以及candidate_services中的任何显示管理器(gdm3gdmlightdmsddmdisplay-manager)。不要禁用任何内容;将其转交给jetson-headless-mode制定计划。
  • 对于明确授权在停止工作负载后丢弃缓存的提示,运行scripts/drop_caches.sh(默认等同于sudo sync && sudo sysctl -w vm.drop_caches=3)并报告其前后的空闲、可用和缓存差异。如果root不可用,请说明必须在宿主机上使用sudo运行。

如果您的代理运行时无法相对于此技能目录执行辅助脚本,请使用AgentSkills {baseDir}占位符解析脚本路径:

{baseDir}/scripts/audit.sh
{baseDir}/scripts/drop_caches.sh

除非运行时明确将技能注册为可调用工具,否则不要将jetson-memory-audit作为工具名称调用;Agent Skills通常是说明加文件,而不是直接的工具函数。

代理的沙箱说明:看到此技能文件并不保证能访问Jetson主机内存数据。如果NemoClaw/OpenClaw沙箱中缺少/proc/device-tree/model/etc/nv_tegra_releasetegrastats/sys/kernel/debug/nvmap或主机进程数据,请说明沙箱缺少Jetson主机可见性,并要求用户在Jetson主机上运行或使用主机可见的沙箱配置文件重新启动。不要编造内存总数、可用内存、PSS、NvMap或回收差异。

对于“这个更改释放了多少内存?”的问题,使用前后差异。不要根据容器大小、镜像大小、RSS或单个更改后的快照来估算释放的内存。

  1. 更改前,运行scripts/audit.sh并保存JSON基线。
  2. 进行用户批准的更改(停止容器、切换模式、应用调优建议等)。
  3. 在JetPack低于7.2 / L4T低于r39.0,或在较新版本上观察到相同的卡住内存症状时,在宿主机上(而不是容器内)刷新可回收页缓存,使释放的页面显示为空闲而不是缓存:
    sudo sync && sudo sysctl -w vm.drop_caches=3
    
  4. 重新运行scripts/audit.sh并比较前后的memory_kb.available——该差异是真正的回收量。

如果用户已进行了更改且没有基线,请说明无法仅从当前快照中恢复确切的释放量。现在捕获新基线,以便可以测量下一次更改。

使用实时审计数据作为真相来源。内存总数、可用内存、NvMap总数、PSS值、显示管理器状态和节省差异必须来自实际设备上的scripts/audit.shfree -htegrastats。如果输出中不存在某个数字,请不要猜测它。

audit.sh的输出契约

{
  "sku": "orin-nano",
  "variant": "orin-nano-8gb",
  "mem_total_gb": 8,
  "l4t_version": "36.4.0",
  "product_model": "nvidia jetson orin nano developer kit",
  "memory_kb": { "total": 8123456, "available": 4123456, "free": 1023456, "cached": 1234567, "swap_total": 0, "swap_free": 0 },
  "default_systemd_target": "graphical.target",
  "candidate_services": { "gdm3": { "active": "active", "enabled": "enabled" } },
  "tegrastats_sample": "RAM 4011/8138MB (lfb 8x4MB) ...",
  "nvmap": { "readable": false, "total_kb": 0, "top_clients": [] },
  "procrank_top": [ { "pid": 4321, "pss_kb": 4000000, "cmd": "vllm" } ]
}

限制

  • 精确的内存释放差异需要前一个快照、用户批准的更改、适当的缓存刷新以及后一个快照。
  • NvMap归因依赖于宿主机可见的debugfs访问;如果不可用,请报告受限的GPU内存归因,而不是猜测。
  • 沙箱/容器运行可能看不到宿主机的/proctegrastats、systemd或NvMap数据,除非运行时暴露它们。

错误处理

  • 如果scripts/audit.sh无法访问主机Jetson数据,请报告缺失的可见性,并要求在Jetson宿主机上或在主机可见的沙箱中重新运行。
  • 如果scripts/drop_caches.sh缺少root或免密sudo -n,请报告必须在宿主机上使用sudo批准运行缓存丢弃。
  • 如果不存在先前快照,请说明无法仅从当前状态恢复确切的回收量,并为下一次更改捕获新基线。

安全性

只读。drop_caches是非破坏性的(内核只释放它在压力下本来可以回收的页面;sync首先运行以保留脏数据)。

转交至

  • jetson-headless-mode — 对于仍引导graphical.target的系统,这是最大的用户空间单一收益。
  • jetson-inference-mem-tune — 当模型服务器是顶级的NvMap / PSS消费者时。
  • 如果运行时更改无法达到目标,请报告进一步的回收超出此技能的范围,而不是建议不安全的启动时编辑。