| 名称 | 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 -h或tegrastats显示的空闲内存可能不会恢复——即使进程已消失。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 -h和tegrastats将反映真实可用内存。
对于受影响的版本,当用户说以下话时建议使用此命令:
- “停止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_release、tegrastats和进程数据的沙箱/容器中运行。 - 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.sh或scripts/drop_caches.sh并总结返回的输出。否则,请从仓库根目录使用bash运行脚本。
说明
对于“现在用了多少内存?”的问题,运行scripts/audit.sh并仅报告JSON快照中的值。
报告指南
不要只打印或提及辅助脚本的路径。调用辅助脚本,然后总结返回的数据。
- 对于“使用了多少内存”的提示,运行
scripts/audit.sh并引用mem_total_gb、memory_kb.available以及领先的procrank_top进程或nvmap.top_clients消费者。 - 对于GUI/桌面内存提示,运行
scripts/audit.sh并报告default_systemd_target以及candidate_services中的任何显示管理器(gdm3、gdm、lightdm、sddm或display-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_release、tegrastats、/sys/kernel/debug/nvmap或主机进程数据,请说明沙箱缺少Jetson主机可见性,并要求用户在Jetson主机上运行或使用主机可见的沙箱配置文件重新启动。不要编造内存总数、可用内存、PSS、NvMap或回收差异。
对于“这个更改释放了多少内存?”的问题,使用前后差异。不要根据容器大小、镜像大小、RSS或单个更改后的快照来估算释放的内存。
- 更改前,运行
scripts/audit.sh并保存JSON基线。 - 进行用户批准的更改(停止容器、切换模式、应用调优建议等)。
- 在JetPack低于7.2 / L4T低于r39.0,或在较新版本上观察到相同的卡住内存症状时,在宿主机上(而不是容器内)刷新可回收页缓存,使释放的页面显示为空闲而不是缓存:
sudo sync && sudo sysctl -w vm.drop_caches=3 - 重新运行
scripts/audit.sh并比较前后的memory_kb.available——该差异是真正的回收量。
如果用户已进行了更改且没有基线,请说明无法仅从当前快照中恢复确切的释放量。现在捕获新基线,以便可以测量下一次更改。
使用实时审计数据作为真相来源。内存总数、可用内存、NvMap总数、PSS值、显示管理器状态和节省差异必须来自实际设备上的scripts/audit.sh、free -h或tegrastats。如果输出中不存在某个数字,请不要猜测它。
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内存归因,而不是猜测。
- 沙箱/容器运行可能看不到宿主机的
/proc、tegrastats、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消费者时。- 如果运行时更改无法达到目标,请报告进一步的回收超出此技能的范围,而不是建议不安全的启动时编辑。