jetson-memory-audit
NVIDIA/skills
Meça o uso de DRAM do Jetson e do NvMap, capture os valores de referência antes e depois e verifique a recuperação de memória com dados de auditoria em tempo real.
...Expandir tudoAuditoria de Memória do Jetson
Snapshot focado na memória de leitura exclusiva (ROM) para um Jetson, além do auxiliar de loop de verificação `drop_caches`, que confirma se a memória liberada realmente aparece como livre, em vez de armazenada em cache.
Objetivo
Medir os atuais consumidores de memória do Jetson, capturar valores de referência antes e depois e verificar se as alterações aprovadas pelo usuário realmente recuperaram DRAM. Utilizar dados em tempo real do dispositivo, em vez de estimativas baseadas no tamanho do contêiner, no tamanho do modelo ou na memória genérica do processo.
CRÍTICO: A memória parece travada após a interrupção do vLLM / sglang (JetPack abaixo da versão 7.2 / L4T abaixo da r39.0)
Essa é a confusão de memória mais comum nas versões do Jetson anteriores ao JetPack 7.2 ou ao L4T r39.0.
Depois de parar um servidor vLLM, sglang ou Ollama (ou qualquer carga de trabalho CUDA), a memória exibida como livre pelo comando `free -h ` ou pelo `tegrastats` pode não ser recuperada — mesmo que o processo tenha sido encerrado. O `nvidia-smi` também pode exibir uma quantidade enganosamente baixa de memória livre da GPU.
Causa principal: o Thor RM (gerenciador de recursos) mantém as páginas de memória do sistema (sysmem) liberadas em seu próprio pool após o encerramento de um contexto CUDA. Em dispositivos com Arquitetura de Memória Unificada (UMA), como o Jetson, o `cudaMemGetInfo` lê o estado do pool do RM e relata uma quantidade de memória livre muito menor do que a realmente disponível para um novo processo.
Solução alternativa (para JetPack abaixo da versão 7.2 ou L4T abaixo da r39.0):
sudo sync && sudo sysctl -w vm.drop_caches=3
Execute isso no host, não dentro de um contêiner. A operação importante é o `sudo sysctl -w vm.drop_caches=3`; execute o `sudo sync ` imediatamente antes dela para que os dados não validados sejam liberados antes que os caches de páginas/dentry/inode recuperáveis sejam descartados. Após a execução, os comandos `free -h ` e ` tegrastats ` refletirão a memória disponível real.
Para as versões afetadas, recomenda-se este comando quando um usuário relatar:
- “A memória não foi liberada depois que eu parei o vLLM/sglang”
- “Por que o tegrastats ainda mostra um uso alto depois que meu contêiner foi encerrado?”
- “OOM mesmo sem nada em execução”
- “A memória estava normal ontem, mas agora está cheia”
No JetPack abaixo da versão 7.2 ou no L4T abaixo da r39.0, o comando `drop_caches` é a solução alternativa confiável quando a memória parece travada após o encerramento de uma carga de trabalho CUDA; em versões mais recentes, use-o apenas se o mesmo sintoma for observado e o usuário aprovar.
Quando usar
- “Quanta memória está em uso neste Jetson? O que está ocupando-a?”
- “Desativei a GUI / parei o vLLM / saí do meu contêiner — a memória realmente foi liberada?”
- "Por que o comando `
free -h` ainda mostra pouca memória livre depois que parei minha carga de trabalho?" - Como referência antes de aplicar
o jetson-headless-modeou outras alterações relacionadas à memória, e novamente depois para calcular a diferença real.
Pré-requisitos
- Execute no host do Jetson ou em uma sandbox/contêiner com
/proc,/etc/nv_tegra_release,tegrastatse dados de processos visíveis ao host. - As leituras do NvMap no debugfs podem exigir privilégios de root. Se não estiverem disponíveis, informe que a alocação de memória da GPU está limitada, em vez de fazer suposições.
O `drop_caches.sh`requer privilégios de root ou`sudo -n` sem senha; execute-o somente após o usuário autorizar explicitamente a liberação do cache.
Scripts disponíveis
| Script | Finalidade | Argumentos |
|---|---|---|
scripts/audit.sh |
Gera um snapshot em JSON a partir do arquivo jetson-diagnostic/scripts/snapshot.sh para fluxos de trabalho de auditoria de memória. |
Sem argumentos. |
scripts/drop_caches.sh |
Limpa caches recuperáveis de páginas/dentry/inodes e exibe as diferenças de memória antes e depois. | --mode 1|2|3, --quiet. |
Se o ambiente de execução do seu agente suportar run_script, use-o para executar scripts/audit.sh ou scripts/drop_caches.sh e resuma a saída retornada. Caso contrário, execute os scripts com o bash a partir da raiz do repositório.
Instruções
Para perguntas do tipo “quanta memória está em uso no momento?”, execute scripts/audit.sh e relate apenas os valores do snapshot JSON.
Orientação para relatórios
Não se limite a imprimir ou mencionar o caminho para um auxiliar. Chame o auxiliar e, em seguida, resuma os dados retornados.
- Para solicitações do tipo “quanta memória está em uso?”, execute
scripts/audit.she citemem_total_gb,memory_kb.availablee o processoprocrank_topprincipal ou o consumidornvmap.top_clients. - Para solicitações de memória da GUI/área de trabalho, execute
scripts/audit.she relatedefault_systemd_target, além de qualquer gerenciador de tela emcandidate_services(gdm3,gdm,lightdm,sddmoudisplay-manager). Não desative nada; encaminhe parao jetson-headless-modepara um plano. - Para solicitações que autorizem explicitamente a liberação do cache após a interrupção de uma carga de trabalho, execute
scripts/drop_caches.sh(equivalente asudo sync && sudo sysctl -w vm.drop_caches=3por padrão) e relate as variações antes e depois em termos de memória livre, disponível e em cache. Se o root não estiver disponível, explique que o comando deve ser executado no host com o `sudo`.
Se o ambiente de execução do seu agente não executar scripts auxiliares relativos a este diretório de habilidades, resolva os caminhos dos scripts com o placeholder AgentSkills {baseDir}:
{baseDir}/scripts/audit.sh
{baseDir}/scripts/drop_caches.sh
Não chame jetson-memory-audit como nome de ferramenta, a menos que o ambiente de execução registre explicitamente as habilidades como ferramentas chamáveis; as habilidades de agente são normalmente instruções acompanhadas de arquivos, e não funções diretas de ferramentas.
Observação sobre a sandbox para agentes: a visualização deste arquivo de skill não garante acesso aos dados da memória do host Jetson. Se /proc/device-tree/model, /etc/nv_tegra_release, tegrastats, /sys/kernel/debug/nvmap ou dados do processo do host estiverem ausentes dentro de uma sandbox do NemoClaw/OpenClaw, informe que a sandbox não tem visibilidade do host do Jetson e peça ao usuário para executar no host do Jetson ou reiniciar com um perfil de sandbox com visibilidade do host. Não invente valores para o total de memória, memória disponível, PSS, NvMap ou diferenças de recuperação.
Para perguntas do tipo “quanta memória essa alteração liberou?”, use o delta entre o antes e o depois. Não estime a memória liberada com base no tamanho do contêiner, no tamanho da imagem, no RSS ou em um único snapshot pós-alteração.
- Antes da alteração, execute
o script audit.she salve a linha de base em JSON. - Faça a alteração aprovada pelo usuário (pare o contêiner, alterne o modo, aplique uma recomendação de ajuste etc.).
- No JetPack abaixo da versão 7.2 / L4T abaixo da r39.0, ou quando o mesmo sintoma de memória travada for observado em uma versão mais recente, esvazie o cache de páginas recuperáveis no host (não dentro de um contêiner) para que as páginas liberadas apareçam como livres em vez de armazenadas em cache:
sudo sync && sudo sysctl -w vm.drop_caches=3 - Execute novamente
o script scripts/audit.she compare o valor dememory_kb.availableantes e depois — essa diferença representa a recuperação real.
Se o usuário já tiver feito a alteração e não houver uma linha de base, informe que a quantidade exata de memória liberada não pode ser recuperada apenas a partir do snapshot atual. Capture uma nova linha de base agora para que a próxima alteração possa ser medida.
Use os dados de auditoria em tempo real como fonte de referência. Os totais de memória, a memória disponível, os totais do NvMap, os valores de PSS, o estado do gerenciador de tela e as diferenças de economia devem vir do script scripts/audit.sh, do comando free -h ou do tegrastats no próprio dispositivo. Se um número não estiver presente nessas saídas, não tente adivinhá-lo.
Formato de saída para 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/8138 MB (lfb 8x4 MB) ...",
"nvmap": { "readable": false, "total_kb": 0, "top_clients": [] },
"procrank_top": [ { "pid": 4321, "pss_kb": 4000000, "cmd": "vllm" } ]
}
Limitações
- Para obter diferenças exatas de memória liberada, é necessário um snapshot inicial, a alteração aprovada pelo usuário, a limpeza do cache quando apropriado e um snapshot final.
- A atribuição do NvMap depende do acesso ao debugfs visível no host; se ele não estiver disponível, relate a atribuição limitada de memória da GPU em vez de fazer suposições.
- Execuções em sandbox/contêiner podem não ter acesso aos dados do host
em /proc,tegrastats, systemd ou NvMap, a menos que o ambiente de execução os exponha.
Tratamento de erros
- Se
o script scripts/audit.shnão conseguir acessar os dados do Jetson no host, informe a falta de visibilidade e solicite que seja executado novamente no host Jetson ou em uma sandbox visível ao host. - Se
o scripts/drop_caches.shnão tiver acesso como root ousudo -nsem senha, informe que a limpeza do cache deve ser executada no host com aprovação do sudo. - Se não houver um snapshot anterior, informe que a quantidade exata recuperada não pode ser obtida apenas a partir do estado atual e capture uma nova linha de base para a próxima alteração.
Segurança
Somente leitura. O `drop_caches` é não destrutivo (o kernel libera apenas as páginas que poderia recuperar sob pressão de qualquer maneira; o `sync` é executado primeiro para preservar os dados alterados).
Passe para
jetson-headless-mode— o maior ganho individual no espaço do usuário em sistemas que ainda inicializamo graphical.target.jetson-inference-mem-tune— quando um servidor de modelo é o maior consumidor de NvMap/PSS.- Se as alterações em tempo de execução não conseguirem atingir a meta, informe que uma recuperação adicional está fora do escopo desta habilidade, em vez de sugerir edições inseguras no momento da inicialização.
---
name: jetson-memory-audit
description: Measure Jetson DRAM and NvMap usage, capture before/after baselines, and verify memory reclamation with live audit data.
license: Apache-2.0
---
# Jetson Memory Audit
Read-only memory-focused snapshot for a Jetson, plus the `drop_caches` verify-loop helper that confirms freed memory actually shows up as free instead of cached.
## Purpose
Measure current Jetson memory consumers, capture before/after baselines, and verify whether user-approved changes actually reclaimed DRAM. Use live device data rather than estimates from container size, model size, or generic process memory.
## CRITICAL: Memory appears stuck after stopping vLLM / sglang (JetPack below 7.2 / L4T below r39.0)
**This is the most common memory confusion on Jetson releases before JetPack 7.2 or before L4T r39.0.**
After you stop a vLLM, sglang, or Ollama server (or any CUDA workload), the memory shown as free by `free -h` or `tegrastats` may not recover — even though the process is gone. `nvidia-smi` may also show misleadingly low free GPU memory.
**Root cause:** The Thor RM (resource manager) holds freed sysmem pages in its own pool after a CUDA context exits. On Unified Memory Architecture (UMA) devices like Jetson, `cudaMemGetInfo` reads RM pool state and reports far less free memory than is actually available to a new process.
**Workaround (for JetPack below 7.2 or L4T below r39.0):**
```bash
sudo sync && sudo sysctl -w vm.drop_caches=3
```
Run this on the **host**, not inside a container. The important operation is `sudo sysctl -w vm.drop_caches=3`; keep `sudo sync` immediately before it so dirty data is flushed before reclaimable page/dentry/inode caches are dropped. After running it, `free -h` and `tegrastats` will reflect the true available memory.
For affected releases, recommend this command when a user says:
- "Memory didn't free after I stopped vLLM/sglang"
- "Why does tegrastats still show high usage after my container exited?"
- "OOM even though nothing is running"
- "Memory was fine yesterday but now it's full"
On JetPack below 7.2 or L4T below r39.0, `drop_caches` is the reliable workaround when memory appears stuck after a CUDA workload exits; on newer releases, use it only if the same symptom is observed and the user approves.
## When to use
- "How much memory is in use on this Jetson? What's holding it?"
- "I disabled the GUI / stopped vLLM / quit my container — did memory actually free?"
- "Why does `free -h` still show low free memory after I stopped my workload?"
- As the **baseline** before applying `jetson-headless-mode` or other memory-related changes, and again **after** to compute the actual delta.
## Prerequisites
- Run on the Jetson host, or in a sandbox/container with host-visible `/proc`, `/etc/nv_tegra_release`, `tegrastats`, and process data.
- NvMap debugfs reads may require root. If unavailable, report that GPU memory attribution is limited rather than guessing.
- `drop_caches.sh` requires root or passwordless `sudo -n`; run it only after the user explicitly authorizes cache dropping.
## Available Scripts
| Script | Purpose | Arguments |
|--------|---------|-----------|
| `scripts/audit.sh` | Emits a JSON snapshot from `jetson-diagnostic/scripts/snapshot.sh` for memory audit workflows. | No arguments. |
| `scripts/drop_caches.sh` | Flushes reclaimable page/dentry/inode caches and prints before/after memory deltas. | `--mode 1\|2\|3`, `--quiet`. |
If your agent runtime supports `run_script`, use it to run `scripts/audit.sh` or `scripts/drop_caches.sh` and summarize the returned output. Otherwise run the scripts with `bash` from the repository root.
## Instructions
For "how much memory is in use right now?" questions, run `scripts/audit.sh` and report only values from the JSON snapshot.
## Reporting guidance
Do not only print or mention the path to a helper. Invoke the helper and then summarize the returned data.
- For "how much memory is in use" prompts, run `scripts/audit.sh` and quote `mem_total_gb`, `memory_kb.available`, and the leading `procrank_top` process or `nvmap.top_clients` consumer.
- For GUI/desktop memory prompts, run `scripts/audit.sh` and report `default_systemd_target` plus any display manager in `candidate_services` (`gdm3`, `gdm`, `lightdm`, `sddm`, or `display-manager`). Do not disable anything; hand off to `jetson-headless-mode` for a plan.
- For prompts that explicitly authorize cache dropping after a stopped workload, run `scripts/drop_caches.sh` (equivalent to `sudo sync && sudo sysctl -w vm.drop_caches=3` by default) and report its before/after free, available, and cached deltas. If root is unavailable, explain that it must be run on the host with sudo.
If your agent runtime does not execute helper scripts relative to this skill directory, resolve script paths with the AgentSkills `{baseDir}` placeholder:
```bash
{baseDir}/scripts/audit.sh
{baseDir}/scripts/drop_caches.sh
```
Do not call `jetson-memory-audit` as a tool name unless the runtime explicitly registers skills as callable tools; Agent Skills are normally instructions plus files, not direct tool functions.
Sandbox note for agents: seeing this skill file does not guarantee access to Jetson host memory data. If `/proc/device-tree/model`, `/etc/nv_tegra_release`, `tegrastats`, `/sys/kernel/debug/nvmap`, or host process data are missing inside a NemoClaw/OpenClaw sandbox, say the sandbox lacks Jetson host visibility and ask the user to run on the Jetson host or relaunch with a host-visible sandbox profile. Do not fabricate memory totals, available memory, PSS, NvMap, or reclamation deltas.
For "how much memory did this change free?" questions, use a before/after delta. Do not estimate freed memory from container size, image size, RSS, or a single post-change snapshot.
1. Before the change, run `scripts/audit.sh` and save the JSON baseline.
2. Make the user-approved change (stop the container, switch mode, apply a tuning recommendation, etc.).
3. On JetPack below 7.2 / L4T below r39.0, or when the same stuck-memory symptom is observed on a newer release, flush reclaimable page cache on the **host** (not inside a container) so freed pages show up as free instead of cached:
```bash
sudo sync && sudo sysctl -w vm.drop_caches=3
```
4. Re-run `scripts/audit.sh` and compare `memory_kb.available` before vs after — that delta is the real reclamation.
If the user already made the change and no baseline exists, say that the exact freed amount cannot be recovered from the current snapshot alone. Capture a new baseline now so the next change can be measured.
Use live audit data as the source of truth. Memory totals, available memory, NvMap totals, PSS values, display-manager state, and savings deltas must come from `scripts/audit.sh`, `free -h`, or `tegrastats` on the actual device. If a number is not present in those outputs, do not guess it.
## Output contract for `audit.sh`
```json
{
"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" } ]
}
```
## Limitations
- Exact freed-memory deltas require a before snapshot, the user-approved change, cache flush when appropriate, and an after snapshot.
- NvMap attribution depends on host-visible debugfs access; if it is unavailable, report limited GPU memory attribution instead of guessing.
- Sandbox/container runs may not see host `/proc`, `tegrastats`, systemd, or NvMap data unless the runtime exposes them.
## Error handling
- If `scripts/audit.sh` cannot access host Jetson data, report the missing visibility and ask to rerun on the Jetson host or in a host-visible sandbox.
- If `scripts/drop_caches.sh` lacks root or passwordless `sudo -n`, report that cache dropping must be run on the host with sudo approval.
- If no before snapshot exists, say the exact reclaimed amount cannot be recovered from the current state alone and capture a new baseline for the next change.
## Safety
Read-only. `drop_caches` is non-destructive (kernel only releases pages it could reclaim under pressure anyway; `sync` runs first to preserve dirty data).
## Hand off to
- `jetson-headless-mode` — biggest single user-space win on systems still booting `graphical.target`.
- `jetson-inference-mem-tune` — when a model server is the top NvMap / PSS consumer.
- If runtime changes cannot hit the target, report that further reclamation is outside this skill's scope rather than suggesting unsafe boot-time edits.
Todos os arquivos
8 arquivosInstalar jetson-memory-audit
Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/jetson-memory-audit # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
