вариант
ДомДом Skill Безопасность jetson-memory-audit

jetson-memory-audit

NVIDIA/skills NVIDIA/skills

Измерьте использование DRAM в Jetson и NvMap, зафиксируйте исходные показатели «до» и «после» и проверьте эффективность освобождения памяти с помощью данных аудита в режиме реального времени.

...Расширить все
15
Обновлено время 24 сентября 2026 г.

Аудит памяти Jetson

Снимок, ориентированный на память только для чтения (ROM) для Jetson, а также вспомогательная программа drop_caches verify-loop, которая проверяет, что освобожденная память действительно отображается как свободная, а не как кэшированная.

Цель

Измерить текущие потребители памяти Jetson, зафиксировать исходные значения до и после, а также проверить, действительно ли утвержденные пользователем изменения освободили память DRAM. Использовать данные с устройства в режиме реального времени, а не оценки, основанные на размере контейнера, размере модели или общей памяти процесса.

КРИТИЧЕСКОЕ: Память кажется «зависшей» после остановки vLLM / sglang (JetPack ниже версии 7.2 / L4T ниже версии r39.0)

Это наиболее распространённая проблема с памятью в выпусках Jetson до JetPack 7.2 или до L4T r39.0.

После остановки сервера vLLM, sglang или Ollama (или любой рабочей нагрузки CUDA) память, отображаемая как свободная с помощью команд free -h или tegrastats, может не освободиться — даже если процесс уже завершен. Команда nvidia-smi также может показывать вводящие в заблуждение низкие значения свободной памяти GPU.

Основная причина: диспетчер ресурсов (RM) Thor удерживает освобождённые страницы системной памяти (sysmem) в своём собственном пуле после завершения контекста CUDA. На устройствах с архитектурой унифицированной памяти (UMA), таких как Jetson, функция `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 непосредственно перед ней, чтобы грязные данные были очищены до того, как будут сброшены кэши страниц, dentry и inode, подлежащие освобождению. После выполнения этой команды команды free -h и tegrastats будут отображать реальный объем доступной памяти.

Для затронутых версий рекомендуется использовать эту команду, если пользователь сообщает:

  • «Память не освободилась после остановки vLLM/sglang»
  • «Почему tegrastats по-прежнему показывает высокую загрузку после завершения работы моего контейнера?»
  • «OOM, хотя ничего не запущено»
  • «Вчера с памятью всё было в порядке, а сейчас она заполнена»

В JetPack версий ниже 7.2 или L4T ниже r39.0 команда drop_caches является надёжным обходным решением, когда память, похоже, застряла после завершения CUDA-нагрузки; в более новых версиях используйте её только в том случае, если наблюдается тот же симптом и пользователь даёт на это согласие.

Когда использовать

  • «Сколько памяти используется на этом Jetson? Что её занимает?»
  • «Я отключил графический интерфейс / остановил 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 Генерирует снимок в формате JSON из скрипта jetson-diagnostic/scripts/snapshot.sh для рабочих процессов аудита памяти. Аргументов нет.
scripts/drop_caches.sh Очищает кэши страниц/dentry/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.
  • Для запросов о памяти в графическом интерфейсе или на рабочем столе запустите скрипт 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 ) и сообщите о разнице значений free, available и cached до и после выполнения. Если права root недоступны, объясните, что скрипт необходимо запустить на хосте с помощью sudo.

Если среда выполнения вашего агента не запускает вспомогательные скрипты, расположенные в каталоге данного навыка, укажите пути к скриптам с помощью заполнителя AgentSkills {baseDir}:

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

Не используйте jetson-memory-audit в качестве имени инструмента, если среда выполнения явно не регистрирует навыки как вызываемые инструменты; навыки агента обычно представляют собой инструкции и файлы, а не прямые функции инструментов.

Примечание по песочнице для агентов: наличие этого файла навыка не гарантирует доступ к данным памяти хоста Jetson. Если в песочнице NemoClaw/OpenClaw отсутствуют /proc/device-tree/model, /etc/nv_tegra_release, tegrastats, /sys/kernel/debug/nvmap или данные процессов хоста отсутствуют внутри песочницы NemoClaw/OpenClaw, сообщите, что песочнице не доступен хост 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.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/8138 МБ (lfb 8x4 МБ) ...",
  "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.
  • Если изменения во время выполнения не позволяют достичь целевого значения, следует сообщить, что дальнейшее освобождение памяти выходит за рамки возможностей данного навыка, а не предлагать небезопасные изменения на этапе загрузки.
Посмотреть на GitHub
---
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.

Установить jetson-memory-audit

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/NVIDIA/skills/tree/main/skills/jetson-memory-audit # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ Claude автоматически обнаружит и запустит этот скилл
Репозиторий NVIDIA/skills

Похожие навыки

gmgn-portfolio
Обновлено время 1 июля 2026 г.
device-integrity
Обновлено время 29 июня 2026 г.
zeroize-audit
Обновлено время 1 июля 2026 г.
flutter-use-http-package
Обновлено время 30 июня 2026 г.
OR