@wenathlan/saddle 1.8.18 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +1346 -0
- package/README.md +33 -12
- package/alternatives.ts +1218 -0
- package/biome.json +153 -0
- package/boards.json +1517 -0
- package/compute.ts +3144 -0
- package/cores.json +1801 -0
- package/dist/acquisition.d.ts +359 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +629 -0
- package/dist/acquisition.js.map +1 -0
- package/dist/alternatives.d.ts +509 -0
- package/dist/alternatives.d.ts.map +1 -0
- package/dist/alternatives.js +951 -0
- package/dist/alternatives.js.map +1 -0
- package/dist/automation.d.ts +426 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +561 -0
- package/dist/automation.js.map +1 -0
- package/dist/browser.d.ts +562 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +1057 -0
- package/dist/browser.js.map +1 -0
- package/dist/capacitor.config.d.ts +13 -0
- package/dist/capacitor.config.d.ts.map +1 -0
- package/dist/capacitor.config.js +26 -0
- package/dist/capacitor.config.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/communication.d.ts +192 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +418 -0
- package/dist/communication.js.map +1 -0
- package/dist/compute.d.ts +1161 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +2273 -0
- package/dist/compute.js.map +1 -0
- package/dist/distribution.d.ts +529 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +811 -0
- package/dist/distribution.js.map +1 -0
- package/dist/execution.d.ts +530 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +761 -0
- package/dist/execution.js.map +1 -0
- package/dist/format.d.ts +19 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +60 -0
- package/dist/format.js.map +1 -0
- package/dist/foundation.d.ts +176 -0
- package/dist/foundation.d.ts.map +1 -0
- package/dist/foundation.js +309 -0
- package/dist/foundation.js.map +1 -0
- package/dist/index.d.ts +733 -123
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1018 -123
- package/dist/index.js.map +1 -1
- package/dist/integration.d.ts +236 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +236 -0
- package/dist/integration.js.map +1 -0
- package/dist/intelligence.d.ts +94 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +145 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/{isolation/contracts.d.ts → isolation.d.ts} +12 -1
- package/dist/isolation.d.ts.map +1 -0
- package/dist/{isolation/contracts.js → isolation.js} +13 -1
- package/dist/isolation.js.map +1 -0
- package/dist/media.d.ts +344 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +986 -0
- package/dist/media.js.map +1 -0
- package/dist/modes.d.ts +359 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +134 -0
- package/dist/modes.js.map +1 -0
- package/dist/{library/public.d.ts → operations.d.ts} +15 -1
- package/dist/operations.d.ts.map +1 -0
- package/dist/{library/public.js → operations.js} +18 -7
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator.d.ts +1339 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +4308 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/packager/targetcli.js +4 -22
- package/dist/performance.d.ts +416 -0
- package/dist/performance.d.ts.map +1 -0
- package/dist/performance.js +827 -0
- package/dist/performance.js.map +1 -0
- package/dist/quantum.d.ts +810 -0
- package/dist/quantum.d.ts.map +1 -0
- package/dist/quantum.js +2073 -0
- package/dist/quantum.js.map +1 -0
- package/dist/render.d.ts +381 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1073 -0
- package/dist/render.js.map +1 -0
- package/dist/scheduler.d.ts +596 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +1259 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/security.d.ts +501 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +1170 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/{server/node.js → server.js} +16 -2
- package/dist/server.js.map +1 -0
- package/dist/tiers.d.ts +1002 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +2165 -0
- package/dist/tiers.js.map +1 -0
- package/dist/virtual.d.ts +641 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +1285 -0
- package/dist/virtual.js.map +1 -0
- package/dist/virtualcpu.d.ts +316 -0
- package/dist/virtualcpu.d.ts.map +1 -0
- package/dist/virtualcpu.js +1180 -0
- package/dist/virtualcpu.js.map +1 -0
- package/dist/virtualgpu.d.ts +345 -0
- package/dist/virtualgpu.d.ts.map +1 -0
- package/dist/virtualgpu.js +1000 -0
- package/dist/virtualgpu.js.map +1 -0
- package/dist/virtualization.d.ts +607 -0
- package/dist/virtualization.d.ts.map +1 -0
- package/dist/virtualization.js +1187 -0
- package/dist/virtualization.js.map +1 -0
- package/dist/virtualmemory.d.ts +818 -0
- package/dist/virtualmemory.d.ts.map +1 -0
- package/dist/virtualmemory.js +1796 -0
- package/dist/virtualmemory.js.map +1 -0
- package/dist/webscrape.d.ts +720 -0
- package/dist/webscrape.d.ts.map +1 -0
- package/dist/webscrape.js +2697 -0
- package/dist/webscrape.js.map +1 -0
- package/docker.config +769 -0
- package/docs/CONVERSA.txt +1523 -0
- package/docs/alternatives.md +499 -0
- package/docs/architecture-1.8.19.md +76 -0
- package/docs/architecture-1.8.19.mmd +33 -0
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/architecture.md +355 -0
- package/docs/brancharchive-2026-08-18.md +18 -0
- package/docs/browser.md +7 -0
- package/docs/consolidation.md +70 -0
- package/docs/e2ugh-engine.md +528 -0
- package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
- package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
- package/docs/hardware.md +342 -0
- package/docs/optimization.md +126 -0
- package/docs/performance.md +499 -0
- package/docs/planning.1.8.18.md +94 -0
- package/docs/planning.1.8.19.md +49 -0
- package/docs/releasenotes-1.8.19.md +35 -0
- package/docs/research-1.8.19-virtual-browser.md +27 -0
- package/docs/security.md +454 -0
- package/docs/todo-1.8.18.md +12 -0
- package/docs/todo-1.8.19.md +241 -0
- package/docs/viability.md +777 -0
- package/docs/virtualization.md +335 -0
- package/docs/web-duplicatecleanup.md +9 -0
- package/docs/web-ideas.md +106 -0
- package/docs/workflowimprovements-2026-08-19.md +70 -0
- package/gpumonitor.cpp +1543 -0
- package/gpus.json +2408 -0
- package/index.ts +1478 -0
- package/media.ts +1337 -0
- package/mttg.config +1549 -0
- package/orchestrator.ts +5462 -0
- package/package.json +304 -56
- package/passage.config +1331 -0
- package/performance.ts +1049 -0
- package/processors.json +2217 -0
- package/qemu.config +1062 -0
- package/qemubridge.py +1340 -0
- package/quantum.ts +2393 -0
- package/render.ts +1325 -0
- package/scheduler.ts +1600 -0
- package/security.ts +1449 -0
- package/tiers.ts +2871 -0
- package/tsconfig.json +29 -0
- package/virtualcpu.ts +1273 -0
- package/virtualgpu.ts +1181 -0
- package/virtualhardware.c +1011 -0
- package/virtualhardware.json +739 -0
- package/virtualization.ts +1628 -0
- package/virtualizationcore.cpp +4635 -0
- package/virtualmemory.ts +2303 -0
- package/vm.config.json +1910 -0
- package/{extension → web/extension}/manifest.json +1 -1
- package/web/readme.md +382 -0
- package/web/tsconfig.json +25 -0
- package/dist/adapters/forge.d.ts +0 -17
- package/dist/adapters/forge.d.ts.map +0 -1
- package/dist/adapters/forge.js +0 -19
- package/dist/adapters/forge.js.map +0 -1
- package/dist/adapters/forgejo.d.ts +0 -49
- package/dist/adapters/forgejo.d.ts.map +0 -1
- package/dist/adapters/forgejo.js +0 -8
- package/dist/adapters/forgejo.js.map +0 -1
- package/dist/adapters/github.d.ts +0 -12
- package/dist/adapters/github.d.ts.map +0 -1
- package/dist/adapters/github.js +0 -20
- package/dist/adapters/github.js.map +0 -1
- package/dist/adapters/gitlab.d.ts +0 -17
- package/dist/adapters/gitlab.d.ts.map +0 -1
- package/dist/adapters/gitlab.js +0 -10
- package/dist/adapters/gitlab.js.map +0 -1
- package/dist/adapters/huggingface.d.ts +0 -17
- package/dist/adapters/huggingface.d.ts.map +0 -1
- package/dist/adapters/huggingface.js +0 -6
- package/dist/adapters/huggingface.js.map +0 -1
- package/dist/adapters/socket.d.ts +0 -11
- package/dist/adapters/socket.d.ts.map +0 -1
- package/dist/adapters/socket.js +0 -17
- package/dist/adapters/socket.js.map +0 -1
- package/dist/adapters/transport.d.ts +0 -7
- package/dist/adapters/transport.d.ts.map +0 -1
- package/dist/adapters/transport.js +0 -36
- package/dist/adapters/transport.js.map +0 -1
- package/dist/ai/chunk.d.ts +0 -2
- package/dist/ai/chunk.d.ts.map +0 -1
- package/dist/ai/chunk.js +0 -36
- package/dist/ai/chunk.js.map +0 -1
- package/dist/ai/llmstxt.d.ts +0 -6
- package/dist/ai/llmstxt.d.ts.map +0 -1
- package/dist/ai/llmstxt.js +0 -12
- package/dist/ai/llmstxt.js.map +0 -1
- package/dist/ai/provenance.d.ts +0 -22
- package/dist/ai/provenance.d.ts.map +0 -1
- package/dist/ai/provenance.js +0 -25
- package/dist/ai/provenance.js.map +0 -1
- package/dist/ai/rag.d.ts +0 -26
- package/dist/ai/rag.d.ts.map +0 -1
- package/dist/ai/rag.js +0 -22
- package/dist/ai/rag.js.map +0 -1
- package/dist/ai/tokens.d.ts +0 -15
- package/dist/ai/tokens.d.ts.map +0 -1
- package/dist/ai/tokens.js +0 -9
- package/dist/ai/tokens.js.map +0 -1
- package/dist/api/auth.d.ts +0 -16
- package/dist/api/auth.d.ts.map +0 -1
- package/dist/api/auth.js +0 -19
- package/dist/api/auth.js.map +0 -1
- package/dist/api/contracts.d.ts +0 -28
- package/dist/api/contracts.d.ts.map +0 -1
- package/dist/api/contracts.js +0 -14
- package/dist/api/contracts.js.map +0 -1
- package/dist/api/control.d.ts +0 -10
- package/dist/api/control.d.ts.map +0 -1
- package/dist/api/control.js +0 -35
- package/dist/api/control.js.map +0 -1
- package/dist/api/http.d.ts +0 -7
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/api/http.js.map +0 -1
- package/dist/api/rate.d.ts +0 -28
- package/dist/api/rate.d.ts.map +0 -1
- package/dist/api/rate.js +0 -36
- package/dist/api/rate.js.map +0 -1
- package/dist/api/security.d.ts +0 -12
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -56
- package/dist/api/security.js.map +0 -1
- package/dist/api/service.d.ts +0 -5
- package/dist/api/service.d.ts.map +0 -1
- package/dist/api/service.js +0 -70
- package/dist/api/service.js.map +0 -1
- package/dist/apps/registry.d.ts +0 -33
- package/dist/apps/registry.d.ts.map +0 -1
- package/dist/apps/registry.js +0 -24
- package/dist/apps/registry.js.map +0 -1
- package/dist/binary/archive.d.ts +0 -27
- package/dist/binary/archive.d.ts.map +0 -1
- package/dist/binary/archive.js +0 -46
- package/dist/binary/archive.js.map +0 -1
- package/dist/binary/build.d.ts +0 -29
- package/dist/binary/build.d.ts.map +0 -1
- package/dist/binary/build.js +0 -17
- package/dist/binary/build.js.map +0 -1
- package/dist/binary/transform.d.ts +0 -70
- package/dist/binary/transform.d.ts.map +0 -1
- package/dist/binary/transform.js +0 -105
- package/dist/binary/transform.js.map +0 -1
- package/dist/bot/adapter.d.ts +0 -5
- package/dist/bot/adapter.d.ts.map +0 -1
- package/dist/bot/adapter.js +0 -11
- package/dist/bot/adapter.js.map +0 -1
- package/dist/bot/bot.d.ts +0 -28
- package/dist/bot/bot.d.ts.map +0 -1
- package/dist/bot/bot.js +0 -52
- package/dist/bot/bot.js.map +0 -1
- package/dist/bot/commands.d.ts +0 -8
- package/dist/bot/commands.d.ts.map +0 -1
- package/dist/bot/commands.js +0 -19
- package/dist/bot/commands.js.map +0 -1
- package/dist/bot/permissions.d.ts +0 -13
- package/dist/bot/permissions.d.ts.map +0 -1
- package/dist/bot/permissions.js +0 -16
- package/dist/bot/permissions.js.map +0 -1
- package/dist/browser/actions.d.ts +0 -33
- package/dist/browser/actions.d.ts.map +0 -1
- package/dist/browser/actions.js +0 -44
- package/dist/browser/actions.js.map +0 -1
- package/dist/browser/agent.d.ts +0 -21
- package/dist/browser/agent.d.ts.map +0 -1
- package/dist/browser/agent.js +0 -13
- package/dist/browser/agent.js.map +0 -1
- package/dist/browser/context.d.ts +0 -43
- package/dist/browser/context.d.ts.map +0 -1
- package/dist/browser/context.js +0 -54
- package/dist/browser/context.js.map +0 -1
- package/dist/browser/fingerprint.d.ts +0 -4
- package/dist/browser/fingerprint.d.ts.map +0 -1
- package/dist/browser/fingerprint.js +0 -12
- package/dist/browser/fingerprint.js.map +0 -1
- package/dist/browser/index.d.ts +0 -11
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -11
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/playwright.d.ts +0 -11
- package/dist/browser/playwright.d.ts.map +0 -1
- package/dist/browser/playwright.js +0 -24
- package/dist/browser/playwright.js.map +0 -1
- package/dist/browser/recorder.d.ts +0 -21
- package/dist/browser/recorder.d.ts.map +0 -1
- package/dist/browser/recorder.js +0 -58
- package/dist/browser/recorder.js.map +0 -1
- package/dist/browser/session.d.ts +0 -14
- package/dist/browser/session.d.ts.map +0 -1
- package/dist/browser/session.js +0 -21
- package/dist/browser/session.js.map +0 -1
- package/dist/browser/snapshot.d.ts +0 -69
- package/dist/browser/snapshot.d.ts.map +0 -1
- package/dist/browser/snapshot.js +0 -133
- package/dist/browser/snapshot.js.map +0 -1
- package/dist/captcha/contract.d.ts +0 -35
- package/dist/captcha/contract.d.ts.map +0 -1
- package/dist/captcha/contract.js +0 -17
- package/dist/captcha/contract.js.map +0 -1
- package/dist/captcha/evidence.d.ts +0 -10
- package/dist/captcha/evidence.d.ts.map +0 -1
- package/dist/captcha/evidence.js +0 -9
- package/dist/captcha/evidence.js.map +0 -1
- package/dist/captcha/guard.d.ts +0 -23
- package/dist/captcha/guard.d.ts.map +0 -1
- package/dist/captcha/guard.js +0 -12
- package/dist/captcha/guard.js.map +0 -1
- package/dist/cli/main.d.ts +0 -4
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -46
- package/dist/cli/main.js.map +0 -1
- package/dist/core/errors.d.ts +0 -84
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -54
- package/dist/core/errors.js.map +0 -1
- package/dist/core/events.d.ts +0 -9
- package/dist/core/events.d.ts.map +0 -1
- package/dist/core/events.js +0 -21
- package/dist/core/events.js.map +0 -1
- package/dist/core/hash.d.ts +0 -10
- package/dist/core/hash.d.ts.map +0 -1
- package/dist/core/hash.js +0 -82
- package/dist/core/hash.js.map +0 -1
- package/dist/core/ids.d.ts +0 -10
- package/dist/core/ids.d.ts.map +0 -1
- package/dist/core/ids.js +0 -15
- package/dist/core/ids.js.map +0 -1
- package/dist/delivery/manifest.d.ts +0 -35
- package/dist/delivery/manifest.d.ts.map +0 -1
- package/dist/delivery/manifest.js +0 -68
- package/dist/delivery/manifest.js.map +0 -1
- package/dist/deploy/index.d.ts +0 -6
- package/dist/deploy/index.d.ts.map +0 -1
- package/dist/deploy/index.js +0 -6
- package/dist/deploy/index.js.map +0 -1
- package/dist/dispatch/resumable.d.ts +0 -102
- package/dist/dispatch/resumable.d.ts.map +0 -1
- package/dist/dispatch/resumable.js +0 -64
- package/dist/dispatch/resumable.js.map +0 -1
- package/dist/dispatch/workflow.d.ts +0 -6
- package/dist/dispatch/workflow.d.ts.map +0 -1
- package/dist/dispatch/workflow.js +0 -37
- package/dist/dispatch/workflow.js.map +0 -1
- package/dist/domain/artifacts.d.ts +0 -12
- package/dist/domain/artifacts.d.ts.map +0 -1
- package/dist/domain/artifacts.js +0 -14
- package/dist/domain/artifacts.js.map +0 -1
- package/dist/domain/jobs.d.ts +0 -12
- package/dist/domain/jobs.d.ts.map +0 -1
- package/dist/domain/jobs.js +0 -20
- package/dist/domain/jobs.js.map +0 -1
- package/dist/domain/providers.d.ts +0 -10
- package/dist/domain/providers.d.ts.map +0 -1
- package/dist/domain/providers.js +0 -8
- package/dist/domain/providers.js.map +0 -1
- package/dist/domain/runtime.d.ts +0 -14
- package/dist/domain/runtime.d.ts.map +0 -1
- package/dist/domain/runtime.js +0 -10
- package/dist/domain/runtime.js.map +0 -1
- package/dist/domain/sessions.d.ts +0 -12
- package/dist/domain/sessions.d.ts.map +0 -1
- package/dist/domain/sessions.js +0 -57
- package/dist/domain/sessions.js.map +0 -1
- package/dist/examples/localjob.d.ts +0 -2
- package/dist/examples/localjob.d.ts.map +0 -1
- package/dist/examples/localjob.js.map +0 -1
- package/dist/examples/publicapi.d.ts +0 -2
- package/dist/examples/publicapi.d.ts.map +0 -1
- package/dist/examples/publicapi.js.map +0 -1
- package/dist/extension/build.d.ts +0 -9
- package/dist/extension/build.d.ts.map +0 -1
- package/dist/extension/build.js +0 -85
- package/dist/extension/build.js.map +0 -1
- package/dist/extension/content.d.ts +0 -6
- package/dist/extension/content.d.ts.map +0 -1
- package/dist/extension/content.js +0 -135
- package/dist/extension/content.js.map +0 -1
- package/dist/extension/index.d.ts +0 -7
- package/dist/extension/index.d.ts.map +0 -1
- package/dist/extension/index.js +0 -7
- package/dist/extension/index.js.map +0 -1
- package/dist/extension/pagebridge.d.ts +0 -6
- package/dist/extension/pagebridge.d.ts.map +0 -1
- package/dist/extension/pagebridge.js +0 -42
- package/dist/extension/pagebridge.js.map +0 -1
- package/dist/extension/permissions.d.ts +0 -26
- package/dist/extension/permissions.d.ts.map +0 -1
- package/dist/extension/permissions.js +0 -28
- package/dist/extension/permissions.js.map +0 -1
- package/dist/extension/popup.d.ts +0 -5
- package/dist/extension/popup.d.ts.map +0 -1
- package/dist/extension/popup.js +0 -26
- package/dist/extension/popup.js.map +0 -1
- package/dist/extension/protocol.d.ts +0 -58
- package/dist/extension/protocol.d.ts.map +0 -1
- package/dist/extension/protocol.js +0 -101
- package/dist/extension/protocol.js.map +0 -1
- package/dist/extension/serviceworker.d.ts +0 -25
- package/dist/extension/serviceworker.d.ts.map +0 -1
- package/dist/extension/serviceworker.js +0 -102
- package/dist/extension/serviceworker.js.map +0 -1
- package/dist/extension/worker.d.ts +0 -28
- package/dist/extension/worker.d.ts.map +0 -1
- package/dist/extension/worker.js +0 -22
- package/dist/extension/worker.js.map +0 -1
- package/dist/format/check.d.ts +0 -8
- package/dist/format/check.d.ts.map +0 -1
- package/dist/format/check.js +0 -38
- package/dist/format/check.js.map +0 -1
- package/dist/isolation/contracts.d.ts.map +0 -1
- package/dist/isolation/contracts.js.map +0 -1
- package/dist/library/public.d.ts.map +0 -1
- package/dist/library/public.js.map +0 -1
- package/dist/mcp/browser.d.ts +0 -9
- package/dist/mcp/browser.d.ts.map +0 -1
- package/dist/mcp/browser.js +0 -13
- package/dist/mcp/browser.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -35
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -40
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/transport.d.ts +0 -7
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js +0 -17
- package/dist/mcp/transport.js.map +0 -1
- package/dist/memory/bridge.d.ts +0 -14
- package/dist/memory/bridge.d.ts.map +0 -1
- package/dist/memory/bridge.js +0 -16
- package/dist/memory/bridge.js.map +0 -1
- package/dist/memory/engine.d.ts +0 -38
- package/dist/memory/engine.d.ts.map +0 -1
- package/dist/memory/engine.js +0 -109
- package/dist/memory/engine.js.map +0 -1
- package/dist/memory/modes.d.ts +0 -43
- package/dist/memory/modes.d.ts.map +0 -1
- package/dist/memory/modes.js +0 -66
- package/dist/memory/modes.js.map +0 -1
- package/dist/memory/objects.d.ts +0 -21
- package/dist/memory/objects.d.ts.map +0 -1
- package/dist/memory/objects.js +0 -20
- package/dist/memory/objects.js.map +0 -1
- package/dist/memory/planner.d.ts +0 -66
- package/dist/memory/planner.d.ts.map +0 -1
- package/dist/memory/planner.js +0 -108
- package/dist/memory/planner.js.map +0 -1
- package/dist/memory/targets.d.ts +0 -78
- package/dist/memory/targets.d.ts.map +0 -1
- package/dist/memory/targets.js +0 -29
- package/dist/memory/targets.js.map +0 -1
- package/dist/memory/transforms.d.ts +0 -19
- package/dist/memory/transforms.d.ts.map +0 -1
- package/dist/memory/transforms.js +0 -14
- package/dist/memory/transforms.js.map +0 -1
- package/dist/modes/matrix.d.ts +0 -23
- package/dist/modes/matrix.d.ts.map +0 -1
- package/dist/modes/matrix.js +0 -18
- package/dist/modes/matrix.js.map +0 -1
- package/dist/modes/modes.d.ts +0 -33
- package/dist/modes/modes.d.ts.map +0 -1
- package/dist/modes/modes.js +0 -15
- package/dist/modes/modes.js.map +0 -1
- package/dist/modes/resolve.d.ts +0 -96
- package/dist/modes/resolve.d.ts.map +0 -1
- package/dist/modes/resolve.js +0 -48
- package/dist/modes/resolve.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -14
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -18
- package/dist/observability/metrics.js.map +0 -1
- package/dist/packager/manifest.d.ts +0 -66
- package/dist/packager/manifest.d.ts.map +0 -1
- package/dist/packager/manifest.js +0 -94
- package/dist/packager/manifest.js.map +0 -1
- package/dist/packager/publish.d.ts +0 -51
- package/dist/packager/publish.d.ts.map +0 -1
- package/dist/packager/publish.js +0 -18
- package/dist/packager/publish.js.map +0 -1
- package/dist/packager/targetcli.d.ts +0 -7
- package/dist/packager/targetcli.d.ts.map +0 -1
- package/dist/packager/targetcli.js.map +0 -1
- package/dist/persistence/adapter.d.ts +0 -5
- package/dist/persistence/adapter.d.ts.map +0 -1
- package/dist/persistence/adapter.js +0 -11
- package/dist/persistence/adapter.js.map +0 -1
- package/dist/persistence/drizzle.d.ts +0 -2
- package/dist/persistence/drizzle.d.ts.map +0 -1
- package/dist/persistence/drizzle.js +0 -12
- package/dist/persistence/drizzle.js.map +0 -1
- package/dist/persistence/memory.d.ts +0 -2
- package/dist/persistence/memory.d.ts.map +0 -1
- package/dist/persistence/memory.js +0 -27
- package/dist/persistence/memory.js.map +0 -1
- package/dist/persistence/migrations.d.ts +0 -19
- package/dist/persistence/migrations.d.ts.map +0 -1
- package/dist/persistence/migrations.js +0 -13
- package/dist/persistence/migrations.js.map +0 -1
- package/dist/persistence/prisma.d.ts +0 -2
- package/dist/persistence/prisma.d.ts.map +0 -1
- package/dist/persistence/prisma.js +0 -25
- package/dist/persistence/prisma.js.map +0 -1
- package/dist/persistence/schema.d.ts +0 -63
- package/dist/persistence/schema.d.ts.map +0 -1
- package/dist/persistence/schema.js +0 -28
- package/dist/persistence/schema.js.map +0 -1
- package/dist/persistence/sql.d.ts +0 -3
- package/dist/persistence/sql.d.ts.map +0 -1
- package/dist/persistence/sql.js +0 -37
- package/dist/persistence/sql.js.map +0 -1
- package/dist/protocol/blocks.d.ts +0 -10
- package/dist/protocol/blocks.d.ts.map +0 -1
- package/dist/protocol/blocks.js +0 -26
- package/dist/protocol/blocks.js.map +0 -1
- package/dist/protocol/json.d.ts +0 -6
- package/dist/protocol/json.d.ts.map +0 -1
- package/dist/protocol/json.js +0 -6
- package/dist/protocol/json.js.map +0 -1
- package/dist/protocol/ndjson.d.ts +0 -3
- package/dist/protocol/ndjson.d.ts.map +0 -1
- package/dist/protocol/ndjson.js +0 -20
- package/dist/protocol/ndjson.js.map +0 -1
- package/dist/protocol/sse.d.ts +0 -7
- package/dist/protocol/sse.d.ts.map +0 -1
- package/dist/protocol/sse.js +0 -25
- package/dist/protocol/sse.js.map +0 -1
- package/dist/proxy/pool.d.ts +0 -9
- package/dist/proxy/pool.d.ts.map +0 -1
- package/dist/proxy/pool.js +0 -27
- package/dist/proxy/pool.js.map +0 -1
- package/dist/queue/idempotency.d.ts +0 -10
- package/dist/queue/idempotency.d.ts.map +0 -1
- package/dist/queue/idempotency.js +0 -13
- package/dist/queue/idempotency.js.map +0 -1
- package/dist/queue/persistent.d.ts +0 -14
- package/dist/queue/persistent.d.ts.map +0 -1
- package/dist/queue/persistent.js +0 -66
- package/dist/queue/persistent.js.map +0 -1
- package/dist/queue/queue.d.ts +0 -7
- package/dist/queue/queue.d.ts.map +0 -1
- package/dist/queue/queue.js +0 -55
- package/dist/queue/queue.js.map +0 -1
- package/dist/queue/saga.d.ts +0 -5
- package/dist/queue/saga.d.ts.map +0 -1
- package/dist/queue/saga.js +0 -20
- package/dist/queue/saga.js.map +0 -1
- package/dist/release/assets.d.ts +0 -144
- package/dist/release/assets.d.ts.map +0 -1
- package/dist/release/assets.js +0 -157
- package/dist/release/assets.js.map +0 -1
- package/dist/release/evidence.d.ts +0 -92
- package/dist/release/evidence.d.ts.map +0 -1
- package/dist/release/evidence.js +0 -148
- package/dist/release/evidence.js.map +0 -1
- package/dist/release/verify.d.ts +0 -12
- package/dist/release/verify.d.ts.map +0 -1
- package/dist/release/verify.js +0 -112
- package/dist/release/verify.js.map +0 -1
- package/dist/runners/chain.d.ts +0 -125
- package/dist/runners/chain.d.ts.map +0 -1
- package/dist/runners/chain.js +0 -95
- package/dist/runners/chain.js.map +0 -1
- package/dist/runners/health.d.ts +0 -36
- package/dist/runners/health.d.ts.map +0 -1
- package/dist/runners/health.js +0 -26
- package/dist/runners/health.js.map +0 -1
- package/dist/runners/heartbeat.d.ts +0 -23
- package/dist/runners/heartbeat.d.ts.map +0 -1
- package/dist/runners/heartbeat.js +0 -29
- package/dist/runners/heartbeat.js.map +0 -1
- package/dist/runners/inprocess.d.ts +0 -17
- package/dist/runners/inprocess.d.ts.map +0 -1
- package/dist/runners/inprocess.js +0 -20
- package/dist/runners/inprocess.js.map +0 -1
- package/dist/runners/scheduler.d.ts +0 -5
- package/dist/runners/scheduler.d.ts.map +0 -1
- package/dist/runners/scheduler.js +0 -19
- package/dist/runners/scheduler.js.map +0 -1
- package/dist/runtime/abort.d.ts +0 -8
- package/dist/runtime/abort.d.ts.map +0 -1
- package/dist/runtime/abort.js +0 -13
- package/dist/runtime/abort.js.map +0 -1
- package/dist/runtime/compatibility.d.ts +0 -37
- package/dist/runtime/compatibility.d.ts.map +0 -1
- package/dist/runtime/compatibility.js +0 -10
- package/dist/runtime/compatibility.js.map +0 -1
- package/dist/runtime/detect.d.ts +0 -13
- package/dist/runtime/detect.d.ts.map +0 -1
- package/dist/runtime/detect.js +0 -18
- package/dist/runtime/detect.js.map +0 -1
- package/dist/runtime/engine.d.ts +0 -20
- package/dist/runtime/engine.d.ts.map +0 -1
- package/dist/runtime/engine.js +0 -61
- package/dist/runtime/engine.js.map +0 -1
- package/dist/runtime/retry.d.ts +0 -19
- package/dist/runtime/retry.d.ts.map +0 -1
- package/dist/runtime/retry.js +0 -54
- package/dist/runtime/retry.js.map +0 -1
- package/dist/runtime/worker.d.ts +0 -10
- package/dist/runtime/worker.d.ts.map +0 -1
- package/dist/runtime/worker.js +0 -25
- package/dist/runtime/worker.js.map +0 -1
- package/dist/scrape/cache.d.ts +0 -45
- package/dist/scrape/cache.d.ts.map +0 -1
- package/dist/scrape/cache.js +0 -45
- package/dist/scrape/cache.js.map +0 -1
- package/dist/scrape/crawl.d.ts +0 -47
- package/dist/scrape/crawl.d.ts.map +0 -1
- package/dist/scrape/crawl.js +0 -114
- package/dist/scrape/crawl.js.map +0 -1
- package/dist/scrape/extract.d.ts +0 -63
- package/dist/scrape/extract.d.ts.map +0 -1
- package/dist/scrape/extract.js +0 -47
- package/dist/scrape/extract.js.map +0 -1
- package/dist/scrape/normalize.d.ts +0 -52
- package/dist/scrape/normalize.d.ts.map +0 -1
- package/dist/scrape/normalize.js +0 -102
- package/dist/scrape/normalize.js.map +0 -1
- package/dist/scrape/robots.d.ts +0 -37
- package/dist/scrape/robots.d.ts.map +0 -1
- package/dist/scrape/robots.js +0 -71
- package/dist/scrape/robots.js.map +0 -1
- package/dist/scrape/schema.d.ts +0 -23
- package/dist/scrape/schema.d.ts.map +0 -1
- package/dist/scrape/schema.js +0 -92
- package/dist/scrape/schema.js.map +0 -1
- package/dist/scrape/scraper.d.ts +0 -6
- package/dist/scrape/scraper.d.ts.map +0 -1
- package/dist/scrape/scraper.js +0 -46
- package/dist/scrape/scraper.js.map +0 -1
- package/dist/scrape/semantic.d.ts +0 -25
- package/dist/scrape/semantic.d.ts.map +0 -1
- package/dist/scrape/semantic.js +0 -27
- package/dist/scrape/semantic.js.map +0 -1
- package/dist/server/node.d.ts +0 -7
- package/dist/server/node.d.ts.map +0 -1
- package/dist/server/node.js.map +0 -1
- package/dist/sessions/file.d.ts +0 -25
- package/dist/sessions/file.d.ts.map +0 -1
- package/dist/sessions/file.js +0 -13
- package/dist/sessions/file.js.map +0 -1
- package/dist/sessions/replay.d.ts +0 -9
- package/dist/sessions/replay.d.ts.map +0 -1
- package/dist/sessions/replay.js +0 -70
- package/dist/sessions/replay.js.map +0 -1
- package/dist/sessions/store.d.ts +0 -25
- package/dist/sessions/store.d.ts.map +0 -1
- package/dist/sessions/store.js +0 -13
- package/dist/sessions/store.js.map +0 -1
- package/dist/storage/adapter.d.ts +0 -5
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js +0 -11
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/cache.d.ts +0 -23
- package/dist/storage/cache.d.ts.map +0 -1
- package/dist/storage/cache.js +0 -79
- package/dist/storage/cache.js.map +0 -1
- package/dist/storage/checksum.d.ts +0 -3
- package/dist/storage/checksum.d.ts.map +0 -1
- package/dist/storage/checksum.js +0 -19
- package/dist/storage/checksum.js.map +0 -1
- package/dist/storage/chunked.d.ts +0 -21
- package/dist/storage/chunked.d.ts.map +0 -1
- package/dist/storage/chunked.js +0 -67
- package/dist/storage/chunked.js.map +0 -1
- package/dist/storage/content.d.ts +0 -24
- package/dist/storage/content.d.ts.map +0 -1
- package/dist/storage/content.js +0 -44
- package/dist/storage/content.js.map +0 -1
- package/dist/storage/filehosting.d.ts +0 -2
- package/dist/storage/filehosting.d.ts.map +0 -1
- package/dist/storage/filehosting.js +0 -24
- package/dist/storage/filehosting.js.map +0 -1
- package/dist/storage/githubcontents.d.ts +0 -2
- package/dist/storage/githubcontents.d.ts.map +0 -1
- package/dist/storage/githubcontents.js +0 -29
- package/dist/storage/githubcontents.js.map +0 -1
- package/dist/storage/index.d.ts +0 -12
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -12
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/local.d.ts +0 -2
- package/dist/storage/local.d.ts.map +0 -1
- package/dist/storage/local.js +0 -72
- package/dist/storage/local.js.map +0 -1
- package/dist/storage/memory.d.ts +0 -6
- package/dist/storage/memory.d.ts.map +0 -1
- package/dist/storage/memory.js +0 -36
- package/dist/storage/memory.js.map +0 -1
- package/dist/storage/pool.d.ts +0 -95
- package/dist/storage/pool.d.ts.map +0 -1
- package/dist/storage/pool.js +0 -202
- package/dist/storage/pool.js.map +0 -1
- package/dist/storage/s3compatible.d.ts +0 -3
- package/dist/storage/s3compatible.d.ts.map +0 -1
- package/dist/storage/s3compatible.js +0 -70
- package/dist/storage/s3compatible.js.map +0 -1
- package/dist/storage/sync.d.ts +0 -47
- package/dist/storage/sync.d.ts.map +0 -1
- package/dist/storage/sync.js +0 -75
- package/dist/storage/sync.js.map +0 -1
- package/dist/surfaces/adapters.d.ts +0 -97
- package/dist/surfaces/adapters.d.ts.map +0 -1
- package/dist/surfaces/adapters.js +0 -50
- package/dist/surfaces/adapters.js.map +0 -1
- package/dist/surfaces/controls.d.ts +0 -18
- package/dist/surfaces/controls.d.ts.map +0 -1
- package/dist/surfaces/controls.js +0 -45
- package/dist/surfaces/controls.js.map +0 -1
- package/dist/surfaces/manifest.d.ts +0 -68
- package/dist/surfaces/manifest.d.ts.map +0 -1
- package/dist/surfaces/manifest.js +0 -42
- package/dist/surfaces/manifest.js.map +0 -1
- package/dist/surfaces/n8n.d.ts +0 -25
- package/dist/surfaces/n8n.d.ts.map +0 -1
- package/dist/surfaces/n8n.js +0 -31
- package/dist/surfaces/n8n.js.map +0 -1
- package/dist/surfaces/operations.d.ts +0 -32
- package/dist/surfaces/operations.d.ts.map +0 -1
- package/dist/surfaces/operations.js +0 -53
- package/dist/surfaces/operations.js.map +0 -1
- package/dist/surfaces/requirements.d.ts +0 -29
- package/dist/surfaces/requirements.d.ts.map +0 -1
- package/dist/surfaces/requirements.js +0 -50
- package/dist/surfaces/requirements.js.map +0 -1
- package/dist/surfaces/targets.d.ts +0 -196
- package/dist/surfaces/targets.d.ts.map +0 -1
- package/dist/surfaces/targets.js +0 -27
- package/dist/surfaces/targets.js.map +0 -1
- package/dist/webhook/delivery.d.ts +0 -18
- package/dist/webhook/delivery.d.ts.map +0 -1
- package/dist/webhook/delivery.js +0 -36
- package/dist/webhook/delivery.js.map +0 -1
- package/dist/webhook/receiver.d.ts +0 -26
- package/dist/webhook/receiver.d.ts.map +0 -1
- package/dist/webhook/receiver.js +0 -24
- package/dist/webhook/receiver.js.map +0 -1
- package/dist/webhook/signature.d.ts +0 -3
- package/dist/webhook/signature.d.ts.map +0 -1
- package/dist/webhook/signature.js +0 -7
- package/dist/webhook/signature.js.map +0 -1
- package/dist/workflow/manifest.d.ts +0 -22
- package/dist/workflow/manifest.d.ts.map +0 -1
- package/dist/workflow/manifest.js +0 -21
- package/dist/workflow/manifest.js.map +0 -1
- package/dist/workflow/registry.d.ts +0 -7
- package/dist/workflow/registry.d.ts.map +0 -1
- package/dist/workflow/registry.js +0 -18
- package/dist/workflow/registry.js.map +0 -1
- package/dist/workflow/templates.d.ts +0 -6
- package/dist/workflow/templates.d.ts.map +0 -1
- package/dist/workflow/templates.js +0 -18
- package/dist/workflow/templates.js.map +0 -1
- package/dist/workflow/triggers.d.ts +0 -64
- package/dist/workflow/triggers.d.ts.map +0 -1
- package/dist/workflow/triggers.js +0 -99
- package/dist/workflow/triggers.js.map +0 -1
- /package/{extension/README.md → docs/extension.md} +0 -0
package/mttg.config
ADDED
|
@@ -0,0 +1,1549 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"name": "mttg.config",
|
|
4
|
+
"title": "saddle - MTTG Multi-Tenant Task Groups (cgroups v2 + tenants + transcode) with MTTCG (QEMU TCG) section",
|
|
5
|
+
"version": "2.0.0",
|
|
6
|
+
"date": "2026-08-22",
|
|
7
|
+
"language": "en",
|
|
8
|
+
"conceptSeparation": "MTTG = Multi-Tenant Task Groups (cgroup v2 cpu.weight/cpuset/memory/io/pids/hugetlb/rdma + tenants + transcode pipelines). MTTCG = QEMU Multi-Threaded TCG (one host thread per vCPU under TCG). Both live here as DISTINCT sections; MTTCG accel flags also in qemu.config#mttcg.",
|
|
9
|
+
"sources": [
|
|
10
|
+
"pool:mttg.config [S6 TOML, 28 sections: transcode/nvenc/codecs/pipelines/modes]",
|
|
11
|
+
"pool:mttcg.json [V5 - MTTCG spec: architecture/enablement/scaling_192/tuning/limitations/flags_matrix]",
|
|
12
|
+
"pool:mttg.json [OMNI 20.7KB - cgroups v2 complete: cpu.weight 1-10000/burst/cpuset/memory/io/pids/hugetlb/rdma + systemd omni.slice + tenants + qos_classes]",
|
|
13
|
+
"pool:nested_mttcg.json [tcg-accel-ops-mttcg.c functions + overhead <8%]",
|
|
14
|
+
"pool:vm.config.toml [vm.mttg tenants/qos/scheduler EEVDF+BORE+sched_ext - identical values, unified]"
|
|
15
|
+
],
|
|
16
|
+
"mergeReport": {
|
|
17
|
+
"s6Sections": 15,
|
|
18
|
+
"modesCount": 5,
|
|
19
|
+
"resourceProfiles": 5,
|
|
20
|
+
"cgroupsControllers": [
|
|
21
|
+
"cpu",
|
|
22
|
+
"cpuset",
|
|
23
|
+
"memory",
|
|
24
|
+
"io",
|
|
25
|
+
"pids",
|
|
26
|
+
"hugetlb",
|
|
27
|
+
"rdma"
|
|
28
|
+
],
|
|
29
|
+
"tenants": [
|
|
30
|
+
"gold",
|
|
31
|
+
"silver",
|
|
32
|
+
"bronze",
|
|
33
|
+
"_envelope"
|
|
34
|
+
],
|
|
35
|
+
"qosClasses": [
|
|
36
|
+
"count",
|
|
37
|
+
"description",
|
|
38
|
+
"classes"
|
|
39
|
+
],
|
|
40
|
+
"schedulers": [
|
|
41
|
+
"EEVDF (default since 6.6; kernel 7.1.9)",
|
|
42
|
+
"BORE-6.12.15",
|
|
43
|
+
"sched_ext-bp-1.2.0"
|
|
44
|
+
],
|
|
45
|
+
"conflictResolution": "tenants gold/silver/bronze identical in mttg.json and vm.config.toml -> unified once; legacy qemu 11.1.0 pins -> 11.1.0",
|
|
46
|
+
"pinPatch": "embedded active config values re-pinned date-first 2026-08-22 (9.1.2->11.1.0, 27.3.1->29.7.2, 22.12.3->24.19.0, 5.6.3->7.0.2, 25.2.7->26.2.1, 19.1.7->22.1.8, 1.9.0->1.16.1, libvirt 10.10.0->12.5.0, checkout v4.2.2->v5); originals preserved under *_legacy*/source_value keys",
|
|
47
|
+
"v4fix3PipelineSection": {
|
|
48
|
+
"stageCount": 24,
|
|
49
|
+
"policy": "create_optimal scheduling policy only; stage table delegated to media.ts (transcode domain)",
|
|
50
|
+
"skipRules": 5,
|
|
51
|
+
"passageMtu": 65536
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"mttg": {
|
|
56
|
+
"stack": {
|
|
57
|
+
"priority": [
|
|
58
|
+
"typescript",
|
|
59
|
+
"node",
|
|
60
|
+
"python",
|
|
61
|
+
"docker",
|
|
62
|
+
"qemu",
|
|
63
|
+
"ffmpeg"
|
|
64
|
+
],
|
|
65
|
+
"nodeVersion": "26.7.0",
|
|
66
|
+
"nodeAltVersion": "24.19.0",
|
|
67
|
+
"typescriptVersion": "7.0.2",
|
|
68
|
+
"pythonVersion": "3.14.7",
|
|
69
|
+
"dockerVersion": "29.7.2",
|
|
70
|
+
"qemuVersion": "11.1.0",
|
|
71
|
+
"ffmpegVersion": "7.1.1",
|
|
72
|
+
"nativeNode": [
|
|
73
|
+
"node:fs",
|
|
74
|
+
"node:path",
|
|
75
|
+
"node:crypto",
|
|
76
|
+
"node:http",
|
|
77
|
+
"node:os",
|
|
78
|
+
"node:worker_threads",
|
|
79
|
+
"node:child_process",
|
|
80
|
+
"node:stream",
|
|
81
|
+
"node:buffer"
|
|
82
|
+
],
|
|
83
|
+
"githubActions": [
|
|
84
|
+
"actions/checkout@v7.0.1",
|
|
85
|
+
"actions/setup-node@v7.0.0",
|
|
86
|
+
"actions/setup-python@v7.0.0",
|
|
87
|
+
"docker/setup-qemu-action@v4.2.0",
|
|
88
|
+
"docker/setup-buildx-action@v4.3.0",
|
|
89
|
+
"docker/build-push-action@v7.3.0"
|
|
90
|
+
],
|
|
91
|
+
"node": "26.7.0 Current",
|
|
92
|
+
"nodeAlt": "24.19.0 LTS",
|
|
93
|
+
"typescript": "7.0.2",
|
|
94
|
+
"python": "3.14.7",
|
|
95
|
+
"docker": "29.7.2",
|
|
96
|
+
"qemu": "11.1.0",
|
|
97
|
+
"legacyPinsSaddleV6": {
|
|
98
|
+
"priority": [
|
|
99
|
+
"typescript",
|
|
100
|
+
"node",
|
|
101
|
+
"python",
|
|
102
|
+
"docker",
|
|
103
|
+
"qemu",
|
|
104
|
+
"ffmpeg"
|
|
105
|
+
],
|
|
106
|
+
"nodeVersion": "22.12.3",
|
|
107
|
+
"nodeAltVersion": "23.5.0",
|
|
108
|
+
"typescriptVersion": "5.6.3",
|
|
109
|
+
"pythonVersion": "3.13.5",
|
|
110
|
+
"dockerVersion": "27.3.1",
|
|
111
|
+
"qemuVersion": "9.1.2",
|
|
112
|
+
"ffmpegVersion": "7.1.1",
|
|
113
|
+
"nativeNode": [
|
|
114
|
+
"node:fs",
|
|
115
|
+
"node:path",
|
|
116
|
+
"node:crypto",
|
|
117
|
+
"node:http",
|
|
118
|
+
"node:os",
|
|
119
|
+
"node:worker_threads",
|
|
120
|
+
"node:child_process",
|
|
121
|
+
"node:stream",
|
|
122
|
+
"node:buffer"
|
|
123
|
+
],
|
|
124
|
+
"githubActions": [
|
|
125
|
+
"actions/checkout@v4.2.2",
|
|
126
|
+
"actions/setup-node@v4.1.0",
|
|
127
|
+
"actions/setup-python@v5.4.0",
|
|
128
|
+
"docker/setup-qemu-action@v3.6.0",
|
|
129
|
+
"docker/setup-buildx-action@v3.7.1",
|
|
130
|
+
"docker/build-push-action@v6.10.0"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"resources": {
|
|
135
|
+
"minVcpu": 1,
|
|
136
|
+
"maxVcpu": 1024,
|
|
137
|
+
"minRamMb": 512,
|
|
138
|
+
"maxRamMb": 2097152,
|
|
139
|
+
"minVramMb": 1024,
|
|
140
|
+
"maxVramMb": 196608,
|
|
141
|
+
"unitCpu": "vCPU",
|
|
142
|
+
"unitRam": "MB",
|
|
143
|
+
"unitVram": "MB",
|
|
144
|
+
"allocator": "vcpus.json + vram.json + gpus.json + boards.json",
|
|
145
|
+
"overcommitCpu": 1.25,
|
|
146
|
+
"overcommitRam": 1.1,
|
|
147
|
+
"isolation": "cgroupv2 + qemu cpuset + nvidia vgpu time-sliced",
|
|
148
|
+
"enforcement": "strict",
|
|
149
|
+
"profiles": {
|
|
150
|
+
"tiny": {
|
|
151
|
+
"vcpus": 1,
|
|
152
|
+
"ramMb": 512,
|
|
153
|
+
"vramMb": 1024,
|
|
154
|
+
"useCase": "edge preview, healthcheck, thumbnail",
|
|
155
|
+
"qos": "bronze",
|
|
156
|
+
"schedulingClass": "best-effort",
|
|
157
|
+
"ffmpegThreads": 1,
|
|
158
|
+
"notes": "minimal viable transcode, h264 baseline only"
|
|
159
|
+
},
|
|
160
|
+
"oddprime": {
|
|
161
|
+
"vcpus": 37,
|
|
162
|
+
"ramMb": 7919,
|
|
163
|
+
"vramMb": 7183,
|
|
164
|
+
"useCase": "prime stride validation, anti-alias cache test, jitter injection",
|
|
165
|
+
"qos": "silver+prime",
|
|
166
|
+
"schedulingClass": "latency-sensitive",
|
|
167
|
+
"ffmpegThreads": 37,
|
|
168
|
+
"isPrimeValidated": true,
|
|
169
|
+
"primePurpose": "memory fragmentation and NUMA distribution resilience"
|
|
170
|
+
},
|
|
171
|
+
"creator": {
|
|
172
|
+
"vcpus": 32,
|
|
173
|
+
"ramMb": 65536,
|
|
174
|
+
"vramMb": 23552,
|
|
175
|
+
"useCase": "creator 4k av1 rtx 5090, davinci, premiere, blender",
|
|
176
|
+
"qos": "gold",
|
|
177
|
+
"schedulingClass": "realtime",
|
|
178
|
+
"ffmpegThreads": 32,
|
|
179
|
+
"gpuProfile": "rtx5090 creator",
|
|
180
|
+
"referenceHardware": "nvidia blackwell rtx 5090 24GB"
|
|
181
|
+
},
|
|
182
|
+
"ml": {
|
|
183
|
+
"vcpus": 192,
|
|
184
|
+
"ramMb": 262144,
|
|
185
|
+
"vramMb": 98304,
|
|
186
|
+
"useCase": "svt-av1 2.3 two-pass, vvc research, stable diffusion video + transcode fused",
|
|
187
|
+
"qos": "gold+ml",
|
|
188
|
+
"schedulingClass": "gpu-bound",
|
|
189
|
+
"ffmpegThreads": 96,
|
|
190
|
+
"gpuProfile": "4x pro 6000 96GB or 2x b200 192GB split",
|
|
191
|
+
"nvlinkRequired": true
|
|
192
|
+
},
|
|
193
|
+
"hyperscale": {
|
|
194
|
+
"vcpus": 1024,
|
|
195
|
+
"ramMb": 2097152,
|
|
196
|
+
"vramMb": 196608,
|
|
197
|
+
"useCase": "film8k mezzanine 96GB PRO 6000, hyperscale batch",
|
|
198
|
+
"qos": "platinum-dedicated",
|
|
199
|
+
"schedulingClass": "dedicated-node",
|
|
200
|
+
"ffmpegThreads": 512,
|
|
201
|
+
"gpuProfile": "2x pro 6000 workstation 96GB unified OR 1x gb200 superchip 192GB+64k",
|
|
202
|
+
"maxTenants": 1
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"cgroups": {
|
|
207
|
+
"version": "v2",
|
|
208
|
+
"mount": "/sys/fs/cgroup",
|
|
209
|
+
"mountOptions": "cgroup2",
|
|
210
|
+
"unified": true,
|
|
211
|
+
"controllers": [
|
|
212
|
+
"cpu",
|
|
213
|
+
"cpuset",
|
|
214
|
+
"memory",
|
|
215
|
+
"io",
|
|
216
|
+
"pids",
|
|
217
|
+
"hugetlb",
|
|
218
|
+
"rdma"
|
|
219
|
+
],
|
|
220
|
+
"controllersAvailable": "cat /sys/fs/cgroup/cgroup.controllers",
|
|
221
|
+
"controllersEnabled": "cpu cpuset memory io pids",
|
|
222
|
+
"rootPath": "/sys/fs/cgroup",
|
|
223
|
+
"omniSlice": "/sys/fs/cgroup/omni.slice",
|
|
224
|
+
"vmPathTemplate": "/sys/fs/cgroup/omni.slice/{vm_id}",
|
|
225
|
+
"systemdIntegration": true,
|
|
226
|
+
"systemdDriver": "systemd",
|
|
227
|
+
"systemdSlice": "omni.slice",
|
|
228
|
+
"cpu": {
|
|
229
|
+
"weight": {
|
|
230
|
+
"description": "CPU weight - proportional share 1-10000, default 100",
|
|
231
|
+
"file": "cpu.weight",
|
|
232
|
+
"min": 1,
|
|
233
|
+
"max": 10000,
|
|
234
|
+
"default": 100,
|
|
235
|
+
"range": "1-10000",
|
|
236
|
+
"type": "weight",
|
|
237
|
+
"example": "echo 5000 > /sys/fs/cgroup/omni.slice/vm-001/cpu.weight"
|
|
238
|
+
},
|
|
239
|
+
"max": {
|
|
240
|
+
"description": "cpu.max quota period burst - hard limit quota per period microsec",
|
|
241
|
+
"file": "cpu.max",
|
|
242
|
+
"format": "$MAX $PERIOD",
|
|
243
|
+
"formatBurst": "$MAX $PERIOD with burst",
|
|
244
|
+
"quota": {
|
|
245
|
+
"description": "quota in microseconds - max time cgroup can be scheduled per period",
|
|
246
|
+
"default": "max",
|
|
247
|
+
"unit": "usec",
|
|
248
|
+
"example": "1600000 100000 = 16 CPUs max"
|
|
249
|
+
},
|
|
250
|
+
"period": {
|
|
251
|
+
"description": "period in microseconds",
|
|
252
|
+
"min": 1000,
|
|
253
|
+
"max": 1000000,
|
|
254
|
+
"default": 100000,
|
|
255
|
+
"unit": "usec"
|
|
256
|
+
},
|
|
257
|
+
"burst": {
|
|
258
|
+
"description": "burst - ability to burst beyond quota for short time (kernel 6.12+)",
|
|
259
|
+
"min": 0,
|
|
260
|
+
"default": 0,
|
|
261
|
+
"unit": "usec",
|
|
262
|
+
"kernelSupport": "6.2+",
|
|
263
|
+
"example": "1600000 100000 burst 320000",
|
|
264
|
+
"since": "kernel 6.2 cgroup v2 cpu burst"
|
|
265
|
+
},
|
|
266
|
+
"example": "echo '1600000 100000' > cpu.max"
|
|
267
|
+
},
|
|
268
|
+
"weightNice": {
|
|
269
|
+
"description": "cpu.weight.nice - nice value based weight -20 to 19",
|
|
270
|
+
"file": "cpu.weight.nice",
|
|
271
|
+
"min": -20,
|
|
272
|
+
"max": 19,
|
|
273
|
+
"default": 0
|
|
274
|
+
},
|
|
275
|
+
"idle": {
|
|
276
|
+
"description": "cpu.idle - if 1, cgroup only runs when no other cgroup is runnable",
|
|
277
|
+
"file": "cpu.idle",
|
|
278
|
+
"default": 0,
|
|
279
|
+
"qos": "idle"
|
|
280
|
+
},
|
|
281
|
+
"stat": {
|
|
282
|
+
"file": "cpu.stat",
|
|
283
|
+
"fields": [
|
|
284
|
+
"usage_usec",
|
|
285
|
+
"user_usec",
|
|
286
|
+
"system_usec",
|
|
287
|
+
"nr_periods",
|
|
288
|
+
"nr_throttled",
|
|
289
|
+
"throttled_usec",
|
|
290
|
+
"nr_bursts",
|
|
291
|
+
"burst_usec"
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
"cpuset": {
|
|
296
|
+
"description": "cpuset - pin cgroup to specific CPUs and memory nodes",
|
|
297
|
+
"files": {
|
|
298
|
+
"cpus": "cpuset.cpus",
|
|
299
|
+
"mems": "cpuset.mems",
|
|
300
|
+
"effectiveCpus": "cpuset.cpus.effective",
|
|
301
|
+
"effectiveMems": "cpuset.mems.effective"
|
|
302
|
+
},
|
|
303
|
+
"cpus": {
|
|
304
|
+
"description": "cpuset.cpus - list of CPUs allowed",
|
|
305
|
+
"example": "0-15 or 0,2,4-7",
|
|
306
|
+
"file": "cpuset.cpus",
|
|
307
|
+
"effectiveFile": "cpuset.cpus.effective"
|
|
308
|
+
},
|
|
309
|
+
"mems": {
|
|
310
|
+
"description": "cpuset.mems - list of memory nodes allowed",
|
|
311
|
+
"example": "0 or 0-1",
|
|
312
|
+
"file": "cpuset.mems"
|
|
313
|
+
},
|
|
314
|
+
"exclusive": true,
|
|
315
|
+
"example": "echo '0-15' > cpuset.cpus && echo '0' > cpuset.mems"
|
|
316
|
+
},
|
|
317
|
+
"memory": {
|
|
318
|
+
"description": "memory controller - high and max limits",
|
|
319
|
+
"files": {
|
|
320
|
+
"high": "memory.high",
|
|
321
|
+
"max": "memory.max",
|
|
322
|
+
"swapMax": "memory.swap.max",
|
|
323
|
+
"current": "memory.current",
|
|
324
|
+
"events": "memory.events"
|
|
325
|
+
},
|
|
326
|
+
"high": {
|
|
327
|
+
"description": "memory.high - soft limit, throttling and reclaim starts above high",
|
|
328
|
+
"file": "memory.high",
|
|
329
|
+
"type": "bytes",
|
|
330
|
+
"default": "max",
|
|
331
|
+
"example": "60G",
|
|
332
|
+
"behavior": "throttle allocations, reclaim aggressively"
|
|
333
|
+
},
|
|
334
|
+
"max": {
|
|
335
|
+
"description": "memory.max - hard limit, OOM if exceeded above max",
|
|
336
|
+
"file": "memory.max",
|
|
337
|
+
"type": "bytes",
|
|
338
|
+
"default": "max",
|
|
339
|
+
"example": "64G",
|
|
340
|
+
"behavior": "OOM kill or allocation failure"
|
|
341
|
+
},
|
|
342
|
+
"swapMax": {
|
|
343
|
+
"description": "memory.swap.max - swap limit",
|
|
344
|
+
"file": "memory.swap.max",
|
|
345
|
+
"default": "max",
|
|
346
|
+
"example": "0 disables swap"
|
|
347
|
+
},
|
|
348
|
+
"low": {
|
|
349
|
+
"description": "memory.low - protection low limit",
|
|
350
|
+
"file": "memory.low"
|
|
351
|
+
},
|
|
352
|
+
"min": {
|
|
353
|
+
"description": "memory.min - hard protection",
|
|
354
|
+
"file": "memory.min"
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"io": {
|
|
358
|
+
"description": "io controller - block IO weight and max",
|
|
359
|
+
"files": {
|
|
360
|
+
"weight": "io.weight",
|
|
361
|
+
"max": "io.max",
|
|
362
|
+
"stat": "io.stat",
|
|
363
|
+
"bfqWeight": "io.bfq.weight (BFQ)"
|
|
364
|
+
},
|
|
365
|
+
"weight": {
|
|
366
|
+
"description": "io.weight - proportional IO weight 1-10000",
|
|
367
|
+
"file": "io.weight",
|
|
368
|
+
"min": 1,
|
|
369
|
+
"max": 10000,
|
|
370
|
+
"default": 100
|
|
371
|
+
},
|
|
372
|
+
"max": {
|
|
373
|
+
"description": "io.max - absolute IO max rbps wbps riops wiops per device",
|
|
374
|
+
"file": "io.max",
|
|
375
|
+
"example": "254:0 rbps=1073741824 wbps=1073741824",
|
|
376
|
+
"format": "major:minor rbps=N wbps=N riops=N wiops=N"
|
|
377
|
+
},
|
|
378
|
+
"bfqWeight": {
|
|
379
|
+
"description": "BFQ scheduler weight when using BFQ",
|
|
380
|
+
"file": "io.bfq.weight",
|
|
381
|
+
"min": 1,
|
|
382
|
+
"max": 10000
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"pids": {
|
|
386
|
+
"description": "pids controller - limit number of processes",
|
|
387
|
+
"file": "pids.max",
|
|
388
|
+
"current": "pids.current",
|
|
389
|
+
"events": "pids.events",
|
|
390
|
+
"default": "max",
|
|
391
|
+
"example": "4096",
|
|
392
|
+
"maxLimit": "4194304"
|
|
393
|
+
},
|
|
394
|
+
"hugetlb": {
|
|
395
|
+
"description": "hugetlb controller - hugepages accounting",
|
|
396
|
+
"enabled": true,
|
|
397
|
+
"files": [
|
|
398
|
+
"hugetlb.1GB.current",
|
|
399
|
+
"hugetlb.1GB.max"
|
|
400
|
+
]
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"cgroupVmRuntime": {
|
|
404
|
+
"engine": "mttg",
|
|
405
|
+
"version": "5.0.0",
|
|
406
|
+
"cgroupVersion": "v2",
|
|
407
|
+
"cgroupPath": "/sys/fs/cgroup/omni.slice/omni-vm-prod-001",
|
|
408
|
+
"cpuWeightMin": 1,
|
|
409
|
+
"cpuWeightMax": 10000,
|
|
410
|
+
"cpuWeightDefault": 100,
|
|
411
|
+
"cpuMaxQuota": "max",
|
|
412
|
+
"cpuMaxPeriod": 100000,
|
|
413
|
+
"cpuMaxBurst": 0,
|
|
414
|
+
"cpuset": "0-15",
|
|
415
|
+
"cpusetMems": "0",
|
|
416
|
+
"memoryHigh": "60G",
|
|
417
|
+
"memoryMax": "64G",
|
|
418
|
+
"memorySwapMax": "0",
|
|
419
|
+
"ioWeight": 100,
|
|
420
|
+
"ioMax": "rbps=1073741824 wbps=1073741824 rbps=1000 wiops=1000",
|
|
421
|
+
"pidsMax": 4096,
|
|
422
|
+
"numaBalancing": true,
|
|
423
|
+
"scheduler": "EEVDF",
|
|
424
|
+
"schedulerVersion": "kernel-7.1.9-eevdf",
|
|
425
|
+
"schedulerAlt": [
|
|
426
|
+
"BORE-6.12.15",
|
|
427
|
+
"sched_ext-bp-1.2.0"
|
|
428
|
+
],
|
|
429
|
+
"qosClassesList": [
|
|
430
|
+
"guaranteed",
|
|
431
|
+
"burstable",
|
|
432
|
+
"besteffort",
|
|
433
|
+
"idle"
|
|
434
|
+
],
|
|
435
|
+
"tenants": {
|
|
436
|
+
"gold": {
|
|
437
|
+
"weight": 10000,
|
|
438
|
+
"cpuMax": "1600000 100000",
|
|
439
|
+
"memoryHigh": "60G",
|
|
440
|
+
"memoryMax": "64G",
|
|
441
|
+
"ioWeight": 1000,
|
|
442
|
+
"pidsMax": 8192,
|
|
443
|
+
"qos": "guaranteed",
|
|
444
|
+
"cpuset": "0-15"
|
|
445
|
+
},
|
|
446
|
+
"silver": {
|
|
447
|
+
"weight": 5000,
|
|
448
|
+
"cpuMax": "800000 100000",
|
|
449
|
+
"memoryHigh": "30G",
|
|
450
|
+
"memoryMax": "32G",
|
|
451
|
+
"ioWeight": 500,
|
|
452
|
+
"pidsMax": 4096,
|
|
453
|
+
"qos": "burstable",
|
|
454
|
+
"cpuset": "0-7"
|
|
455
|
+
},
|
|
456
|
+
"bronze": {
|
|
457
|
+
"weight": 100,
|
|
458
|
+
"cpuMax": "200000 100000",
|
|
459
|
+
"memoryHigh": "8G",
|
|
460
|
+
"memoryMax": "16G",
|
|
461
|
+
"ioWeight": 100,
|
|
462
|
+
"pidsMax": 1024,
|
|
463
|
+
"qos": "besteffort",
|
|
464
|
+
"cpuset": "0-3"
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
"qosClasses": {
|
|
468
|
+
"guaranteed": {
|
|
469
|
+
"cpuWeight": 10000,
|
|
470
|
+
"cpuGuarantee": "100%",
|
|
471
|
+
"memoryPolicy": "no-overcommit",
|
|
472
|
+
"ioPolicy": "high-priority",
|
|
473
|
+
"description": "Guaranteed QoS: full CPU reservation, no memory overcommit, high-priority IO"
|
|
474
|
+
},
|
|
475
|
+
"burstable": {
|
|
476
|
+
"cpuWeight": 5000,
|
|
477
|
+
"cpuGuarantee": "50%",
|
|
478
|
+
"memoryPolicy": "bounded-overcommit",
|
|
479
|
+
"ioPolicy": "normal",
|
|
480
|
+
"description": "Burstable: baseline 50% CPU with burst to 100%, bounded memory overcommit"
|
|
481
|
+
},
|
|
482
|
+
"besteffort": {
|
|
483
|
+
"cpuWeight": 100,
|
|
484
|
+
"cpuGuarantee": "0%",
|
|
485
|
+
"memoryPolicy": "overcommit",
|
|
486
|
+
"ioPolicy": "low-priority",
|
|
487
|
+
"description": "Best-effort: opportunistic scheduling, full overcommit allowed"
|
|
488
|
+
},
|
|
489
|
+
"idle": {
|
|
490
|
+
"cpuWeight": 1,
|
|
491
|
+
"cpuGuarantee": "0%",
|
|
492
|
+
"memoryPolicy": "reclaim-first",
|
|
493
|
+
"ioPolicy": "idle",
|
|
494
|
+
"description": "Idle: lowest priority, first to be reclaimed under pressure"
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
"systemd": {
|
|
499
|
+
"slice": "omni.slice",
|
|
500
|
+
"sliceFile": "/etc/systemd/system/omni.slice",
|
|
501
|
+
"description": "saddle root slice for all VMs",
|
|
502
|
+
"exampleSlice": "[Unit]\nDescription=saddle Root Slice\nBefore=slices.target\n[Slice]\nCPUAccounting=yes\nMemoryAccounting=yes\nIOAccounting=yes\nTasksAccounting=yes",
|
|
503
|
+
"controllerDelegation": "Delegate=cpu cpuset memory io pids"
|
|
504
|
+
},
|
|
505
|
+
"scheduler": {
|
|
506
|
+
"default": "EEVDF",
|
|
507
|
+
"description": "CPU Scheduler - EEVDF is default since kernel 6.6, with BORE and sched_ext alternatives",
|
|
508
|
+
"schedulers": [
|
|
509
|
+
{
|
|
510
|
+
"name": "EEVDF",
|
|
511
|
+
"fullName": "Earliest Eligible Virtual Deadline First",
|
|
512
|
+
"since": "kernel 6.6",
|
|
513
|
+
"status": "default since kernel 6.6",
|
|
514
|
+
"version": "kernel-7.1.9-eevdf",
|
|
515
|
+
"description": "Fair scheduling with proportional weight, replaces CFS 6.6+",
|
|
516
|
+
"cgroupInterface": "cpu.weight 1-10000",
|
|
517
|
+
"features": [
|
|
518
|
+
"lag-based",
|
|
519
|
+
"virtual deadline",
|
|
520
|
+
"proportional fairness"
|
|
521
|
+
],
|
|
522
|
+
"tuning": {
|
|
523
|
+
"sysctl": [
|
|
524
|
+
"kernel.sched_bore=0",
|
|
525
|
+
"kernel.sched_min_granularity_ns=4000000"
|
|
526
|
+
]
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
"name": "BORE",
|
|
531
|
+
"fullName": "Burst-Oriented Response Enhancer",
|
|
532
|
+
"version": "BORE-6.12.15",
|
|
533
|
+
"since": "kernel 6.8 custom patch",
|
|
534
|
+
"status": "alternative patch",
|
|
535
|
+
"description": "BORE scheduler patch - burst-oriented, reduces latency for interactive workloads",
|
|
536
|
+
"patchUrl": "https://github.com/firelzrd/bore-scheduler",
|
|
537
|
+
"features": [
|
|
538
|
+
"burst-awareness",
|
|
539
|
+
"interactive priority",
|
|
540
|
+
"low latency"
|
|
541
|
+
],
|
|
542
|
+
"binary": "kernel with BORE patch"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"name": "sched_ext",
|
|
546
|
+
"fullName": "Extensible Scheduler (eBPF Schedulers)",
|
|
547
|
+
"version": "sched_ext-bp-1.2.0",
|
|
548
|
+
"since": "kernel 6.12",
|
|
549
|
+
"status": "stable in 6.12+",
|
|
550
|
+
"description": "eBPF based extensible scheduler - load custom BPF scheduler programs",
|
|
551
|
+
"tools": {
|
|
552
|
+
"scxSimple": "Simple scheduler",
|
|
553
|
+
"scxBpfland": "Userland-inspired scheduler",
|
|
554
|
+
"scxRusty": "Rust scheduler",
|
|
555
|
+
"scxCentral": "Central scheduler"
|
|
556
|
+
},
|
|
557
|
+
"bpfProgramsPath": "/usr/share/sched_ext/",
|
|
558
|
+
"loadCommand": "scx_simple or scx_bpfland",
|
|
559
|
+
"kernelConfig": "CONFIG_SCHED_EXT=y",
|
|
560
|
+
"libbpf": "1.6.0",
|
|
561
|
+
"features": [
|
|
562
|
+
"BPF schedulers",
|
|
563
|
+
"user-defined policies",
|
|
564
|
+
"hot-reload"
|
|
565
|
+
]
|
|
566
|
+
}
|
|
567
|
+
],
|
|
568
|
+
"numa": {
|
|
569
|
+
"balancing": true,
|
|
570
|
+
"description": "NUMA balancing via kernel",
|
|
571
|
+
"sysctl": "kernel.numa_balancing=1",
|
|
572
|
+
"scanPeriod": "kernel.numa_balancing_scan_period_ms=1000",
|
|
573
|
+
"options": [
|
|
574
|
+
"numa_balancing=1 enables automatic NUMA placement"
|
|
575
|
+
]
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
"tenants": {
|
|
579
|
+
"gold": {
|
|
580
|
+
"name": "gold",
|
|
581
|
+
"id": "tenant-gold",
|
|
582
|
+
"tier": "gold",
|
|
583
|
+
"priority": 1,
|
|
584
|
+
"weight": 10000,
|
|
585
|
+
"cpuWeight": 10000,
|
|
586
|
+
"cpuMax": "1600000 100000",
|
|
587
|
+
"cpuMaxCores": 16,
|
|
588
|
+
"cpuset": "0-15",
|
|
589
|
+
"cpusetMems": "0",
|
|
590
|
+
"memoryHigh": "60G",
|
|
591
|
+
"memoryMax": "64G",
|
|
592
|
+
"memorySwapMax": "0",
|
|
593
|
+
"ioWeight": 1000,
|
|
594
|
+
"ioMax": "rbps=1073741824 wbps=1073741824 riops=10000 wiops=10000",
|
|
595
|
+
"pidsMax": 8192,
|
|
596
|
+
"qos": "guaranteed",
|
|
597
|
+
"numaBalancing": true,
|
|
598
|
+
"color": "#FFD700",
|
|
599
|
+
"description": "Gold tier - guaranteed QoS, 16 vCPUs full reservation, 64G",
|
|
600
|
+
"sla": {
|
|
601
|
+
"cpuGuarantee": "100% - 16 cores",
|
|
602
|
+
"memoryGuarantee": "64G no overcommit",
|
|
603
|
+
"availability": "99.99%",
|
|
604
|
+
"latencyP99": "<10ms"
|
|
605
|
+
},
|
|
606
|
+
"cgroupPath": "/sys/fs/cgroup/omni.slice/tenant-gold",
|
|
607
|
+
"systemdUnit": "omni-tenant-gold.slice",
|
|
608
|
+
"vmConfigTomlConfirmation": "identical values present in vm.config.toml [vm.mttg.tenants.gold] - unified here"
|
|
609
|
+
},
|
|
610
|
+
"silver": {
|
|
611
|
+
"name": "silver",
|
|
612
|
+
"id": "tenant-silver",
|
|
613
|
+
"tier": "silver",
|
|
614
|
+
"priority": 2,
|
|
615
|
+
"weight": 5000,
|
|
616
|
+
"cpuWeight": 5000,
|
|
617
|
+
"cpuMax": "800000 100000",
|
|
618
|
+
"cpuMaxCores": 8,
|
|
619
|
+
"cpuset": "0-7",
|
|
620
|
+
"cpusetMems": "0",
|
|
621
|
+
"memoryHigh": "30G",
|
|
622
|
+
"memoryMax": "32G",
|
|
623
|
+
"memorySwapMax": "4G",
|
|
624
|
+
"ioWeight": 500,
|
|
625
|
+
"ioMax": "rbps=536870912 wbps=536870912 riops=5000 wiops=5000",
|
|
626
|
+
"pidsMax": 4096,
|
|
627
|
+
"qos": "burstable",
|
|
628
|
+
"numaBalancing": true,
|
|
629
|
+
"color": "#C0C0C0",
|
|
630
|
+
"description": "Silver tier - burstable QoS, 8 vCPUs baseline with burst to 16, 32G",
|
|
631
|
+
"sla": {
|
|
632
|
+
"cpuGuarantee": "50% - 8 cores baseline, burst to 16",
|
|
633
|
+
"memoryGuarantee": "30G guaranteed, 32G max",
|
|
634
|
+
"availability": "99.9%",
|
|
635
|
+
"latencyP99": "<50ms"
|
|
636
|
+
},
|
|
637
|
+
"cgroupPath": "/sys/fs/cgroup/omni.slice/tenant-silver",
|
|
638
|
+
"systemdUnit": "omni-tenant-silver.slice",
|
|
639
|
+
"vmConfigTomlConfirmation": "identical values present in vm.config.toml [vm.mttg.tenants.silver] - unified here"
|
|
640
|
+
},
|
|
641
|
+
"bronze": {
|
|
642
|
+
"name": "bronze",
|
|
643
|
+
"id": "tenant-bronze",
|
|
644
|
+
"tier": "bronze",
|
|
645
|
+
"priority": 3,
|
|
646
|
+
"weight": 100,
|
|
647
|
+
"cpuWeight": 100,
|
|
648
|
+
"cpuMax": "200000 100000",
|
|
649
|
+
"cpuMaxCores": 2,
|
|
650
|
+
"cpuset": "0-3",
|
|
651
|
+
"cpusetMems": "0",
|
|
652
|
+
"memoryHigh": "8G",
|
|
653
|
+
"memoryMax": "16G",
|
|
654
|
+
"memorySwapMax": "8G",
|
|
655
|
+
"ioWeight": 100,
|
|
656
|
+
"ioMax": "rbps=134217728 wbps=134217728 riops=1000 wiops=1000",
|
|
657
|
+
"pidsMax": 1024,
|
|
658
|
+
"qos": "besteffort",
|
|
659
|
+
"numaBalancing": false,
|
|
660
|
+
"color": "#CD7F32",
|
|
661
|
+
"description": "Bronze tier - besteffort, 2 vCPUs opportunistic, 16G max",
|
|
662
|
+
"sla": {
|
|
663
|
+
"cpuGuarantee": "0% best-effort - 2 cores opportunistic",
|
|
664
|
+
"memoryGuarantee": "8G soft, 16G hard limit",
|
|
665
|
+
"availability": "99.0%",
|
|
666
|
+
"latencyP99": "best-effort"
|
|
667
|
+
},
|
|
668
|
+
"cgroupPath": "/sys/fs/cgroup/omni.slice/tenant-bronze",
|
|
669
|
+
"systemdUnit": "omni-tenant-bronze.slice",
|
|
670
|
+
"vmConfigTomlConfirmation": "identical values present in vm.config.toml [vm.mttg.tenants.bronze] - unified here"
|
|
671
|
+
},
|
|
672
|
+
"envelope": {
|
|
673
|
+
"description": "Multi-tenant resource pools gold/silver/bronze with weights and QoS",
|
|
674
|
+
"count": 3,
|
|
675
|
+
"isolation": "cgroup v2 per tenant"
|
|
676
|
+
}
|
|
677
|
+
},
|
|
678
|
+
"qosClasses": {
|
|
679
|
+
"count": 4,
|
|
680
|
+
"description": "4 QoS classes - guaranteed/burstable/besteffort/idle mapped to cpu.weight and policies",
|
|
681
|
+
"classes": [
|
|
682
|
+
{
|
|
683
|
+
"name": "guaranteed",
|
|
684
|
+
"priority": 1,
|
|
685
|
+
"cpuWeight": 10000,
|
|
686
|
+
"cpuWeightNice": -10,
|
|
687
|
+
"cpuGuarantee": "100%",
|
|
688
|
+
"cpuMax": "1600000 100000",
|
|
689
|
+
"description": "Guaranteed QoS: full CPU reservation, no overcommit, high-priority IO, reserved memory",
|
|
690
|
+
"memoryPolicy": "no-overcommit",
|
|
691
|
+
"ioPolicy": "high-priority",
|
|
692
|
+
"ioWeight": 1000,
|
|
693
|
+
"memoryHigh": "60G",
|
|
694
|
+
"memoryMax": "64G",
|
|
695
|
+
"pidsMax": 8192,
|
|
696
|
+
"behavior": "Guaranteed CPU, memory protection, never throttled below guarantee",
|
|
697
|
+
"useCase": "Production critical workloads, databases, latency-sensitive",
|
|
698
|
+
"exampleTenant": "gold",
|
|
699
|
+
"cgroupAnnotations": {
|
|
700
|
+
"cpu.weight": 10000,
|
|
701
|
+
"cpu.max": "1600000 100000",
|
|
702
|
+
"memory.high": "60G",
|
|
703
|
+
"memory.max": "64G",
|
|
704
|
+
"io.weight": 1000,
|
|
705
|
+
"pids.max": 8192,
|
|
706
|
+
"cpu.idle": 0
|
|
707
|
+
}
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"name": "burstable",
|
|
711
|
+
"priority": 2,
|
|
712
|
+
"cpuWeight": 5000,
|
|
713
|
+
"cpuWeightNice": -5,
|
|
714
|
+
"cpuGuarantee": "50%",
|
|
715
|
+
"cpuMax": "800000 100000",
|
|
716
|
+
"description": "Burstable: baseline 50% CPU with burst to 100%, bounded memory overcommit",
|
|
717
|
+
"memoryPolicy": "bounded-overcommit",
|
|
718
|
+
"ioPolicy": "normal",
|
|
719
|
+
"ioWeight": 500,
|
|
720
|
+
"memoryHigh": "30G",
|
|
721
|
+
"memoryMax": "32G",
|
|
722
|
+
"pidsMax": 4096,
|
|
723
|
+
"behavior": "Baseline guarantee plus burst capability via cpu.max burst",
|
|
724
|
+
"useCase": "General production, web services which need burst",
|
|
725
|
+
"exampleTenant": "silver",
|
|
726
|
+
"cgroupAnnotations": {
|
|
727
|
+
"cpu.weight": 5000,
|
|
728
|
+
"cpu.max": "800000 100000 burst 1600000",
|
|
729
|
+
"memory.high": "30G",
|
|
730
|
+
"memory.max": "32G",
|
|
731
|
+
"io.weight": 500,
|
|
732
|
+
"pids.max": 4096
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
"name": "besteffort",
|
|
737
|
+
"priority": 3,
|
|
738
|
+
"cpuWeight": 100,
|
|
739
|
+
"cpuWeightNice": 0,
|
|
740
|
+
"cpuGuarantee": "0%",
|
|
741
|
+
"cpuMax": "200000 100000",
|
|
742
|
+
"description": "Best-effort: opportunistic scheduling, full overcommit allowed, lowest guarantee",
|
|
743
|
+
"memoryPolicy": "overcommit",
|
|
744
|
+
"ioPolicy": "low-priority",
|
|
745
|
+
"ioWeight": 100,
|
|
746
|
+
"memoryHigh": "8G",
|
|
747
|
+
"memoryMax": "16G",
|
|
748
|
+
"pidsMax": 1024,
|
|
749
|
+
"behavior": "Only runs when spare capacity exists, first to be reclaimed",
|
|
750
|
+
"useCase": "Batch jobs, dev environments, non-critical",
|
|
751
|
+
"exampleTenant": "bronze",
|
|
752
|
+
"cgroupAnnotations": {
|
|
753
|
+
"cpu.weight": 100,
|
|
754
|
+
"cpu.max": "200000 100000",
|
|
755
|
+
"memory.high": "8G",
|
|
756
|
+
"memory.max": "16G",
|
|
757
|
+
"io.weight": 100,
|
|
758
|
+
"pids.max": 1024
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
"name": "idle",
|
|
763
|
+
"priority": 4,
|
|
764
|
+
"cpuWeight": 1,
|
|
765
|
+
"cpuWeightNice": 19,
|
|
766
|
+
"cpuGuarantee": "0%",
|
|
767
|
+
"cpuMax": "50000 100000",
|
|
768
|
+
"description": "Idle: cpu.idle=1, lowest priority, only when system fully idle, first reclaim",
|
|
769
|
+
"memoryPolicy": "reclaim-first",
|
|
770
|
+
"ioPolicy": "idle",
|
|
771
|
+
"ioWeight": 1,
|
|
772
|
+
"memoryHigh": "2G",
|
|
773
|
+
"memoryMax": "4G",
|
|
774
|
+
"pidsMax": 256,
|
|
775
|
+
"behavior": "cpu.idle=1, runs ONLY when no other cgroup wants CPU",
|
|
776
|
+
"useCase": "Background cleanup, idle batch, scavenger workloads",
|
|
777
|
+
"exampleTenant": "idle-pool",
|
|
778
|
+
"cgroupAnnotations": {
|
|
779
|
+
"cpu.weight": 1,
|
|
780
|
+
"cpu.idle": 1,
|
|
781
|
+
"cpu.max": "50000 100000",
|
|
782
|
+
"memory.high": "2G",
|
|
783
|
+
"memory.max": "4G",
|
|
784
|
+
"io.weight": 1,
|
|
785
|
+
"pids.max": 256
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
]
|
|
789
|
+
},
|
|
790
|
+
"transcode": {
|
|
791
|
+
"ffmpeg": {
|
|
792
|
+
"version": "7.1.1",
|
|
793
|
+
"releaseDate": "2025-05-11",
|
|
794
|
+
"buildConfig": "--enable-gpl --enable-nonfree --enable-cuda --enable-cuvid --enable-nvenc --enable-cuda-llvm --enable-libsvtav1 --enable-libvvenc --enable-libvmaf --enable-libnpp --enable-nvdec --enable-ffnvcodec --enable-vulkan",
|
|
795
|
+
"cudaSdk": "12.9",
|
|
796
|
+
"ffnvcodec": "13.0.19",
|
|
797
|
+
"driverMinimum": "570.144",
|
|
798
|
+
"hardwareAccel": [
|
|
799
|
+
"cuda",
|
|
800
|
+
"vdpau",
|
|
801
|
+
"vulkan",
|
|
802
|
+
"qsv_stub_disabled"
|
|
803
|
+
],
|
|
804
|
+
"libPriority": [
|
|
805
|
+
"libsvtav1",
|
|
806
|
+
"hevc_nvenc_blackwell",
|
|
807
|
+
"av1_nvenc_blackwell",
|
|
808
|
+
"libvvenc",
|
|
809
|
+
"h264_nvenc"
|
|
810
|
+
]
|
|
811
|
+
},
|
|
812
|
+
"nvenc": {
|
|
813
|
+
"generation": "8th Gen",
|
|
814
|
+
"architecture": "blackwell",
|
|
815
|
+
"chipList": [
|
|
816
|
+
"gb202",
|
|
817
|
+
"gb203",
|
|
818
|
+
"gb100",
|
|
819
|
+
"gb200",
|
|
820
|
+
"rtx pro 6000"
|
|
821
|
+
],
|
|
822
|
+
"sdkVersion": "13.0.19",
|
|
823
|
+
"capabilities": [
|
|
824
|
+
"av1_444_10bit",
|
|
825
|
+
"hevc_444_10bit",
|
|
826
|
+
"h264_444",
|
|
827
|
+
"av1_bframes",
|
|
828
|
+
"hevc_bframes_refmode2",
|
|
829
|
+
"split-frame-8k60",
|
|
830
|
+
"temporal_filter_8k"
|
|
831
|
+
],
|
|
832
|
+
"encoderInstancesRtx5090": 7,
|
|
833
|
+
"encoderInstancesPro6000": 7,
|
|
834
|
+
"decoderInstances": 7,
|
|
835
|
+
"maxResolution": "8192x8192",
|
|
836
|
+
"maxFps8k": 60,
|
|
837
|
+
"hdrSupport": [
|
|
838
|
+
"hdr10",
|
|
839
|
+
"hdr10plus",
|
|
840
|
+
"dolbyvision_8.4_ll",
|
|
841
|
+
"hlg"
|
|
842
|
+
],
|
|
843
|
+
"rateControl": [
|
|
844
|
+
"cbr",
|
|
845
|
+
"vbr",
|
|
846
|
+
"cq",
|
|
847
|
+
"constqp",
|
|
848
|
+
"cbr_hq",
|
|
849
|
+
"vbr_hq",
|
|
850
|
+
"cqp",
|
|
851
|
+
"icq"
|
|
852
|
+
],
|
|
853
|
+
"lowLatency": [
|
|
854
|
+
"ultra_low",
|
|
855
|
+
"low",
|
|
856
|
+
"high_quality"
|
|
857
|
+
],
|
|
858
|
+
"qualityPreset": "p7"
|
|
859
|
+
},
|
|
860
|
+
"codecs": {
|
|
861
|
+
"supported": [
|
|
862
|
+
"h264",
|
|
863
|
+
"hevc",
|
|
864
|
+
"av1",
|
|
865
|
+
"svt-av1",
|
|
866
|
+
"vvc",
|
|
867
|
+
"prores",
|
|
868
|
+
"dnxhr"
|
|
869
|
+
],
|
|
870
|
+
"h264": {
|
|
871
|
+
"encoder": "h264_nvenc",
|
|
872
|
+
"decoder": "h264_cuvid",
|
|
873
|
+
"profile": "high444",
|
|
874
|
+
"pixFmt": "yuv444p10le",
|
|
875
|
+
"presetDefault": "p7",
|
|
876
|
+
"tier": "legacy"
|
|
877
|
+
},
|
|
878
|
+
"hevc": {
|
|
879
|
+
"encoder": "hevc_nvenc",
|
|
880
|
+
"decoder": "hevc_cuvid",
|
|
881
|
+
"profile": "main10",
|
|
882
|
+
"pixFmt": "yuv420p10le",
|
|
883
|
+
"presetDefault": "p7",
|
|
884
|
+
"bframes": 4,
|
|
885
|
+
"tier": "mezzanine"
|
|
886
|
+
},
|
|
887
|
+
"av1": {
|
|
888
|
+
"encoder": "av1_nvenc",
|
|
889
|
+
"decoder": "av1_cuvid",
|
|
890
|
+
"profile": "main",
|
|
891
|
+
"pixFmt": "yuv420p10le",
|
|
892
|
+
"presetDefault": "p7",
|
|
893
|
+
"enableBframes": true,
|
|
894
|
+
"tier": "distribution"
|
|
895
|
+
},
|
|
896
|
+
"svtav1": {
|
|
897
|
+
"version": "2.3.0",
|
|
898
|
+
"encoder": "libsvtav1",
|
|
899
|
+
"encoderAlt": "av1_nvenc",
|
|
900
|
+
"presetRange": "0-13",
|
|
901
|
+
"presetDefault": 6,
|
|
902
|
+
"presetFast1080pHls": 8,
|
|
903
|
+
"presetQuality4k": 4,
|
|
904
|
+
"crfRange": "20-55",
|
|
905
|
+
"crfDefault": 33,
|
|
906
|
+
"keyint1080p": 72,
|
|
907
|
+
"tune": "subjective, psnr, ssim, vmaf",
|
|
908
|
+
"usage": "cpu fallback + high quality vod when nvenc saturated",
|
|
909
|
+
"installVia": "native apt + pipelinememorypassage.ts"
|
|
910
|
+
},
|
|
911
|
+
"vvc": {
|
|
912
|
+
"versionVvenc": "1.12.0",
|
|
913
|
+
"versionVvdec": "3.0.0",
|
|
914
|
+
"encoder": "libvvenc",
|
|
915
|
+
"decoder": "vvdec",
|
|
916
|
+
"preset": "medium",
|
|
917
|
+
"tier": "archival_future",
|
|
918
|
+
"resolutions": [
|
|
919
|
+
"8k",
|
|
920
|
+
"4k",
|
|
921
|
+
"1080p"
|
|
922
|
+
],
|
|
923
|
+
"main10": true,
|
|
924
|
+
"hdr10": true,
|
|
925
|
+
"maxGop": 64,
|
|
926
|
+
"note": "experimental mezzanine for film8k archival, 40% bitrate saving vs hevc reference"
|
|
927
|
+
}
|
|
928
|
+
},
|
|
929
|
+
"pipelines": {
|
|
930
|
+
"active": [
|
|
931
|
+
"hls1080p",
|
|
932
|
+
"creator4kav1",
|
|
933
|
+
"film8kmezzanine"
|
|
934
|
+
],
|
|
935
|
+
"defaultPipeline": "hls1080p",
|
|
936
|
+
"errorPolicy": "retry_3 + fallback_cpu_svtav1",
|
|
937
|
+
"hls1080p": {
|
|
938
|
+
"name": "hls1080p",
|
|
939
|
+
"description": "adaptive hls ladder 1080p->144p with blackwell nvenc p5 balanced",
|
|
940
|
+
"vcpusRequired": 4,
|
|
941
|
+
"ramMbRequired": 2048,
|
|
942
|
+
"vramMbRequired": 2048,
|
|
943
|
+
"ffmpegCmdFragment": "-hwaccel cuda -hwaccel_output_format cuda -i {input} -c:v h264_nvenc -preset p5 -rc vbr_hq -cq 23 -multipass qres -b:v 5M -maxrate 6M -g 48 -c:a aac -b:a 128k -hls_time 4 -hls_playlist_type vod",
|
|
944
|
+
"ladder": [
|
|
945
|
+
{
|
|
946
|
+
"width": 1920,
|
|
947
|
+
"height": 1080,
|
|
948
|
+
"bitrate": "5000k",
|
|
949
|
+
"codec": "h264_nvenc"
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"width": 1280,
|
|
953
|
+
"height": 720,
|
|
954
|
+
"bitrate": "2800k",
|
|
955
|
+
"codec": "h264_nvenc"
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
"width": 854,
|
|
959
|
+
"height": 480,
|
|
960
|
+
"bitrate": "1400k",
|
|
961
|
+
"codec": "h264_nvenc"
|
|
962
|
+
},
|
|
963
|
+
{
|
|
964
|
+
"width": 640,
|
|
965
|
+
"height": 360,
|
|
966
|
+
"bitrate": "800k",
|
|
967
|
+
"codec": "h264_nvenc"
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"width": 256,
|
|
971
|
+
"height": 144,
|
|
972
|
+
"bitrate": "300k",
|
|
973
|
+
"codec": "h264_nvenc"
|
|
974
|
+
}
|
|
975
|
+
],
|
|
976
|
+
"segmentDuration": 4,
|
|
977
|
+
"targetLatency": "low",
|
|
978
|
+
"gpuProfile": "any blackwell >= 8GB"
|
|
979
|
+
},
|
|
980
|
+
"creator4kav1": {
|
|
981
|
+
"name": "creator4kav1",
|
|
982
|
+
"description": "creator 4k av1 hdr10 10bit nvenc p7 quality + svt-av1 fallback",
|
|
983
|
+
"hardwareAnchor": "rtx 5090",
|
|
984
|
+
"vcpusRequired": 32,
|
|
985
|
+
"ramMbRequired": 65536,
|
|
986
|
+
"vramMbRequired": 23552,
|
|
987
|
+
"ffmpegCmdFragment": "-hwaccel cuda -hwaccel_output_format cuda -i {input} -c:v av1_nvenc -preset p7 -tune hq -rc vbr_hq -cq 28 -b:v 12M -maxrate 15M -profile:v main -pix_fmt p010le -multipass fullres -2pass 1 -g 120 -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020 -c:a libopus -b:a 160k",
|
|
988
|
+
"codecPrimary": "av1_nvenc",
|
|
989
|
+
"codecFallback": "libsvtav1",
|
|
990
|
+
"resolution": "3840x2160",
|
|
991
|
+
"fps": [
|
|
992
|
+
24,
|
|
993
|
+
30,
|
|
994
|
+
60
|
|
995
|
+
],
|
|
996
|
+
"hdr": "hdr10",
|
|
997
|
+
"tenBit": true,
|
|
998
|
+
"bframesEnabled": true,
|
|
999
|
+
"gpuRequired": "rtx5090 0.5 share",
|
|
1000
|
+
"vmafTarget": 93,
|
|
1001
|
+
"pipelineMemory": "pipelinememorypassage.ts",
|
|
1002
|
+
"referenceBoard": "boards.json rtx5090 entry"
|
|
1003
|
+
},
|
|
1004
|
+
"film8kmezzanine": {
|
|
1005
|
+
"name": "film8kmezzanine",
|
|
1006
|
+
"description": "film8k mezzanine 8192x4320 prores/vvc archive tier on pro 6000 96GB",
|
|
1007
|
+
"hardwareAnchor": "rtx pro 6000 workstation 96GB",
|
|
1008
|
+
"vcpusRequired": 96,
|
|
1009
|
+
"ramMbRequired": 196608,
|
|
1010
|
+
"vramMbRequired": 98304,
|
|
1011
|
+
"ramMinFor8k": 98304,
|
|
1012
|
+
"vramOptimal": 98304,
|
|
1013
|
+
"ffmpegCmdFragmentPrimary": "-hwaccel cuda -i {input} -c:v hevc_nvenc -preset p7 -rc constqp -qp 18 -profile:v main10 -pix_fmt p010le -g 1 -c:a pcm_s24le",
|
|
1014
|
+
"ffmpegCmdFragmentVvc": "-i {input} -c:v libvvenc -preset medium -qp 22 -tier high -profile main_10 -g 32 -vvenc_params highbitrate",
|
|
1015
|
+
"codecPrimary": "hevc_nvenc",
|
|
1016
|
+
"codecMezzanine": "prores_ks",
|
|
1017
|
+
"codecFuture": "libvvenc",
|
|
1018
|
+
"resolution": "8192x4320",
|
|
1019
|
+
"fps": 24,
|
|
1020
|
+
"colorspace": "bt2020nc",
|
|
1021
|
+
"pixFmtMezzanine": "yuv444p12le",
|
|
1022
|
+
"storageTier": "mezzanine",
|
|
1023
|
+
"gpuRequired": "pro6000 full or pro6000 96GB unified memory",
|
|
1024
|
+
"temporalIsolation": true,
|
|
1025
|
+
"maxConcurrentJobs": 1,
|
|
1026
|
+
"note": "observer enforces dedicated node when vram > 96GB to avoid time-slice jitter"
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
},
|
|
1030
|
+
"hardware": {
|
|
1031
|
+
"nvidia": {
|
|
1032
|
+
"rtx5090": {
|
|
1033
|
+
"model": "geforce rtx 5090",
|
|
1034
|
+
"architecture": "blackwell gb202",
|
|
1035
|
+
"vramGb": 32,
|
|
1036
|
+
"vramActualMb": 32768,
|
|
1037
|
+
"vramType": "gddr7",
|
|
1038
|
+
"bus": "pcie 5.0 x16",
|
|
1039
|
+
"cudaCores": 21760,
|
|
1040
|
+
"tensorGen": "5th",
|
|
1041
|
+
"rtGen": "4th",
|
|
1042
|
+
"nvencGen": "8th gen",
|
|
1043
|
+
"nvencCount": 3,
|
|
1044
|
+
"nvdecCount": 2,
|
|
1045
|
+
"tdpW": 575,
|
|
1046
|
+
"powerConnector": "12v-2x6 600W",
|
|
1047
|
+
"displayport": "2.1b",
|
|
1048
|
+
"driverCurrent": "570.144",
|
|
1049
|
+
"releaseDate": "2025-01-30",
|
|
1050
|
+
"msrpUsd": 1999,
|
|
1051
|
+
"saddleProfile": "creator 32/65536/23552",
|
|
1052
|
+
"compatiblePipeline": "creator4kav1"
|
|
1053
|
+
},
|
|
1054
|
+
"pro6000": {
|
|
1055
|
+
"model": "rtx pro 6000 workstation edition",
|
|
1056
|
+
"architecture": "blackwell gb202 ws",
|
|
1057
|
+
"formerName": "rtx 6000 ada successor",
|
|
1058
|
+
"vramGb": 96,
|
|
1059
|
+
"vramActualMb": 98304,
|
|
1060
|
+
"vramType": "gddr7 ecc",
|
|
1061
|
+
"bus": "pcie 5.0 x16",
|
|
1062
|
+
"cudaCores": 24064,
|
|
1063
|
+
"tensorGen": "5th",
|
|
1064
|
+
"rtGen": "4th",
|
|
1065
|
+
"nvencGen": "8th gen 2x concurrent",
|
|
1066
|
+
"nvdecGen": "6th gen",
|
|
1067
|
+
"nvencCount": 3,
|
|
1068
|
+
"nvdecCount": 4,
|
|
1069
|
+
"tdpW": 600,
|
|
1070
|
+
"powerConnector": "12v-2x6",
|
|
1071
|
+
"ecc": true,
|
|
1072
|
+
"driverCurrent": "570.144",
|
|
1073
|
+
"releaseDate": "2025-04-15",
|
|
1074
|
+
"msrpUsd": 8435,
|
|
1075
|
+
"saddleProfile": "ml 192/262144/98304 and film8k mezzanine 96GB",
|
|
1076
|
+
"compatiblePipeline": "film8kmezzanine",
|
|
1077
|
+
"migEnabled": false,
|
|
1078
|
+
"vGPUSupported": true,
|
|
1079
|
+
"unifiedMemory": "96GB gddr7 + host unified via nvlink-c2c on gb200"
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
},
|
|
1083
|
+
"scheduling": {
|
|
1084
|
+
"scheduler": "cfs+eevdf+time-sliced-nvenc",
|
|
1085
|
+
"timeSliceUs": 5000,
|
|
1086
|
+
"burstSliceUs": 10000,
|
|
1087
|
+
"fairnessQuantum": 200,
|
|
1088
|
+
"jitterToleranceUs": 100,
|
|
1089
|
+
"temporalIsolation": true,
|
|
1090
|
+
"maxTenants": 128,
|
|
1091
|
+
"overcommitPolicy": "conservative",
|
|
1092
|
+
"qosWeights": {
|
|
1093
|
+
"gold": 1024,
|
|
1094
|
+
"silver": 512,
|
|
1095
|
+
"bronze": 128,
|
|
1096
|
+
"platinum": 2048
|
|
1097
|
+
},
|
|
1098
|
+
"latencyBoost": 2.0,
|
|
1099
|
+
"deadlineScheduler": true,
|
|
1100
|
+
"sliceAccounting": true,
|
|
1101
|
+
"preemption": true
|
|
1102
|
+
},
|
|
1103
|
+
"memory": {
|
|
1104
|
+
"model": "pipelinememorypassage.ts",
|
|
1105
|
+
"implementation": "src pipeline memory passage with passage.config channel",
|
|
1106
|
+
"priorityInternal": true,
|
|
1107
|
+
"pageSize": "2MB hugepages",
|
|
1108
|
+
"numaBalancing": true,
|
|
1109
|
+
"eviction": "lru + qos aware",
|
|
1110
|
+
"cacheTier": [
|
|
1111
|
+
"vram",
|
|
1112
|
+
"ram",
|
|
1113
|
+
"virtiofs"
|
|
1114
|
+
]
|
|
1115
|
+
},
|
|
1116
|
+
"dockerIntegration": {
|
|
1117
|
+
"cgroupDriver": "systemd",
|
|
1118
|
+
"engineVersion": "29.7.2",
|
|
1119
|
+
"integration": "Docker containers run inside MTTG cgroups for unified accounting",
|
|
1120
|
+
"dockerCgroupParent": "omni.slice",
|
|
1121
|
+
"exampleDaemonJson": "{ \"cgroup-parent\": \"omni.slice\", \"exec-opts\": [\"native.cgroupdriver=systemd\"] }"
|
|
1122
|
+
},
|
|
1123
|
+
"monitoringOmni": {
|
|
1124
|
+
"cpuStat": "/sys/fs/cgroup/omni.slice/*/cpu.stat",
|
|
1125
|
+
"memoryCurrent": "/sys/fs/cgroup/omni.slice/*/memory.current",
|
|
1126
|
+
"ioStat": "/sys/fs/cgroup/omni.slice/*/io.stat",
|
|
1127
|
+
"pidsCurrent": "/sys/fs/cgroup/omni.slice/*/pids.current",
|
|
1128
|
+
"prometheusExporter": "cgroups_exporter 1.6.0",
|
|
1129
|
+
"grafanaDashboard": "MTTG cgroups v2 dashboard"
|
|
1130
|
+
},
|
|
1131
|
+
"observability": {
|
|
1132
|
+
"metricsPort": 9092,
|
|
1133
|
+
"tracing": "otlp",
|
|
1134
|
+
"logLevel": "info",
|
|
1135
|
+
"dashboards": [
|
|
1136
|
+
"grafana mttg scheduler",
|
|
1137
|
+
"nvidia dcgm",
|
|
1138
|
+
"ffmpeg transcode throughput"
|
|
1139
|
+
],
|
|
1140
|
+
"exportPath": "/var/log/mttg/metrics.jsonl",
|
|
1141
|
+
"pprofEnabled": true,
|
|
1142
|
+
"vmafEnabled": true
|
|
1143
|
+
},
|
|
1144
|
+
"ui": {
|
|
1145
|
+
"touchTargetPx": 44,
|
|
1146
|
+
"compliantWith": "wcag 2.2 aa + apple hmi 44pt",
|
|
1147
|
+
"scaleFactor": 1.0,
|
|
1148
|
+
"observerNote": "third person observer validates 44px min tap target in renderer",
|
|
1149
|
+
"components": [
|
|
1150
|
+
"pipeline selector",
|
|
1151
|
+
"resource slider",
|
|
1152
|
+
"preset dropdown",
|
|
1153
|
+
"gpu monitor"
|
|
1154
|
+
]
|
|
1155
|
+
},
|
|
1156
|
+
"modes": {
|
|
1157
|
+
"modes": [
|
|
1158
|
+
"transcode-h264",
|
|
1159
|
+
"transcode-hevc",
|
|
1160
|
+
"transcode-av1-nvenc",
|
|
1161
|
+
"transcode-svtav1-cpu",
|
|
1162
|
+
"transcode-vvc",
|
|
1163
|
+
"mezzanine-prores",
|
|
1164
|
+
"mezzanine-dnxhr",
|
|
1165
|
+
"pipeline-hls1080p",
|
|
1166
|
+
"pipeline-creator4kav1",
|
|
1167
|
+
"pipeline-film8k",
|
|
1168
|
+
"resource-tiny",
|
|
1169
|
+
"resource-oddprime",
|
|
1170
|
+
"resource-creator",
|
|
1171
|
+
"resource-ml",
|
|
1172
|
+
"resource-hyperscale",
|
|
1173
|
+
"gpu-rtx5090",
|
|
1174
|
+
"gpu-pro6000-96gb",
|
|
1175
|
+
"gpu-b200-192gb",
|
|
1176
|
+
"gpu-gb200-super",
|
|
1177
|
+
"scheduling-cfs-eevdf",
|
|
1178
|
+
"errorcatcher-circuit",
|
|
1179
|
+
"ui-44px-observer",
|
|
1180
|
+
"forge-mirror-cuda",
|
|
1181
|
+
"forge-mirror-ffmpeg",
|
|
1182
|
+
"vm-qemu-kvm",
|
|
1183
|
+
"docker-nvidia-runtime",
|
|
1184
|
+
"passage-protocol",
|
|
1185
|
+
"memory-passage",
|
|
1186
|
+
"vram-management",
|
|
1187
|
+
"vcpu-scheduling",
|
|
1188
|
+
"benchmark-vmaf"
|
|
1189
|
+
],
|
|
1190
|
+
"maxPerFile": 20,
|
|
1191
|
+
"groupingRule": "20-25 contexts per file, logic grouped by correlated category",
|
|
1192
|
+
"subagentsGrouped": true,
|
|
1193
|
+
"maxTasksPerGroup": 10
|
|
1194
|
+
},
|
|
1195
|
+
"forge": {
|
|
1196
|
+
"mirrors": [
|
|
1197
|
+
"https://registry.saddle.dev/ffmpeg",
|
|
1198
|
+
"https://registry.saddle.dev/nvidia",
|
|
1199
|
+
"https://registry.saddle.dev/svtav1"
|
|
1200
|
+
],
|
|
1201
|
+
"rootConfigFixed": true,
|
|
1202
|
+
"rootDirectFiles": [
|
|
1203
|
+
"mttg.config",
|
|
1204
|
+
"vm.config",
|
|
1205
|
+
"gpu.config",
|
|
1206
|
+
"passage.config",
|
|
1207
|
+
"qemu.config",
|
|
1208
|
+
"docker.config",
|
|
1209
|
+
"boards.json",
|
|
1210
|
+
"cores.json",
|
|
1211
|
+
"processors.json",
|
|
1212
|
+
"gpus.json",
|
|
1213
|
+
"vcpus.json",
|
|
1214
|
+
"vram.json"
|
|
1215
|
+
],
|
|
1216
|
+
"modeFolders": [
|
|
1217
|
+
"saddle-modes-ffmpeg",
|
|
1218
|
+
"saddle-modes-gpu",
|
|
1219
|
+
"saddle-modes-pipeline"
|
|
1220
|
+
],
|
|
1221
|
+
"registryAuth": "ecr + ghcr mirror"
|
|
1222
|
+
},
|
|
1223
|
+
"validation": {
|
|
1224
|
+
"validationDate": "2026-08-22",
|
|
1225
|
+
"examplesValidated": [
|
|
1226
|
+
{
|
|
1227
|
+
"name": "tiny",
|
|
1228
|
+
"vcpu": 1,
|
|
1229
|
+
"ramMb": 512,
|
|
1230
|
+
"vramMb": 1024
|
|
1231
|
+
},
|
|
1232
|
+
{
|
|
1233
|
+
"name": "oddprime",
|
|
1234
|
+
"vcpu": 37,
|
|
1235
|
+
"ramMb": 7919,
|
|
1236
|
+
"vramMb": 7183
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
"name": "creator",
|
|
1240
|
+
"vcpu": 32,
|
|
1241
|
+
"ramMb": 65536,
|
|
1242
|
+
"vramMb": 23552
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
"name": "ml",
|
|
1246
|
+
"vcpu": 192,
|
|
1247
|
+
"ramMb": 262144,
|
|
1248
|
+
"vramMb": 98304
|
|
1249
|
+
},
|
|
1250
|
+
{
|
|
1251
|
+
"name": "hyperscale",
|
|
1252
|
+
"vcpu": 1024,
|
|
1253
|
+
"ramMb": 2097152,
|
|
1254
|
+
"vramMb": 196608
|
|
1255
|
+
}
|
|
1256
|
+
],
|
|
1257
|
+
"pipelinesValidated": [
|
|
1258
|
+
"hls1080p",
|
|
1259
|
+
"creator4kav1 rtx 5090",
|
|
1260
|
+
"film8k mezzanine 96GB pro 6000"
|
|
1261
|
+
],
|
|
1262
|
+
"versionsVerified": [
|
|
1263
|
+
"ffmpeg 7.1.1",
|
|
1264
|
+
"nvenc blackwell 8th gen sdk 13.0.19",
|
|
1265
|
+
"svt-av1 2.3.0",
|
|
1266
|
+
"vvenc 1.12.0 vvdec 3.0.0",
|
|
1267
|
+
"node 26.7.0 current",
|
|
1268
|
+
"typescript 7.0.2",
|
|
1269
|
+
"python 3.14.7",
|
|
1270
|
+
"docker 29.7.2",
|
|
1271
|
+
"qemu 11.1.0",
|
|
1272
|
+
"github actions checkout@v7.0.1 setup-node@v7.0.0 setup-python@v7.0.0"
|
|
1273
|
+
],
|
|
1274
|
+
"thirdPersonObserver": "the observer confirms compliance with v6 skill architecture root-first flat 44px errorcatcher"
|
|
1275
|
+
},
|
|
1276
|
+
"errorcatcher": {
|
|
1277
|
+
"enabled": true,
|
|
1278
|
+
"mode": "observer-catcher + circuit-breaker",
|
|
1279
|
+
"catchList": [
|
|
1280
|
+
"nvenc init failure",
|
|
1281
|
+
"cuda out of memory",
|
|
1282
|
+
"svt-av1 segfault fallback",
|
|
1283
|
+
"vvenc gop overrun",
|
|
1284
|
+
"qemu vfio reset",
|
|
1285
|
+
"docker cdi spec missing",
|
|
1286
|
+
"vram allocation denied",
|
|
1287
|
+
"ffmpeg filter graph invalid"
|
|
1288
|
+
],
|
|
1289
|
+
"fallbackChain": [
|
|
1290
|
+
"retry cuda",
|
|
1291
|
+
"fallback svt-av1 cpu",
|
|
1292
|
+
"fallback libx264",
|
|
1293
|
+
"emit error json"
|
|
1294
|
+
],
|
|
1295
|
+
"logSink": "stderr + otlp trace",
|
|
1296
|
+
"metricsCounter": "mttg_errors_total",
|
|
1297
|
+
"touchFile": "/tmp/mttg_error.json"
|
|
1298
|
+
},
|
|
1299
|
+
"omniMeta": {
|
|
1300
|
+
"version": "5.0.0",
|
|
1301
|
+
"generated": "2026-08-22T00:00:00Z",
|
|
1302
|
+
"engine": "mttg",
|
|
1303
|
+
"kernelStable": "7.1.9",
|
|
1304
|
+
"kernelLts": "6.18.45",
|
|
1305
|
+
"qemuVersion": "11.1.0",
|
|
1306
|
+
"libvirtVersion": "12.5.0",
|
|
1307
|
+
"dockerVersion": "29.7.2",
|
|
1308
|
+
"nodeLts": "24.19.0",
|
|
1309
|
+
"nodeCurrent": "26.7.0",
|
|
1310
|
+
"typescript": "7.0.2",
|
|
1311
|
+
"runner": "2.336.0",
|
|
1312
|
+
"description": "Multi-Tenant Task Groups - cgroups v2 based resource isolation and QoS"
|
|
1313
|
+
},
|
|
1314
|
+
"omniToolchain": {
|
|
1315
|
+
"kernelStable": "7.1.9",
|
|
1316
|
+
"kernelLts": "6.18.45",
|
|
1317
|
+
"qemu": "11.1.0",
|
|
1318
|
+
"libvirt": "12.5.0",
|
|
1319
|
+
"docker": "29.7.2",
|
|
1320
|
+
"buildx": "0.36.0",
|
|
1321
|
+
"compose": "5.3.0",
|
|
1322
|
+
"nodeLts": "24.19.0",
|
|
1323
|
+
"nodeCurrent": "26.7.0",
|
|
1324
|
+
"typescript": "7.0.2",
|
|
1325
|
+
"runner": "2.336.0",
|
|
1326
|
+
"checkout": "v6",
|
|
1327
|
+
"setupNode": "v6",
|
|
1328
|
+
"libbpf": "1.6.0",
|
|
1329
|
+
"bpftool": "7.5.0",
|
|
1330
|
+
"schedExt": "bp-1.2.0",
|
|
1331
|
+
"bore": "6.12.15-bore"
|
|
1332
|
+
},
|
|
1333
|
+
"pipeline": {
|
|
1334
|
+
"description": "The 24-stage GPU-accelerated transcode pipeline of the pool pipelinememorypassage family. The stages are media/transcode domain and live canonically in media.ts (stagecatalog + stageorderv5 for the alternate v5 ordering provenance); this section keeps only the MTTG scheduling policy that drives them.",
|
|
1335
|
+
"implementation": "media.ts (mediapipeline + createoptimal + buildffmpegcommand + passagesecurechannel)",
|
|
1336
|
+
"stageCount": 24,
|
|
1337
|
+
"stageNames": [
|
|
1338
|
+
"01_ingest_audit",
|
|
1339
|
+
"02_probe_ffprobe71",
|
|
1340
|
+
"03_tieredmemory_reserve",
|
|
1341
|
+
"04_hugepage_alloc_2m1g",
|
|
1342
|
+
"05_zram_lzorle_zstd",
|
|
1343
|
+
"06_cxl_map_v2_v3",
|
|
1344
|
+
"07_vcpu_pin_ccd_x3d",
|
|
1345
|
+
"08_hwaccel_detect_blackwell",
|
|
1346
|
+
"09_hwupload_cuda",
|
|
1347
|
+
"10_deinterlace_bwdif_cuda",
|
|
1348
|
+
"11_scale_cuda_npp",
|
|
1349
|
+
"12_tonemap_bt2020_cuda",
|
|
1350
|
+
"13_denoise_cuda",
|
|
1351
|
+
"14_color_mgmt",
|
|
1352
|
+
"15_nvenc_blackwell_encode",
|
|
1353
|
+
"16_qsv_fallback",
|
|
1354
|
+
"17_audio_transcode",
|
|
1355
|
+
"18_subtitle_burn",
|
|
1356
|
+
"19_mux_container",
|
|
1357
|
+
"20_passage_message_vsock",
|
|
1358
|
+
"21_qemu_balloon_notify",
|
|
1359
|
+
"22_tiered_reclaim",
|
|
1360
|
+
"23_mttg_slice_report",
|
|
1361
|
+
"24_artifact_gc_finalize"
|
|
1362
|
+
],
|
|
1363
|
+
"stageOrderingProvenance": {
|
|
1364
|
+
"v6": "pipelinememorypassage.ts — memory stages 03-07 precede GPU work; CCD0 V-Cache carries the video filter chain",
|
|
1365
|
+
"v5": "src_pipeline_memory_passage.ts (src_mttg_pipeline) — demux/decode walk with sharpen, crop_pad, overlay_logo, thumbnail and upload_egress kept in stageorderv5"
|
|
1366
|
+
},
|
|
1367
|
+
"policy": {
|
|
1368
|
+
"name": "create_optimal",
|
|
1369
|
+
"source": "pool:src_virtualization_core.cpp EncodingOptimizationManager::create_optimal",
|
|
1370
|
+
"mediaTsRef": "media.ts createoptimal()",
|
|
1371
|
+
"encoderSelection": [
|
|
1372
|
+
"AV1 at width>=3840 and height>=2160 forces the Blackwell dual NVENC encoder (best AV1 quality of 2026)",
|
|
1373
|
+
"H264 ultra-low-latency (cbr_low_latency mode) prefers Intel QuickSync",
|
|
1374
|
+
"AMD hosts prefer AMF for 1080p power efficiency",
|
|
1375
|
+
"no hardware match falls back to software x265 4.1 + SVT-AV1 (max 32 instances)"
|
|
1376
|
+
],
|
|
1377
|
+
"presetRecommendation": {
|
|
1378
|
+
"ultraLowLatency": "p1",
|
|
1379
|
+
"lowLatency": "p2",
|
|
1380
|
+
"live": "p3",
|
|
1381
|
+
"vodAv1": "p5",
|
|
1382
|
+
"vodHevc": "p6",
|
|
1383
|
+
"default": "p4"
|
|
1384
|
+
},
|
|
1385
|
+
"instanceRecommendation": "pixel-count throttle: base 5 (av1) / 8 (nvenc other) / 6 (qsv-amf) divided by megapixels/2, floor 1",
|
|
1386
|
+
"failFast": "first non-recoverable stage failure stops the walk; recoverable failures continue when mttg fail_fast=false",
|
|
1387
|
+
"skipRules": {
|
|
1388
|
+
"10DeinterlaceBwdifCuda": "skip when probe.interlaced is false",
|
|
1389
|
+
"12TonemapBt2020Cuda": "skip when not (probe.hdr and job.tonemap)",
|
|
1390
|
+
"13DenoiseCuda": "skip when mode lacks denoise/hqdn",
|
|
1391
|
+
"16QsvFallback": "skip when a hardware backend won the create_optimal policy",
|
|
1392
|
+
"18SubtitleBurn": "skip when no subtitle path"
|
|
1393
|
+
}
|
|
1394
|
+
},
|
|
1395
|
+
"stage20PassageContract": {
|
|
1396
|
+
"transport": "vsock+virtio-serial",
|
|
1397
|
+
"encryption": "chacha20-poly1305",
|
|
1398
|
+
"auth": "ed25519",
|
|
1399
|
+
"mtu": 65536,
|
|
1400
|
+
"control": "vsock://2:1024",
|
|
1401
|
+
"implementation": "media.ts passagesecurechannel (seal/open over the RFC 8439 AEAD of security.ts)"
|
|
1402
|
+
},
|
|
1403
|
+
"mergedFrom": [
|
|
1404
|
+
"pool:pipelinememorypassage.ts [S6 v6 — 24 stages + policy, UNIQUE]",
|
|
1405
|
+
"pool:src_pipeline_memory_passage.ts [V5 — stage ordering + skip rules]",
|
|
1406
|
+
"pool:src_virtualization_core.cpp [create_optimal encoder policy]"
|
|
1407
|
+
]
|
|
1408
|
+
}
|
|
1409
|
+
},
|
|
1410
|
+
"mttcg": {
|
|
1411
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1412
|
+
"summary": {
|
|
1413
|
+
"what": "MTTCG runs each vCPU on its own host thread, each executing translated code from a shared translation block cache.",
|
|
1414
|
+
"oneLine": "1 vCPU = 1 host pthread executing TCG-translated guest code.",
|
|
1415
|
+
"since": "QEMU 2.8 (2016); default for supported host/guest pairs since QEMU 3.0",
|
|
1416
|
+
"relevance": "the entire VHE CI strategy on GitHub-hosted runners (no /dev/kvm) rests on MTTCG"
|
|
1417
|
+
},
|
|
1418
|
+
"architecture": {
|
|
1419
|
+
"perVcpuThread": {
|
|
1420
|
+
"description": "QEMU spawns one QEMUThread per vCPU; each thread runs its own TCG translator loop and executes translated host code for that vCPU.",
|
|
1421
|
+
"threadNaming": "vCPU threads appear as qemu-system-x86_64 processes/threads in /proc/<pid>/task; map via QMP query-cpus-fast",
|
|
1422
|
+
"exit": "vCPU hot-unplug parks the thread (cpu->exit_request)"
|
|
1423
|
+
},
|
|
1424
|
+
"translationBlockCache": {
|
|
1425
|
+
"description": "Translated guest code (TranslationBlocks) lives in one shared code buffer sized by tb-size (MiB).",
|
|
1426
|
+
"sizeFlag": "-accel tcg,tb-size=<MiB> (512-1024 recommended for builds)",
|
|
1427
|
+
"flush": "cache full triggers a full flush and retranslation - larger tb-size reduces flush frequency on big code footprints",
|
|
1428
|
+
"shared": "all vCPU threads share the cache; a block translated by vCPU 0 is reused by vCPU 1"
|
|
1429
|
+
},
|
|
1430
|
+
"qht": {
|
|
1431
|
+
"name": "QEMU Hash Table (QHT)",
|
|
1432
|
+
"description": "lockless (RCU-protected) hash table mapping guest PC -> TranslationBlock; readers scale without contention on the lookup fast path",
|
|
1433
|
+
"source": "util/qht.c in the QEMU tree"
|
|
1434
|
+
},
|
|
1435
|
+
"tbInvalidation": {
|
|
1436
|
+
"description": "when guest code modifies itself or memory mappings change, TBs must be invalidated across all vCPU threads; performed via RCU lists + tb_lock coordination",
|
|
1437
|
+
"cost": "self-modifying-code-heavy workloads (JITs inside the guest, e.g. V8/CPython JIT) suffer invalidation storms - expect lower speedups"
|
|
1438
|
+
},
|
|
1439
|
+
"memoryModelRule": {
|
|
1440
|
+
"description": "MTTCG is enabled only when the guest memory model is compatible with the host memory model (strongly-ordered guest on weakly-ordered host requires barriers that TCG cannot provide cheaply).",
|
|
1441
|
+
"x8664OnX8664": "allowed and DEFAULT",
|
|
1442
|
+
"aarch64OnX8664": "allowed (weak-on-strong)",
|
|
1443
|
+
"x8664OnAarch64": "not allowed - single-threaded TCG fallback",
|
|
1444
|
+
"check": "QEMU prints 'MTTCG is enabled' / uses thread=multi automatically; force with -accel tcg,thread=multi"
|
|
1445
|
+
}
|
|
1446
|
+
},
|
|
1447
|
+
"enablement": {
|
|
1448
|
+
"flagRecommended": "-accel tcg,thread=multi",
|
|
1449
|
+
"defaultBehavior": "thread=multi is chosen automatically for supported pairs (x86_64 guest on x86_64 host)",
|
|
1450
|
+
"forcesSingleThread": [
|
|
1451
|
+
"-icount (instruction counting / deterministic virtual time / record & replay) - MTTCG is incompatible with icount determinism",
|
|
1452
|
+
"cross-arch memory-model mismatch (e.g. x86_64 guest on weakly ordered ARM host)",
|
|
1453
|
+
"explicit -accel tcg,thread=single"
|
|
1454
|
+
],
|
|
1455
|
+
"verifyInsideProcess": "query the accelerator with QMP query-accels or observe the count of vCPU threads: ps -T -p <qemu-pid> | grep -c qemu-system"
|
|
1456
|
+
},
|
|
1457
|
+
"scalingTo192Vcpus": {
|
|
1458
|
+
"epyc9965Identity": "192 vCPU VM = 192 host threads (MTTCG), plus 1 main loop thread + async worker threads (AIO, vhost, etc.)",
|
|
1459
|
+
"fullSmt2Identity": "384 vCPUs (EPYC 9965 with SMT2) = 384 host threads - only sensible on >= 96-core hosts",
|
|
1460
|
+
"oversubscriptionGuidance": [
|
|
1461
|
+
"vCPUs <= host logical CPUs: full parallel translation and execution",
|
|
1462
|
+
"2x oversubscription: acceptable for I/O-bound sandboxes (edge profiles), CPU-bound builds degrade linearly",
|
|
1463
|
+
">=4x oversubscription: use it only for topology-visible spoofing (lscpu inside guest), not for throughput"
|
|
1464
|
+
],
|
|
1465
|
+
"hostThreadPlacement": "pin vCPU threads to host cores with taskset -pc <hostcpu> <tid> or cgroup cpuset (docker.json cpuset) to avoid migration cost",
|
|
1466
|
+
"githubRunnerReality": "ubuntu-latest provides 4 vCPUs: profiles above 8 vCPus on hosted CI are for identity tests, not throughput (cores.json host_sizing)"
|
|
1467
|
+
},
|
|
1468
|
+
"performanceTuning": {
|
|
1469
|
+
"tbSize": {
|
|
1470
|
+
"small": "128 MiB - dev profiles, fast start",
|
|
1471
|
+
"medium": "512 MiB - build profiles",
|
|
1472
|
+
"large": "1024 MiB - buildfarm/buildfarm-max, LLVM-class builds",
|
|
1473
|
+
"tradeoff": "tb-size is allocated from host RAM per VM process; 1024 MiB x N VMs adds up"
|
|
1474
|
+
},
|
|
1475
|
+
"avoidIcount": "never combine -icount with performance profiles; icount forces single-thread TCG and caps throughput at roughly 1/N of MTTCG on N cores",
|
|
1476
|
+
"jitHeavyGuests": "guest-side JITs (Node V8, PyPy, JVM) trigger TB invalidation storms; prefer running those directly in Docker (docker.json) and use QEMU only for topology/OS-level identities",
|
|
1477
|
+
"hostPinning": "taskset QEMU as a whole (taskset -c 0-191 qemu-system-x86_64 ...) so the scheduler cannot place 192 threads on 8 cores with cache thrash",
|
|
1478
|
+
"memoryBackend": "use memory-backend-ram with prealloc=on for large RAM identities to avoid zero-page faults during boot (-object memory-backend-ram,id=mem0,size=512G,prealloc=on -numa node,memdev=mem0)",
|
|
1479
|
+
"iothread": "add -object iothread,id=io0 and attach virtio-blk (iothread=io0) so disk I/O leaves vCPU threads free",
|
|
1480
|
+
"directKernelBoot": "-kernel/-initrd/-append skips firmware: seconds of boot time saved per VM (qemu.json microvm recipe)"
|
|
1481
|
+
},
|
|
1482
|
+
"benchmarksReference": {
|
|
1483
|
+
"methodology": "relative numbers; absolute speed depends on host and workload mix",
|
|
1484
|
+
"observations": [
|
|
1485
|
+
{
|
|
1486
|
+
"workload": "guest kernel/LLVM build",
|
|
1487
|
+
"mttcgVsStcg": "near-linear scaling up to host core count (e.g. 8 vCPUs on 8 host cores approx 7x vs thread=single)"
|
|
1488
|
+
},
|
|
1489
|
+
{
|
|
1490
|
+
"workload": "I/O-bound sandbox (npm install, API calls)",
|
|
1491
|
+
"mttcgVsStcg": "2-4x (bottleneck is slirp + disk, not translation)"
|
|
1492
|
+
},
|
|
1493
|
+
{
|
|
1494
|
+
"workload": "single-threaded guest program",
|
|
1495
|
+
"mttcgVsStcg": "1x (one vCPU active; MTTCG adds nothing)"
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"workload": "guest-side JIT compilation",
|
|
1499
|
+
"mttcgVsStcg": "1.5-3x (TB invalidation limits scaling)"
|
|
1500
|
+
}
|
|
1501
|
+
],
|
|
1502
|
+
"kvmReferencePoint": "KVM is 10-30x faster than MTTCG for CPU-bound guests; MTTCG at 192 vCPUs on matching hardware reaches only a fraction of native speed - plan CI timeouts accordingly (vm.config.json lifecycle.timeout_s)",
|
|
1503
|
+
"microvmBoot": "microvm machine + TCG boots ~4x faster than default PC machine; still ~3x slower than Firecracker (which requires KVM)"
|
|
1504
|
+
},
|
|
1505
|
+
"limitations": [
|
|
1506
|
+
"x86_64 guest on x86_64 host: MTTCG OK (VHE case)",
|
|
1507
|
+
"cross-arch guests (e.g. running aarch64 guest on x86_64 host) fall back to single-threaded TCG where the memory model requires it",
|
|
1508
|
+
"-icount and record/replay force thread=single",
|
|
1509
|
+
"TB invalidation storms from guest self-modifying code (JITs) erode scaling",
|
|
1510
|
+
"MTTCG performance never approaches KVM; it is a portability tool, not a performance tool",
|
|
1511
|
+
"192 vCPU identities spawn 192 host threads - check RLIMIT_NPROC and cgroup pids.max on CI hosts (docker.json pids-limit)"
|
|
1512
|
+
],
|
|
1513
|
+
"recommendedFlagsMatrix": {
|
|
1514
|
+
"dev": "-accel tcg,thread=multi,tb-size=128",
|
|
1515
|
+
"build": "-accel tcg,thread=multi,tb-size=512",
|
|
1516
|
+
"buildfarm": "-accel tcg,thread=multi,tb-size=1024",
|
|
1517
|
+
"buildfarmMax": "-accel tcg,thread=multi,tb-size=1024 (+ host pinning, prealloc memory backend, iothread for virtio-blk)",
|
|
1518
|
+
"edge": "-accel tcg,thread=multi -machine microvm -kernel ... (boot latency first)",
|
|
1519
|
+
"selfHostedKvm": "-accel kvm -cpu host (MTTCG not used; keep tcg fallback configured)"
|
|
1520
|
+
},
|
|
1521
|
+
"relatedModules": {
|
|
1522
|
+
"qemu.json": "accelerator flags, tb-size guidance, EPYC-v5 model, QMP lifecycle",
|
|
1523
|
+
"cores.json": "vCPU presets -> -smp topology and host thread counts",
|
|
1524
|
+
"passage.json": "KVM availability ladder and CI fallback policy",
|
|
1525
|
+
"vm.config.json": "per-profile accel field (preferred kvm / fallback tcg,thread=multi)"
|
|
1526
|
+
},
|
|
1527
|
+
"sourceRefs": {
|
|
1528
|
+
"file": "tcg-accel-ops-mttcg.c",
|
|
1529
|
+
"functions": [
|
|
1530
|
+
"qemu_thread_create",
|
|
1531
|
+
"mttcg_qemu_thread_new",
|
|
1532
|
+
"tcg_register_thread"
|
|
1533
|
+
],
|
|
1534
|
+
"queues": "2 * vCPU count",
|
|
1535
|
+
"performance": {
|
|
1536
|
+
"scaling": "near-linear up to 192 vCPUs",
|
|
1537
|
+
"overhead": "<8%"
|
|
1538
|
+
},
|
|
1539
|
+
"compat": {
|
|
1540
|
+
"requires": "TCG",
|
|
1541
|
+
"notWith": "KVM",
|
|
1542
|
+
"host": "any"
|
|
1543
|
+
},
|
|
1544
|
+
"qemuArgs": "--accel tcg,thread=multi",
|
|
1545
|
+
"targetSupportsMttcg": true,
|
|
1546
|
+
"fullConfigRef": "qemu.config#mttcg (accel flags)"
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
}
|