tcp-tuner

tcp-tuner

Enables autonomous TCP congestion-control tuning through MCP tools for benchmarking, sysctl parameter adjustments, fault injection, and runbook generation within Kubernetes clusters.

Category
Visit Server

README

TCP Congestion Tuner

An agentic TCP congestion-control tuning system where Bob (IBM watsonx Code Assistant) autonomously benchmarks, diagnoses, tunes Linux kernel TCP parameters, injects network faults, queries live Prometheus metrics, and commits runbooks to git — converging toward a user-defined SLO with zero human involvement per iteration.

Architecture

┌─────────────────────────────────────────────────────────────┐
│                        Bob (TCP Tuner Mode)                  │
│  "cwnd collapsing — switch to BBR, increase rmem_max"       │
└──────────────────────────┬──────────────────────────────────┘
                           │ MCP tools (stdio)
┌──────────────────────────▼──────────────────────────────────┐
│                    MCP Server (Node.js)                      │
│  run_benchmark  │  get_sysctl_params  │  apply_sysctl       │
│                 │  get_benchmark_history                     │
└──────────────────────────┬──────────────────────────────────┘
                           │ kubectl
┌──────────────────────────▼──────────────────────────────────┐
│              kind Kubernetes Cluster (3 nodes)               │
│                                                              │
│  ┌─────────────────┐    ┌──────────────────────────────┐   │
│  │  iperf3-server  │◄───│  iperf3-client (Job)         │   │
│  │  (Deployment)   │    │  measures throughput/RTT      │   │
│  └─────────────────┘    └──────────────────────────────┘   │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  sysctl-tuner DaemonSet (privileged, hostNetwork)    │   │
│  │  worker-node-1 pod │ worker-node-2 pod               │   │
│  │  reads/writes kernel TCP sysctl params               │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

Prerequisites

Tool Version Install
Docker Desktop 29+ docker.com
kubectl v1.34+ bundled with Docker Desktop
kind v0.29+ curl -Lo kind.exe https://kind.sigs.k8s.io/dl/v0.29.0/kind-windows-amd64
Node.js v22 LTS winget install OpenJS.NodeJS.LTS
Python 3.12+ python.org

Quick Start

1. Spin up the cluster

cd cluster
.\start.ps1

This creates a 3-node kind cluster (1 control-plane + 2 workers), deploys the iperf3 server, and starts the sysctl-tuner DaemonSet on both worker nodes.

2. Install and build the MCP server

cd mcp-server
npm install
npm run build

3. Register the MCP server with Bob

Add to your Bob MCP config (~/.bob/mcp-settings.json or via Bob UI → Settings → MCP):

{
  "mcpServers": {
    "tcp-tuner": {
      "command": "node",
      "args": ["<absolute-path-to-repo>/tcp-congestion-tuner/mcp-server/src/index.js"],
      "cwd": "<absolute-path-to-repo>/tcp-congestion-tuner"
    }
  }
}

4. Load the custom Bob mode

Copy .bob/custom_modes.yaml to your Bob workspace config, or merge it into your existing custom modes file.

5. Start tuning

Open Bob, switch to TCP Tuner mode, and say:

"Run a baseline benchmark, inspect the current sysctl configuration, and autonomously tune TCP parameters to maximise throughput."

Bob will run the full detect → diagnose → tune → validate loop.


Manual CLI Usage

# Run a benchmark
python scripts/benchmark.py run

# Show last 10 benchmark runs
python scripts/benchmark.py history

# Compare the last two runs
python scripts/benchmark.py compare

# Read current sysctl params
python scripts/benchmark.py sysctl get

# Apply a sysctl change manually
python scripts/benchmark.py sysctl set net.ipv4.tcp_congestion_control bbr

MCP Tools Reference

# Tool Description
1 run_benchmark Launches iperf3 Job, returns throughput/RTT/retransmits + sysctl snapshot
2 get_sysctl_params Reads all TCP sysctl values from a worker node
3 apply_sysctl Writes a sysctl value on one or all worker nodes via privileged DaemonSet pod
4 get_benchmark_history Returns past N runs for trend comparison
5 inject_fault Injects packet loss + delay via tc netem on worker node interfaces
6 clear_fault Removes netem qdiscs, restores clean network
7 save_runbook Writes Markdown runbook to runbooks/, git commit, git push, returns SHA
8 get_metrics Runs PromQL query against in-cluster Prometheus, returns live node metrics
9 check_slo Evaluates last benchmark against SLO targets; returns pass/fail + next-action recommendation
10 export_report Generates a self-contained HTML report with SVG trend charts from benchmark history
11 benchmark_regression Compares latest run vs a golden baseline; returns pass/fail for use in CI

Observability

Deploy Prometheus + Grafana into the cluster:

kubectl apply -f manifests/monitoring.yaml

Open the live dashboard (auto port-forwards and opens browser):

.\cluster\port-forward.ps1
# Grafana: http://localhost:3000/d/tcp-tuner  (admin / tcptuner)
# Prometheus: http://localhost:9090

The TCP Congestion Tuner dashboard shows:

  • Network transmit/receive Mbps (all nodes)
  • TCP retransmits/sec (kernel counter via node-exporter)
  • CPU usage % (iperf3 load visibility)

Known Limitations (kind cluster)

These are expected artifacts of running Kubernetes inside Docker — not bugs:

Limitation Explanation
Baseline retransmits ~1,000–2,000 on clean network veth/bridge interfaces inside kind containers exhibit higher retransmit rates than bare-metal under high-throughput iperf3. The reduction from tuning is real; the absolute baseline is inflated.
net.core.rmem_max / wmem_max unavailable These params are not namespaced and cannot be written from inside a container network namespace. net.ipv4.tcp_rmem/wmem are used instead.
tc netem fault affects control-plane pod too kind's control-plane runs as a container on the same host network. Injecting fault on control-plane's eth0 can cause kubectl timeouts. Use node_selector=worker in production demos.
Throughput limited by loopback BDP 50–75 Gbps is a loopback ceiling, not a real network limit. Buffer sizing changes show their full impact on real network paths with RTT > 1ms.

Key Kubernetes Concepts Demonstrated

  • DaemonSet — sysctl-tuner runs on every worker node automatically
  • Privileged pods with hostNetwork — required to read/write host kernel parameters
  • Job — iperf3 client runs once and terminates cleanly
  • Headless Service — iperf3 server addressable by DNS name within the cluster
  • Node-level sysctl tuning — per-node kernel parameter management in K8s

Tuning Playbook (What Bob Does)

Change Reason Expected Impact
tcp_congestion_control=bbr BBR tracks bottleneck bandwidth directly; better in high-BDP paths +10–40% throughput, fewer retransmits
rmem_max=134217728 Larger receive buffers allow higher in-flight data Higher throughput on high-latency links
tcp_slow_start_after_idle=0 Prevents cwnd reset after idle bursts Important for bursty market-data feeds
tcp_notsent_lowat=16384 Reduces bufferbloat in the socket send queue Lower RTT under load

Teardown

cd cluster
.\teardown.ps1

Bob Integration

This project is designed to be driven entirely by Bob in TCP Tuner mode. Three key prompts cover the full lifecycle:

Baseline + autonomous tuning

Run a baseline benchmark, read the current sysctl configuration, then autonomously tune TCP
parameters to maximise throughput. Show a before/after comparison table after each change.
Save a runbook to the runbooks/ folder when done.

SLO-driven convergence loop

Tune until retransmits < 500 and throughput > 50000 Mbps. Run autonomously — apply one
sysctl change per iteration, benchmark, check SLO, repeat until SLO passes or playbook
exhausted. Save a runbook to git when done.

Fault-injection resilience

Inject 3% packet loss. Run the fault-resilience tuning loop: benchmark under fault, tune
to compensate, clear the fault, confirm recovery, save runbook.

Bob uses the tcp-tuner skill (.bob/skills/tcp-tuner/SKILL.md) for structured agentic best practices: 4 phases, 6 invariants, a full tuning playbook, and runbook templates.


Project Structure

tcp-congestion-tuner/
├── cluster/
│   ├── kind-config.yaml          # 1 control-plane + 2 worker nodes
│   ├── start.ps1                 # cluster bootstrap script
│   ├── port-forward.ps1          # Grafana + Prometheus port-forward for demos
│   └── teardown.ps1              # cluster cleanup
├── manifests/
│   ├── iperf-server.yaml         # iperf3 server Deployment + headless Service
│   ├── iperf-client-job.yaml     # iperf3 benchmark Job
│   ├── tuner-daemonset.yaml      # privileged sysctl-tuner DaemonSet (alpine + iproute2)
│   ├── monitoring.yaml           # Prometheus + node-exporter DaemonSet + Grafana
│   └── alerts.yaml               # TcpHighRetransmits + TcpThroughputDrop alert rules
├── mcp-server/
│   ├── package.json
│   ├── tsconfig.json
│   └── src/
│       └── index.ts              # 9 MCP tools (TypeScript source)
├── scripts/
│   └── benchmark.py              # CLI benchmark runner, comparator, rollback
├── tests/
│   └── test_benchmark.py         # 119 pytest tests, 98% coverage
├── runbooks/                     # Bob-generated runbooks (auto-committed by save_runbook)
├── .bob/
│   ├── custom_modes.yaml         # TCP Tuner Bob mode with SLO convergence loop
│   └── skills/tcp-tuner/
│       └── SKILL.md              # Reusable agentic best-practices skill
└── README.md

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured