FORGE-WP-0011: Forgejo and runner resource requests (CUST-WP-0071, RESOURCE-WP-0008)
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s

Receive the wave-1 allocation review rows: BEFORE evidence captured read-only,
reviewed patch against the live railiance-apps deploy path, deploy/verify/
rollback commands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 8340@bnt-lap001
Assistant-Session: 2e192b3d-b3e8-4403-94d4-d55a2c8b476c
This commit is contained in:
tegwick 2026-10-21 08:50:42 +02:00
parent 256da9fb70
commit 6d795677b8
12 changed files with 504 additions and 0 deletions

View file

@ -0,0 +1,59 @@
diff --git a/helm/forgejo-values.yaml b/helm/forgejo-values.yaml
index 3bb9812..08a219e 100644
--- a/helm/forgejo-values.yaml
+++ b/helm/forgejo-values.yaml
@@ -4,6 +4,19 @@
strategy:
type: Recreate
+# Main Forgejo container sizing (FORGE-WP-0011, CUST-WP-0071, RESOURCE-WP-0008).
+# Evidence 2026-10-21 (7d): CPU p95 133-160m, peak ~1030m; memory working set
+# p95 ~956Mi, per-pod peak 1252Mi, RSS peak 500Mi; no OOM events.
+# Request = p95 rule (200m / 1104Mi). Memory limit 1536Mi = 1.23x working-set
+# peak and ~3x RSS peak (the rest is reclaimable page cache). No CPU limit:
+# bursts to ~1 core are normal for git pack/clone work and must not throttle.
+resources:
+ requests:
+ cpu: 200m
+ memory: 1104Mi
+ limits:
+ memory: 1536Mi
+
service:
http:
type: ClusterIP
diff --git a/manifests/forgejo-runner.yaml b/manifests/forgejo-runner.yaml
index ccbb94b..a886adb 100644
--- a/manifests/forgejo-runner.yaml
+++ b/manifests/forgejo-runner.yaml
@@ -100,6 +100,16 @@ spec:
- -H
- tcp://127.0.0.1:2375
- --tls=false
+ # FORGE-WP-0011: job workload runs here (one job at a time,
+ # runner capacity: 1). Request covers idle p95 (391Mi); the limit
+ # bounds a build burst. Peak 7d: 200m / 693Mi working set.
+ resources:
+ requests:
+ cpu: 100m
+ memory: 432Mi
+ limits:
+ cpu: 1500m
+ memory: 2Gi
readinessProbe:
exec:
command: ["sh", "-c", "wget -q -O- -T 3 http://127.0.0.1:2375/_ping | grep -qx OK"]
@@ -108,6 +118,13 @@ spec:
- name: runner
image: code.forgejo.org/forgejo/runner@sha256:5071e6832313bafe71577e05631bece88caff08fcfb372193e4a21941f4ed54b
imagePullPolicy: IfNotPresent
+ # FORGE-WP-0011: runner daemon; p95 2m / 56Mi, peak 124m / 459Mi
+ # (host-label jobs run in this container). Pod request total
+ # 125m / 496Mi. No limit set in this change (see FORGE-WP-0011).
+ resources:
+ requests:
+ cpu: 25m
+ memory: 64Mi
env:
- name: DOCKER_HOST
value: tcp://127.0.0.1:2375

View file

@ -0,0 +1,37 @@
# Forgejo resource requests — BEFORE state (2026-10-21)
Workplan: `workplans/FORGE-WP-0011-forgejo-resource-requests.md`.
Captured read-only from railiance01 (`kubectl get/top`, `helm list/history`,
Prometheus query API through the service proxy). No Secret objects or Helm
values were read.
| File | Content |
| --- | --- |
| `before-deployments.json` | live `forgejo-gitea` / `forgejo-runner` container resources, strategy, PVCs |
| `before-pods.txt` | pods, restarts, QoS class |
| `before-top.txt` | point-in-time `kubectl top` |
| `before-quota.txt` | ResourceQuota / LimitRange (none) |
| `before-helm.txt` | Helm release `forgejo` (rev 9, chart gitea-12.5.0) |
| `before-node.txt` | node allocatable and allocated requests |
| `before-prometheus-7d.txt` | 7d working set, RSS, CPU p95/peak, OOM events |
| `after-render-resources.txt` | rendered resources from the proposed patch (not applied) |
## Findings
- `forgejo-gitea` main container `gitea`: **no requests or limits**. The
effective pod request of 100m/128Mi comes from the chart init containers.
QoS Burstable.
- `forgejo-runner` containers `dind` and `runner`: **no requests or limits**.
QoS BestEffort. Runner `config.yaml` on the PVC has `capacity: 1`, so one job
runs at a time already.
- 7d Prometheus (2026-10-14..21): gitea CPU p95 160m, peak about 1030m. Working
set p95 955Mi, per-pod peak 1252Mi, RSS peak 500Mi. dind working set p95
392Mi, peak 693Mi, CPU peak 200m. runner working set p95 56Mi, peak 459Mi,
RSS 429Mi, CPU peak 124m. No OOM events.
- Node: 4 CPU / about 15.6Gi allocatable. Requested 3605m (90%) / 9856Mi (61%).
- Drift: Helm history ends at rev 9 (2026-07-07), but the Deployment is at
revision 14 (2026-10-19). Live changes since July were applied outside
`helm upgrade`, though their content matches `railiance-apps` HEAD values.
- Stale pods: `forgejo-gitea-7d94988c79-krqdr` (ContainerStatusUnknown) and
`forgejo-runner-6fcb669668-7g8m7` (Error) are leftovers from 66 days ago. They
hold no requests but clutter status. They are out of scope here.

View file

@ -0,0 +1,10 @@
# helm template (chart gitea 12.5.0) of patched railiance-apps values + registry values; sops layer not rendered
forgejo-gitea verify-secret-scanner {'limits': {'cpu': '100m', 'memory': '64Mi'}, 'requests': {'cpu': '10m', 'memory': '32Mi'}}
forgejo-gitea init-directories {'limits': {}, 'requests': {'cpu': '100m', 'memory': '128Mi'}}
forgejo-gitea init-app-ini {'limits': {}, 'requests': {'cpu': '100m', 'memory': '128Mi'}}
forgejo-gitea configure-gitea {'limits': {}, 'requests': {'cpu': '100m', 'memory': '128Mi'}}
forgejo-gitea gitea {'limits': {'memory': '1536Mi'}, 'requests': {'cpu': '200m', 'memory': '1104Mi'}}
# manifests/forgejo-runner.yaml (patched)
forgejo-runner register None
forgejo-runner dind {'requests': {'cpu': '100m', 'memory': '432Mi'}, 'limits': {'cpu': '1500m', 'memory': '2Gi'}}
forgejo-runner runner {'requests': {'cpu': '25m', 'memory': '64Mi'}}

View file

@ -0,0 +1,115 @@
[
{
"deployment": "forgejo-gitea",
"generation": 16,
"replicas": 1,
"strategy": {
"type": "Recreate"
},
"initContainers": [
{
"name": "verify-secret-scanner",
"resources": {
"limits": {
"cpu": "100m",
"memory": "64Mi"
},
"requests": {
"cpu": "10m",
"memory": "32Mi"
}
}
},
{
"name": "init-directories",
"resources": {
"requests": {
"cpu": "100m",
"memory": "128Mi"
}
}
},
{
"name": "init-app-ini",
"resources": {
"requests": {
"cpu": "100m",
"memory": "128Mi"
}
}
},
{
"name": "configure-gitea",
"resources": {
"requests": {
"cpu": "100m",
"memory": "128Mi"
}
}
}
],
"containers": [
{
"name": "gitea",
"image": "code.forgejo.org/forgejo/forgejo:11.0.3-rootless",
"resources": {}
}
],
"volumes": [
{
"name": "init"
},
{
"name": "config"
},
{
"name": "inline-config-sources"
},
{
"name": "temp"
},
{
"name": "data",
"pvc": "gitea-shared-storage"
},
{
"name": "secret-scan-template"
}
]
},
{
"deployment": "forgejo-runner",
"generation": 4,
"replicas": 1,
"strategy": {
"type": "Recreate"
},
"initContainers": [
{
"name": "register",
"resources": {}
}
],
"containers": [
{
"name": "dind",
"image": "docker.io/library/docker@sha256:aa3df78ecf320f5fafdce71c659f1629e96e9de0968305fe1de670e0ca9176ce",
"resources": {}
},
{
"name": "runner",
"image": "code.forgejo.org/forgejo/runner@sha256:5071e6832313bafe71577e05631bece88caff08fcfb372193e4a21941f4ed54b",
"resources": {}
}
],
"volumes": [
{
"name": "data",
"pvc": "forgejo-runner-data"
},
{
"name": "init-scripts"
}
]
}
]

View file

@ -0,0 +1,2 @@
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
forgejo forgejo 9 2026-07-07 20:30:46.946867268 +0200 CEST deployed gitea-12.5.0 1.25.4

View file

@ -0,0 +1,12 @@
NAME CPU MEM
239.62.205.92.host.secureserver.net 4 16377032Ki
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 3605m (90%) 37500m (937%)
memory 9856Mi (61%) 34562Mi (216%)
ephemeral-storage 256Mi (0%) 1Gi (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
Events: <none>

View file

@ -0,0 +1,5 @@
NAME PHASE RESTARTS REASON QOS
forgejo-gitea-78bc5d85d7-8bxlz Running 0 <none> Burstable
forgejo-gitea-7d94988c79-krqdr Failed 8 Unknown Burstable
forgejo-runner-6fcb669668-7g8m7 Failed 5,14 Unknown,Error BestEffort
forgejo-runner-8bf88cd84-g4n65 Running 1,4 Unknown,Error BestEffort

View file

@ -0,0 +1,29 @@
## max by (pod,container)(max_over_time(container_memory_working_set_bytes{namespace="forgejo",container!="",container!="POD"}[7d]))/1048576
{'container': 'configure-gitea', 'pod': 'forgejo-gitea-78bc5d85d7-8bxlz'} 2.9
{'container': 'dind', 'pod': 'forgejo-runner-8bf88cd84-g4n65'} 692.9
{'container': 'gitea', 'pod': 'forgejo-gitea-78bc5d85d7-8bxlz'} 1017.6
{'container': 'gitea', 'pod': 'forgejo-gitea-745f685c97-b97ch'} 1180.2
{'container': 'gitea', 'pod': 'forgejo-gitea-7474684b6-lnr9w'} 1252.0
{'container': 'runner', 'pod': 'forgejo-runner-8bf88cd84-g4n65'} 458.7
## quantile_over_time(0.95,sum by (container)(container_memory_working_set_bytes{namespace="forgejo",container!="",container!="POD"})[7d:5m])/1048576
{'container': 'dind'} 391.5
{'container': 'gitea'} 955.3
{'container': 'runner'} 55.5
## max by (container)(max_over_time(container_memory_rss{namespace="forgejo",container!="",container!="POD"}[7d]))/1048576
{'container': 'configure-gitea'} 2.4
{'container': 'dind'} 81.8
{'container': 'gitea'} 500.4
{'container': 'runner'} 428.7
## quantile_over_time(0.95,sum by (container)(rate(container_cpu_usage_seconds_total{namespace="forgejo",container!="",container!="POD"}[5m]))[7d:5m])*1000
{'container': 'dind'} 10.0
{'container': 'gitea'} 159.8
{'container': 'runner'} 1.9
## max_over_time(sum by (container)(rate(container_cpu_usage_seconds_total{namespace="forgejo",container!="",container!="POD"}[5m]))[7d:5m])*1000
{'container': 'dind'} 199.5
{'container': 'gitea'} 1030.0
{'container': 'runner'} 124.2
## sum by (container)(increase(container_oom_events_total{namespace="forgejo"}[7d]))
{'container': 'dind'} 0.0
{'container': 'gitea'} 0.0
{'container': 'runner'} 0.0
{} 0.0

View file

@ -0,0 +1 @@
No resources found in forgejo namespace.

View file

@ -0,0 +1,4 @@
POD NAME CPU(cores) MEMORY(bytes)
forgejo-gitea-78bc5d85d7-8bxlz gitea 6m 241Mi
forgejo-runner-8bf88cd84-g4n65 dind 2m 261Mi
forgejo-runner-8bf88cd84-g4n65 runner 1m 33Mi