Files

2358 lines
41 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Single source of truth for the homelab">
<link rel="canonical" href="http://192.168.1.8:13080/infra/proxmox-memory-audit/">
<link rel="prev" href="../connection-hosts/">
<link rel="next" href="../../services/homelab-architecture/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Memory audit - nuclide.systems docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#proxmox-memory-audit" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="nuclide.systems docs" class="md-header__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
nuclide.systems docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Memory audit
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_1">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../CHANGELOG/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../RESUME/" class="md-tabs__link">
Resume
</a>
</li>
<li class="md-tabs__item">
<a href="../../ct-inventory/" class="md-tabs__link">
CT inventory
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item">
<a href="../../services/homelab-architecture/" class="md-tabs__link">
Services
</a>
</li>
<li class="md-tabs__item">
<a href="../../security/data-leak-audit-comparison/" class="md-tabs__link">
Security & audits
</a>
</li>
<li class="md-tabs__item">
<a href="../../ideas/stack-ideas/" class="md-tabs__link">
Ideas
</a>
</li>
<li class="md-tabs__item">
<a href="../../history/traefik-migration/" class="md-tabs__link">
History
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="nuclide.systems docs" class="md-nav__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
nuclide.systems docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../CHANGELOG/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../RESUME/" class="md-nav__link">
<span class="md-ellipsis">
Resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ct-inventory/" class="md-nav__link">
<span class="md-ellipsis">
CT inventory
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../portmap/" class="md-nav__link">
<span class="md-ellipsis">
Port map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Memory audit
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Memory audit
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#host-physical-resources" class="md-nav__link">
<span class="md-ellipsis">
Host physical resources
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ct-memory-allocations" class="md-nav__link">
<span class="md-ellipsis">
CT memory allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#key-findings" class="md-nav__link">
<span class="md-ellipsis">
Key findings
</span>
</a>
<nav class="md-nav" aria-label="Key findings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#overprovisioning-is-safe-until-it-isnt" class="md-nav__link">
<span class="md-ellipsis">
Overprovisioning is safe — until it isn't
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-40g-docker-container-limit-destabilised-the-system" class="md-nav__link">
<span class="md-ellipsis">
Why 40G Docker container limit destabilised the system
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comfyui-xpu-memory-accounting-gap" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI XPU memory accounting gap
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#container-limit-recommendation-for-comfyui-ct-104" class="md-nav__link">
<span class="md-ellipsis">
Container limit recommendation for ComfyUI (CT 104)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#recommendations" class="md-nav__link">
<span class="md-ellipsis">
Recommendations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comfyui-memory-optimisation-log" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI memory optimisation log
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../services/homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/backrest/" class="md-nav__link">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/zoraxy/" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/llm-benchmark/" class="md-nav__link">
<span class="md-ellipsis">
LLM benchmark
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Security & audits
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Security & audits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-20-tr004-cloud-sandbox/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/data-leak-audit-2026-05-21-tr004-artifacts/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-21 · artifacts (clean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/audit-claude-code-meta/" class="md-nav__link">
<span class="md-ellipsis">
Self-audit (Claude Code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../security/transcripts/audit-chat-2026-05-21/" class="md-nav__link">
<span class="md-ellipsis">
Transcript (audit session)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Ideas
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Ideas
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ideas/stack-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Stack ideas
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
History
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
History
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../history/traefik-migration/" class="md-nav__link">
<span class="md-ellipsis">
Traefik (abandoned 2026-05-16)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/traefik-migration-docker-labels/" class="md-nav__link">
<span class="md-ellipsis">
Traefik labels (abandoned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/mcp-gateway-requirements/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway requirements (superseded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/scrubbing-list-2026-05-17/" class="md-nav__link">
<span class="md-ellipsis">
Scrubbing list (2026-05-17)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/case-study/" class="md-nav__link">
<span class="md-ellipsis">
Case study
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#host-physical-resources" class="md-nav__link">
<span class="md-ellipsis">
Host physical resources
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ct-memory-allocations" class="md-nav__link">
<span class="md-ellipsis">
CT memory allocations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#key-findings" class="md-nav__link">
<span class="md-ellipsis">
Key findings
</span>
</a>
<nav class="md-nav" aria-label="Key findings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#overprovisioning-is-safe-until-it-isnt" class="md-nav__link">
<span class="md-ellipsis">
Overprovisioning is safe — until it isn't
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-40g-docker-container-limit-destabilised-the-system" class="md-nav__link">
<span class="md-ellipsis">
Why 40G Docker container limit destabilised the system
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comfyui-xpu-memory-accounting-gap" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI XPU memory accounting gap
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#container-limit-recommendation-for-comfyui-ct-104" class="md-nav__link">
<span class="md-ellipsis">
Container limit recommendation for ComfyUI (CT 104)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#recommendations" class="md-nav__link">
<span class="md-ellipsis">
Recommendations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comfyui-memory-optimisation-log" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI memory optimisation log
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="proxmox-memory-audit">Proxmox Memory Audit<a class="headerlink" href="#proxmox-memory-audit" title="Permanent link">&para;</a></h1>
<p>Last audited: 2026-05-22</p>
<h2 id="host-physical-resources">Host physical resources<a class="headerlink" href="#host-physical-resources" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Resource</th>
<th>Total</th>
<th>Used (idle)</th>
<th>Available</th>
</tr>
</thead>
<tbody>
<tr>
<td>RAM</td>
<td>62 GiB</td>
<td>~33 GiB</td>
<td>~28 GiB</td>
</tr>
<tr>
<td>Swap</td>
<td>31 GiB</td>
<td>0 GiB</td>
<td>31 GiB</td>
</tr>
</tbody>
</table>
<h2 id="ct-memory-allocations">CT memory allocations<a class="headerlink" href="#ct-memory-allocations" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>CT</th>
<th>Name</th>
<th>Allocated (MiB)</th>
<th>Swap (MiB)</th>
<th>Typical use</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>101</td>
<td>shepard</td>
<td>32,768</td>
<td>8,192</td>
<td>~4 GB</td>
<td>Heavy stack: Mongo, Neo4j, TimescaleDB, Keycloak</td>
</tr>
<tr>
<td>102</td>
<td>dns</td>
<td>1,024</td>
<td>512</td>
<td>~100 MB</td>
<td>AdGuard Home</td>
</tr>
<tr>
<td>103</td>
<td>backrest</td>
<td><strong>4,096</strong></td>
<td><strong>1,024</strong></td>
<td>~200 MB</td>
<td>Restic scheduler — bumped 2026-05-23 for 822 GB initial backup OOM fix</td>
</tr>
<tr>
<td>104</td>
<td>docker</td>
<td><strong>49,152</strong></td>
<td>32,000</td>
<td><strong>622 GB</strong></td>
<td>Main Docker host; FLUX spikes to ~22 GB</td>
</tr>
<tr>
<td>105</td>
<td>nextcloud</td>
<td>8,196</td>
<td>8,196</td>
<td>~2 GB</td>
<td>Nextcloud AIO</td>
</tr>
<tr>
<td>108</td>
<td>zoraxy</td>
<td>2,048</td>
<td>512</td>
<td>~300 MB</td>
<td>Reverse proxy</td>
</tr>
<tr>
<td>109</td>
<td>ops</td>
<td>4,096</td>
<td>0</td>
<td>~1.5 GB</td>
<td>Prometheus + Grafana + Loki + Arcane + Dozzle + Homarr</td>
</tr>
<tr>
<td>110</td>
<td>id</td>
<td>1,024</td>
<td>512</td>
<td>~200 MB</td>
<td>Pocket-ID</td>
</tr>
<tr>
<td>111</td>
<td>dev</td>
<td>32,768</td>
<td>8,192</td>
<td>~3 GB</td>
<td>Coder + Gitea workspaces</td>
</tr>
<tr>
<td>112</td>
<td>secrets</td>
<td>4,096</td>
<td>512</td>
<td>~600 MB</td>
<td>Infisical</td>
</tr>
<tr>
<td>113</td>
<td>db</td>
<td>4,096</td>
<td>0</td>
<td>~800 MB</td>
<td>Postgres 17 + WAL-G</td>
</tr>
<tr>
<td><strong>Sum</strong></td>
<td></td>
<td><strong>141,316 MiB (138 GiB)</strong></td>
<td></td>
<td></td>
<td><strong>2.2× overprovisioned vs physical RAM</strong></td>
</tr>
</tbody>
</table>
<h2 id="key-findings">Key findings<a class="headerlink" href="#key-findings" title="Permanent link">&para;</a></h2>
<h3 id="overprovisioning-is-safe-until-it-isnt">Overprovisioning is safe — until it isn't<a class="headerlink" href="#overprovisioning-is-safe-until-it-isnt" title="Permanent link">&para;</a></h3>
<p>Proxmox uses balloon drivers so CTs only consume what they actually use. At idle the host sits at ~33 GB used with 28 GB available. This is healthy. However, two specific CTs represent risk:</p>
<ul>
<li><strong>CT 104</strong> (49 GiB limit) + <strong>CT 111</strong> (32 GiB limit) together could claim 81 GiB — well over the 62 GiB physical. If both hit peak simultaneously the host would start swapping heavily.</li>
<li>CT 104's ComfyUI (FLUX generation) spikes from 6 GB baseline to ~22 GB. That 16 GB spike on top of the 33 GB idle baseline = 49 GB total, within physical RAM but tight.</li>
</ul>
<h3 id="why-40g-docker-container-limit-destabilised-the-system">Why 40G Docker container limit destabilised the system<a class="headerlink" href="#why-40g-docker-container-limit-destabilised-the-system" title="Permanent link">&para;</a></h3>
<p>Setting ComfyUI's container limit to 40 G was the trigger. At generation time:
- FLUX model + activations: ~22 GB in the container
- Other ~65 Docker containers on CT 104: ~7 GB<br />
- CT 104 OS + kernel: ~1 GB
- Other CTs idle: ~26 GB<br />
- <strong>Total: ~56 GB</strong> → host started swapping, degrading all services</p>
<h3 id="comfyui-xpu-memory-accounting-gap">ComfyUI XPU memory accounting gap<a class="headerlink" href="#comfyui-xpu-memory-accounting-gap" title="Permanent link">&para;</a></h3>
<p>ComfyUI's <code>get_free_memory()</code> for Intel XPU queries <code>torch.xpu.get_device_properties().total_memory</code> = <strong>58 GB</strong> (the full shared memory pool — Arc shares system RAM). It has no awareness of the Docker cgroup limit. Smart memory management (<code>free_memory()</code>) calculates <code>memory_required - get_free_memory()</code> which is always hugely negative → never evicts models. This makes <code>--disable-smart-memory</code> irrelevant for XPU; smart memory is already broken.</p>
<p>Consequence: ComfyUI will always try to load the full model into XPU memory regardless of container limit. The cgroup OOM killer is the only backstop.</p>
<h3 id="container-limit-recommendation-for-comfyui-ct-104">Container limit recommendation for ComfyUI (CT 104)<a class="headerlink" href="#container-limit-recommendation-for-comfyui-ct-104" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Limit</th>
<th>Safe?</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--lowvram</code> (original)</td>
<td>20 G</td>
<td>✅ Safe but slow (231 s/image)</td>
</tr>
<tr>
<td>No <code>--lowvram</code>, FLUX only</td>
<td><strong>24 G</strong></td>
<td>✅ Fits FLUX peak (~22 GB) + 2 GB headroom</td>
</tr>
<tr>
<td>No <code>--lowvram</code> + img2img after FLUX</td>
<td>26 G</td>
<td>✅ FLUX stays resident, SD1.5 loads on top</td>
</tr>
<tr>
<td>28 G</td>
<td>⚠️</td>
<td>Marginal — OOM triggered in testing</td>
</tr>
<tr>
<td>40 G</td>
<td></td>
<td>Destabilises host when generating</td>
</tr>
</tbody>
</table>
<p>Peak host usage at 24 G container limit during FLUX generation: <code>24 + 7 (other containers) + 26 (other CTs idle) ≈ 57 GB</code> — stays under 62 GB physical.</p>
<h2 id="recommendations">Recommendations<a class="headerlink" href="#recommendations" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>ComfyUI container limit</strong>: set to <strong>24 G</strong> when running without <code>--lowvram</code>. Current revert to 20 G + <code>--lowvram</code> is stable but slower.</li>
<li><strong>CT 104 LXC allocation (49 GiB)</strong>: appropriately sized given Docker workload, but is by far the largest single consumer. Do not raise further without measuring host impact.</li>
<li><strong>CT 111 (dev, 32 GiB)</strong>: Coder workspaces could spike if users run heavy jobs. Consider adding a per-workspace memory limit in the Coder template.</li>
<li><strong>Watch list</strong>: CT 101 (Shepard, 32 GiB) + CT 104 simultaneously at peak = 54 GB → host would need to swap. Unlikely in practice but possible during CI runs on CT 111 + FLUX generation on CT 104.</li>
<li>~~<strong>Long-term</strong>: when CT 109 (ops) is built, run Prometheus <code>node_exporter</code> on the PVE host and alert when host available RAM drops below 8 GiB.~~ Done 2026-05-23 — CT 109 live, node_exporter scraping PVE host via pve-exporter.</li>
</ol>
<h2 id="comfyui-memory-optimisation-log">ComfyUI memory optimisation log<a class="headerlink" href="#comfyui-memory-optimisation-log" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Date</th>
<th>Change</th>
<th>Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td>2026-05-22</td>
<td>Removed <code>--lowvram</code> + raised limit to 28 G</td>
<td>OOM at 28 G (XPU DRM buffers counted against cgroup)</td>
</tr>
<tr>
<td>2026-05-22</td>
<td>Raised limit to 40 G</td>
<td>Host destabilised — reverted</td>
</tr>
<tr>
<td>2026-05-22</td>
<td>Reverted to <code>--lowvram</code> + 20 G</td>
<td>Stable, slow (231 s/image)</td>
</tr>
<tr>
<td>2026-05-22</td>
<td>Downloaded <code>t5-v1_1-xxl-encoder-Q4_K_S.gguf</code> (2.6 GB vs 3.2 GB Q5_K_M)</td>
<td>Saves 600 MB at load time</td>
</tr>
<tr>
<td>2026-05-22</td>
<td>Kept Q5_K_M T5 (Q4_K_S degrades prompt following per city96); removed <code>--lowvram</code>; set limit to 24 G; added <code>--async-offload --force-fp16</code></td>
<td>~730 s generation, safe within host memory budget</td>
</tr>
<tr>
<td>2026-05-22</td>
<td>Removed <code>--async-offload</code></td>
<td>Flag incompatible with GGUF img2img on XPU — caused full CPU fallback (3.5 min/step) and pure-noise output. Removed; XPU generation now correct at ~7 s/step for txt2img. Current CLI: <code>--listen 0.0.0.0 --enable-cors-header --use-pytorch-cross-attention --disable-smart-memory --force-fp16</code></td>
</tr>
</tbody>
</table>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>