FORGE-WP-0011: Forgejo and runner resource requests (CUST-WP-0071, RESOURCE-WP-0008)
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:
parent
256da9fb70
commit
6d795677b8
12 changed files with 504 additions and 0 deletions
|
|
@ -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
|
||||
37
docs/evidence/2026-10-21-forgejo-resource-requests/README.md
Normal file
37
docs/evidence/2026-10-21-forgejo-resource-requests/README.md
Normal 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.
|
||||
|
|
@ -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'}}
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
No resources found in forgejo namespace.
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue