[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-config":3,"i-flag:ph-4x3":14,"i-flag:us-4x3":19,"i-flag:de-4x3":21,"i-flag:hk-4x3":23,"i-tabler:lifebuoy":25,"i-tabler:timeline":28,"i-tabler:apps":30,"i-tabler:package":32,"i-tabler:circle-half-2":34,"i-tabler:sun":36,"i-tabler:moon":38,"i-tabler:menu-2":40,"i-tabler:user":42,"i-tabler:notebook":44,"i-simple-icons:forgejo":46,"i-tabler:shield-lock":48,"i-tabler:tools":50,"i-tabler:calendar":52,"i-tabler:x":54,"$f3g203yqzsd278":56,"i-tabler:arrow-left":73,"i-tabler:tag":75},{"matomo":4,"booking":7,"site":9,"blog":11,"newsletter":12},{"enabled":5,"siteId":6},true,"7",{"enabled":5,"url":8},"https:\u002F\u002Fcal.com\u002Fjdbungart",{"url":10},"https:\u002F\u002Fjdneer.com",{"enabled":5},{"enabled":13},false,{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":18},0,640,480,"\u003Cpath fill=\"#0038a8\" d=\"M0 0h640v240H0z\"\u002F>\u003Cpath fill=\"#ce1126\" d=\"M0 240h640v240H0z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M415.7 240L0 480V0\"\u002F>\u003Cpath fill=\"#fcd116\" d=\"M26.7 42.4L41 55l16.6-9.2l-7.4 17.5l14 13l-19-1.6l-8.1 17.2l-4.3-18.5L14 71l16.3-10zm323.8 172.3l.4 19l18 6.3l-18 6.2l-.4 19l-11.5-15.1l-18.2 5.5l10.8-15.6l-10.8-15.6l18.2 5.5zM37.2 388.1l8 17.2l19-1.6l-13.9 13l7.4 17.5l-16.6-9.1l-14.4 12.4l3.6-18.7L14 409l18.9-2.4zm114.2-249l-6.2 6.2l3.1 47l-3 .3l-5.7-42.9l-5.1 5l7.6 38.4a48 48 0 0 0-17.2 7.1l-21.7-32.4H96l26.4 34.3l-2.4 2l-31.1-35.5h-8.8v8.8l35.4 31l-2 2.5l-34.3-26.3v7.1l32.5 21.7q-5.2 7.8-7.1 17.2L66.3 223l-5.1 5l42.9 5.7q-.3 1.6-.3 3.1l-47-3l-6.2 6.2l6.2 6.2l47-3.1l.3 3.1l-42.9 5.7l5 5l38.4-7.6a48 48 0 0 0 7.1 17.2l-32.5 21.7v7.2l34.3-26.3l2 2.4l-35.4 31v8.8H89l31-35.4l2.5 2L96 312.2h7.2l21.7-32.5q7.8 5.2 17.2 7.1l-7.6 38.4l5 5l5.7-42.9q1.5.3 3.1.3l-3 47l6.1 6.2l6.3-6.2l-3.1-47l3-.3l5.7 43l5.1-5.1l-7.6-38.4a48 48 0 0 0 17.2-7.1l21.7 32.5h7.2l-26.4-34.3l2.4-2l31.1 35.4h8.8v-8.8l-35.4-31l2-2.4l34.3 26.3v-7.2l-32.5-21.7q5.2-7.8 7.1-17.2l38.3 7.6l5.1-5l-42.9-5.7q.3-1.5.3-3.1l47 3l6.2-6.1l-6.2-6.2l-47 3l-.3-3l42.9-5.7l-5-5l-38.4 7.5a48 48 0 0 0-7.1-17.2l32.5-21.7v-7.1l-34.3 26.3l-2-2.4l35.4-31v-8.9H214l-31 35.5l-2.5-2l26.4-34.3h-7.2L178 200.2q-7.8-5.2-17.2-7.1l7.6-38.3l-5-5l-5.7 42.8l-3.1-.3l3-47z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":20},"\u003Cpath fill=\"#bd3d44\" d=\"M0 0h640v480H0\"\u002F>\u003Cpath stroke=\"#fff\" stroke-width=\"37\" d=\"M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640\"\u002F>\u003Cpath fill=\"#192f5d\" d=\"M0 0h364.8v258.5H0\"\u002F>\u003Cmarker id=\"SVGEq3dreKJ\" markerHeight=\"30\" markerWidth=\"30\">\u003Cpath fill=\"#fff\" d=\"m14 0l9 27L0 10h28L5 27z\"\u002F>\u003C\u002Fmarker>\u003Cpath fill=\"none\" marker-mid=\"url(#SVGEq3dreKJ)\" d=\"m0 0l16 11h61h61h61h61h60L47 37h61h61h60h61L16 63h61h61h61h61h60L47 89h61h61h60h61L16 115h61h61h61h61h60L47 141h61h61h60h61L16 166h61h61h61h61h60L47 192h61h61h60h61L16 218h61h61h61h61h60z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":22},"\u003Cpath fill=\"#fc0\" d=\"M0 320h640v160H0z\"\u002F>\u003Cpath fill=\"#000001\" d=\"M0 0h640v160H0z\"\u002F>\u003Cpath fill=\"red\" d=\"M0 160h640v160H0z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":24},"\u003Cpath fill=\"#ec1b2e\" d=\"M0 0h640v480H0\"\u002F>\u003Cpath id=\"SVG5tfvBPpj\" fill=\"#fff\" d=\"M346.3 103.1C267 98 230.6 201.9 305.6 240.3c-26-22.4-20.6-55.3-10.1-72.4l1.9 1.1c-13.8 23.5-11.2 52.7 11.1 71c-12.7-12.3-9.5-39 12.1-48.9s23.6-39.3 16.4-49.1q-14.7-25.6 9.3-38.9M307.9 164l-4.7 7.4l-1.8-8.6l-8.6-2.3l7.8-4.3l-.6-8.9l6.5 6.1l8.3-3.3l-3.7 8.1l5.6 6.8z\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(72 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(144 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(216 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(288 312.5 243.5)\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":27},24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0\"\u002F>\u003Cpath d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0-18 0m12 3l3.35 3.35M9 15l-3.35 3.35m0-12.7L9 9m9.35-3.35L15 9\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":29},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m4 16l6-7l5 5l5-6\"\u002F>\u003Cpath d=\"M14 14a1 1 0 1 0 2 0a1 1 0 1 0-2 0M9 9a1 1 0 1 0 2 0a1 1 0 1 0-2 0m-6 7a1 1 0 1 0 2 0a1 1 0 1 0-2 0m16-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":31},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm0 10a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm10 0a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1zm0-8h6m-3-3v6\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":33},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 3l8 4.5v9L12 21l-8-4.5v-9zm0 9l8-4.5M12 12v9m0-9L4 7.5m12-2.25l-8 4.5\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":35},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0-18 0m9-9v18m0-7l7-7m-7 12l8.5-8.5M12 9l4.5-4.5\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":37},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0m-5 0h1m8-9v1m8 8h1m-9 8v1M5.6 5.6l.7.7m12.1-.7l-.7.7m0 11.4l.7.7m-12.1-.7l-.7.7\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":39},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992z\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":41},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":43},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7a4 4 0 1 0 8 0a4 4 0 0 0-8 0M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":45},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 4h11a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1m3 0v18m4-14h2m-2 4h2\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":47},"\u003Cpath fill=\"currentColor\" d=\"M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.08 7.08 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422a2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24A2.9 2.9 0 0 1 5.8 18.57V8.589a7.11 7.11 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0M7.223 19.905a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.389m9.554-10.464a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.39m0-7.735a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.389\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":49},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 3a12 12 0 0 0 8.5 3A12 12 0 0 1 12 21A12 12 0 0 1 3.5 6A12 12 0 0 0 12 3\"\u002F>\u003Cpath d=\"M11 11a1 1 0 1 0 2 0a1 1 0 1 0-2 0m1 1v2.5\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":51},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 21h4L20 8a1.5 1.5 0 0 0-4-4L3 17zM14.5 5.5l4 4\"\u002F>\u003Cpath d=\"M12 8L7 3L3 7l5 5M7 8L5.5 9.5M16 12l5 5l-4 4l-5-5m4 1l-1.5 1.5\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":53},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm12-4v4M8 3v4m-4 4h16m-9 4h1m0 0v3\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":55},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"slug":57,"title":58,"excerpt":59,"image":60,"publishedAt":61,"topics":62,"readMinutes":63,"html":64,"metaTitle":58,"metaDescription":65,"shareImage":66,"updatedAt":69,"author":70,"related":72},"optimising-your-proxmox-cluster-with-proxlb","Optimising Your Proxmox Cluster with ProxLB - Smart and Lightweight VM\u002FCT Scheduling for Maximum Efficiency","Discover how the open-source tool ProxLB fills the gap in Proxmox VE clusters by automatically rebalancing VMs and containers based on memory, CPU or local-disk usage - with affinity\u002Fanti-affinity rules, maintenance mode and CI\u002FCD integration.","\u002Fcontent\u002Fimages\u002F2025\u002F11\u002F68747470733a2f2f63646e2e67797074617a792e636f6d2f696d672f50726f784c422e6a7067.jpg","2025-11-04T16:22:29.000+08:00",[],5,"\u003Ch2 id=\"introduction\">Introduction\u003C\u002Fh2>\n\u003Cp>In many Proxmox VE deployments, administrators routinely monitor resource usage and rely on manual workload migration to prevent node overload. However, what if you could let software take care of that scheduling and rebalancing for you? Enter \u003Cstrong>ProxLB\u003C\u002Fstrong> - an advanced, open source resource scheduler and load balancer for Proxmox clusters developed by Florian Paul Azim Hoberg (known on GitHub as “gyptazy”). (\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgyptazy\u002FProxLB\u002F?tab=readme-ov-file&amp;ref=ghost.jdneer.com\">github.com\u003C\u002Fa>)\u003C\u002Fp>\n\u003Cp>ProxLB is designed to bridge a missing capability in Proxmox VE: intelligent, continuous workload balancing across nodes based on real-time resource metrics. This makes it particularly relevant for IT operations teams, NOC engineers and infrastructure architects seeking to optimise their virtualisation farms.\u003C\u002Fp>\n\u003Cp>In this article, we’ll walk through what ProxLB does, how it works, the key features, installation and operational considerations - plus how you might leverage it in your own Proxmox environment.\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2 id=\"why-proxlb-matters\">Why ProxLB Matters\u003C\u002Fh2>\n\u003Cp>While Proxmox VE provides clustering, live migration, high availability and most of the core functionality needed for modern virtual infrastructure, it lacks a native dynamic resource scheduler akin to VMware’s DRS. ProxLB fills this gap by doing the following:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Continuously measuring node resource usage (CPU, memory, local disk) and guest usage.\u003C\u002Fli>\n\u003Cli>Calculating “balanciness” - the delta between the highest-loaded node and lowest-loaded node. If that delta exceeds a threshold, it migrates VMs\u002FCTs.\u003C\u002Fli>\n\u003Cli>Supporting affinity and anti-affinity rules (grouping or separating workloads) to meet architecture \u002F high-availability requirements.\u003C\u002Fli>\n\u003Cli>Providing a maintenance mode: designate a node for maintenance and automatically migrate its workloads off.\u003C\u002Fli>\n\u003Cli>Integrating via the Proxmox API (no SSH required), allowing CI\u002FCD pipelines (e.g., Ansible\u002FTerraform) to query the best node for a new VM\u002FCT placement.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>For organisations operating multi-node Proxmox clusters (for example: edge-distribution-access architectures, or across racks\u002Fdata-halls), this means reduced manual scheduling, better resource utilisation, lower risk of hotspots and more deterministic workload placement.\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2 id=\"key-features-capabilities\">Key Features &amp; Capabilities\u003C\u002Fh2>\n\u003Ch3 id=\"automated-balancing-by-resource-type\">Automated balancing by resource type\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Balancing of VMs\u002Fcontainers based on memory, CPU or \u003Cstrong>local disk\u003C\u002Fstrong> usage.\u003C\u002Fli>\n\u003Cli>Modes of balancing: ‘used’ resources, ‘assigned’ resources (to avoid over provisioning) or PSI (pressure metrics) if supported.\u003C\u002Fli>\n\u003Cli>One-shot (manual trigger) or daemon (scheduled interval) operation.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"affinity-anti-affinity-pinning\">Affinity \u002F Anti-Affinity &amp; Pinning\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Tag-based grouping: e.g., \u003Ccode>plb_affinity_web\u003C\u002Fcode> ensures VMs with that tag run on the same node, \u003Ccode>plb_anti_affinity_db\u003C\u002Fcode> ensures separation.\u003C\u002Fli>\n\u003Cli>Ignoring VMs: tag a VM\u002FCT with \u003Ccode>plb_ignore_&lt;tag&gt;\u003C\u002Fcode> to prevent migration.\u003C\u002Fli>\n\u003Cli>Pinning VMs\u002FCTs to specific nodes: tag \u003Ccode>plb_pin_nodename\u003C\u002Fcode>. Useful for licensing, hardware-attached devices, etc.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"maintenance-mode\">Maintenance mode\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Define \u003Ccode>maintenance_nodes\u003C\u002Fcode> in the configuration. When set, ProxLB migrates all workloads off those nodes, enabling safe updates\u002Freboots.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"cicd-and-automation-friendly\">CI\u002FCD and automation friendly\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>A CLI option returns the “best next node” for placement (\u003Ccode>--best-node\u003C\u002Fcode>), enabling integration in automation pipelines like Terraform or Ansible.\u003C\u002Fli>\n\u003Cli>Runs via Proxmox API - respects ACLs and avoids the need for SSH or root access.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"installation-flexibility-platform-support\">Installation flexibility &amp; platform support\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Supports Proxmox VE versions 7.x, 8.x, 9.x.\u003C\u002Fli>\n\u003Cli>Install via Debian-based repository (.deb), or run as container (Docker\u002FPodman).\u003C\u002Fli>\n\u003Cli>Runs on any architecture supporting Python3 (amd64, arm64, rv64).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2 id=\"how-it-worksunder-the-hood\">How It Works - Under the Hood\u003C\u002Fh2>\n\u003Cp>To appreciate how ProxLB orchestrates workload balancing, here’s a simplified breakdown:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Metric Collection\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>ProxLB queries the Proxmox API for each node in the cluster: CPU usage, memory usage, local disk usage.\u003C\u002Fli>\n\u003Cli>It also queries each VM\u002FCT running on those nodes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Balanciness Calculation\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It computes the difference between the most loaded node and least loaded node for the chosen metric.\u003C\u002Fli>\n\u003Cli>If this delta (balanciness) exceeds a configured threshold (\u003Ccode>balanciness: 10\u003C\u002Fcode>, for example) then rebalancing is triggered.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Migration Decision Matrix\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It sorts VMs\u002FCTs by highest usage (or highest assigned resources) depending on mode.\u003C\u002Fli>\n\u003Cli>It picks the guest with highest resource usage as a candidate to be moved.\u003C\u002Fli>\n\u003Cli>It selects the node with the most free resources for the selected metric.\u003C\u002Fli>\n\u003Cli>It migrates the guest (live migration if \u003Ccode>live: true\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>It repeats until balanciness is within target threshold.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Pre-checks\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Checks affinity\u002Fanti-affinity rules, ignoring VMs\u002FCTs, pinning constraints.\u003C\u002Fli>\n\u003Cli>For example, if an HA group is defined, ProxLB currently warns of possible conflicts.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Execution Modes\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>One-time run (e.g., post maintenance or manually triggered).\u003C\u002Fli>\n\u003Cli>Daemon mode (runs at interval, e.g., every 12 hours).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>This mechanism allows ProxLB to bring cluster workloads back into balance without constant manual oversight.\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch2 id=\"installation-first-run-overview\">Installation &amp; First-Run Overview\u003C\u002Fh2>\n\u003Ch3 id=\"prerequisites\">Prerequisites\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Proxmox VE cluster (7.x \u002F 8.x \u002F 9.x) with at least two nodes.\u003C\u002Fli>\n\u003Cli>Python3 available (if running from source) and Proxmox API reachable.\u003C\u002Fli>\n\u003Cli>Create a service user or use API token with appropriate privileges.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"quick-install-debian-based\">Quick Install (Debian-based)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">echo \"deb https:\u002F\u002Frepo.gyptazy.com\u002Fstable \u002F\" &gt; \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fproxlb.list  \nwget -O \u002Fetc\u002Fapt\u002Ftrusted.gpg.d\u002Fproxlb.asc https:\u002F\u002Frepo.gyptazy.com\u002Frepository.gpg  \napt-get update &amp;&amp; apt-get -y install proxlb  \ncp \u002Fetc\u002Fproxlb\u002Fproxlb_example.yaml \u002Fetc\u002Fproxlb\u002Fproxlb.yaml  \nvi \u002Fetc\u002Fproxlb\u002Fproxlb.yaml    # adjust config  \nsystemctl start proxlb  \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"container-install-dockerpodman\">Container Install (Docker\u002FPodman)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">docker pull cr.gyptazy.com\u002Fproxlb\u002Fproxlb:latest  \nwget -O proxlb.yaml https:\u002F\u002Fraw.githubusercontent.com\u002Fgyptazy\u002FProxLB\u002Fmain\u002Fconfig\u002Fproxlb_example.yaml  \nvi proxlb.yaml    # adjust config  \ndocker run -it --rm -v $(pwd)\u002Fproxlb.yaml:\u002Fetc\u002Fproxlb\u002Fproxlb.yaml proxlb  \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"basic-configuration-snippet\">Basic Configuration Snippet\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yaml\">proxmox_api:\n  hosts:\n    - node01.example.com\n    - node02.example.com\n  user: root@pam\n  token_id: proxlb\n  token_secret: 430e308f-1337-1337-beef-1337beefcafe\n  ssl_verification: true\n\nproxmox_cluster:\n  maintenance_nodes:\n    - node03.example.com\n  ignore_nodes: []\n  overprovisioning: false\n\nbalancing:\n  enable: true\n  enforce_affinity: false\n  parallel: false\n  live: true\n  with_local_disks: true\n  with_conntrack_state: true\n  balance_types: ['vm','ct']\n  memory_threshold: 75\n  balanciness: 5\n  method: memory\n  mode: used\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"validate-and-run\">Validate and Run\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Start the service and monitor logs (\u003Ccode>journalctl -u proxlb\u003C\u002Fcode>) or run in dry-run mode (\u003Ccode>proxlb --dry-run\u003C\u002Fcode>) to preview migrations.\u003C\u002Fli>\n\u003Cli>After the first run, review migration logs and confirm guests landed on optimum nodes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2 id=\"operational-considerations\">Operational Considerations\u003C\u002Fh2>\n\u003Cp>For technical directors and cluster operators:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Align with HA strategy\u003C\u002Fstrong>: ProxLB may conflict with Proxmox HA groups. Test thoroughly if you rely on HA for critical workloads.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Maintenance windows\u003C\u002Fstrong>: Use maintenance mode to drain nodes before hardware or firmware updates.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tagging strategy\u003C\u002Fstrong>: Define tags for affinity\u002Fanti-affinity early so clustering behaviour aligns with service tiers.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>CI\u002FCD integration\u003C\u002Fstrong>: Use the \u003Ccode>--best-node\u003C\u002Fcode> output in Ansible or Terraform workflows for resource-aware deployments.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Monitoring &amp; Logs\u003C\u002Fstrong>: Feed ProxLB logs into your NOC’s monitoring system to track migrations and balance changes.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Testing in staging\u003C\u002Fstrong>: Always validate behaviour using dry-run mode before enabling live migrations.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Versioning &amp; upgrades\u003C\u002Fstrong>: Keep track of releases like 1.1.0, which introduced major refactoring and bug fixes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2 id=\"pros-cons-summary\">Pros &amp; Cons Summary\u003C\u002Fh2>\n\u003Ch3 id=\"advantages\">Advantages\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Automates workload distribution based on real-time metrics, reducing hotspots and manual balancing.\u003C\u002Fli>\n\u003Cli>Supports affinity, anti-affinity, pinning, and ignore rules for fine-grained placement control.\u003C\u002Fli>\n\u003Cli>API-based design integrates cleanly with CI\u002FCD pipelines without relying on SSH.\u003C\u002Fli>\n\u003Cli>Flexible installation options available (Debian package or container) across architectures.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"considerations\">Considerations\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>May conflict with Proxmox HA groups and requires careful testing before production rollout.\u003C\u002Fli>\n\u003Cli>Complex configuration demands well-planned tagging and policy strategies.\u003C\u002Fli>\n\u003Cli>Live migrations can impact performance on workloads using local storage.\u003C\u002Fli>\n\u003Cli>Developed by Florian \"gyptazy\" Hoberg and backed by \u003Ca href=\"https:\u002F\u002Fwww.credativ.de\u002F?ref=ghost.jdneer.com\">credativ GmbH\u003C\u002Fa>, so enterprise-grade support is available.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2 id=\"use-case-example-edge-distributed-infrastructure\">Use Case Example: Edge \u002F Distributed Infrastructure\u003C\u002Fh2>\n\u003Cp>For multi-customer NOC operations, ProxLB can be integrated like this:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Operate a 5-node cluster for an edge location running Wi-Fi controllers and customer VMs.\u003C\u002Fli>\n\u003Cli>Tag VMs as ‘event-ctrl’, ‘wifi-mgmt’, and ‘customer-vm’.\u003C\u002Fli>\n\u003Cli>Set affinity for controllers and anti-affinity for critical customer VMs.\u003C\u002Fli>\n\u003Cli>Configure ProxLB to rebalance every 6 hours by memory usage, threshold 70%, balanciness 10%.\u003C\u002Fli>\n\u003Cli>Use maintenance mode to automatically drain one node nightly.\u003C\u002Fli>\n\u003Cli>Integrate \u003Ccode>proxlb --best-node --json\u003C\u002Fcode> into Ansible playbooks for optimal placement.\u003C\u002Fli>\n\u003Cli>Monitor logs to identify recurring migrations or hardware issues.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr \u002F>\n\u003Ch2 id=\"final-thoughts\">Final Thoughts\u003C\u002Fh2>\n\u003Cp>ProxLB is an open source solution that finally gives Proxmox administrators a missing link: intelligent, automated workload balancing. With a thoughtful configuration and good monitoring, it can drastically reduce manual intervention and improve resource efficiency across clusters.\u003C\u002Fp>\n\u003Cp>For organisations managing multiple Proxmox clusters, ProxLB offers both operational savings and improved reliability. Plan your tag schema, test your migration scenarios, and integrate it into your existing CI\u002FCD pipeline to unlock its full potential.\u003C\u002Fp>\n\u003Chr \u002F>\n\u003Ch3 id=\"additional-resources\">Additional Resources\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>GitHub: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgyptazy\u002FProxLB?ref=ghost.jdneer.com\">gyptazy\u002FProxLB\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Official site: \u003Ca href=\"https:\u002F\u002Fproxlb.de\u002F?ref=ghost.jdneer.com\">proxlb.de\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Community discussion: \u003Ca href=\"https:\u002F\u002Fwww.reddit.com\u002Fr\u002FProxmox\u002Fcomments\u002F1k1kpuc\u002Fhas_anyone_tried_proxlb_for_proxmox_load_balancing\u002F?ref=ghost.jdneer.com\">Reddit - ProxLB for Proxmox Load Balancing\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>","Discover how the open-source tool ProxLB fills the gap in Proxmox VE clusters by automatically rebalancing VMs and containers based on memory, CPU or...",{"src":60,"height":67,"width":67,"type":68},1024,"image\u002Fjpeg","2025-11-04T17:24:32.000+08:00",{"name":71,"url":10,"owner":5},"JD Bungart",[],{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":74},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14M5 12l6 6m-6-6l6-6\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":76},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0\"\u002F>\u003Cpath d=\"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592-5.592a2.41 2.41 0 0 0 0-3.408l-7.71-7.71A2 2 0 0 0 11.172 3H6a3 3 0 0 0-3 3\"\u002F>\u003C\u002Fg>"]