Khalil Tahraoui-

Engineering Robust Systems

Performance Modeling in Distributed Systems

Distributed systems exhibit non-deterministic behavior under dynamic workloads, heterogeneous infrastructure, and network variability. Performance modeling provides a structured way to analyze and predict system behavior before and during deployment.

The objective is to understand how latency, throughput, and stability evolve under load.


System decomposition

A distributed system can be modeled as interacting components:

  • computation delay
  • network transmission delay
  • queueing delay
  • synchronization overhead

Total latency:

L_total = L_compute + L_network + L_queue + L_sync


Queueing model

We use a classical M/M/1 abstraction.

λ = arrival rate
μ = service rate

System utilization:

ρ = λ / μ

System behavior:

  • if ρ < 1 → stable system
  • if ρ approaches 1 → congestion increases sharply
  • if ρ ≥ 1 → system becomes unstable

Response time model

T = 1 / (μ - λ)

This captures the non-linear explosion of latency near saturation.


Multi-node scaling model

For N nodes:

λ_i = λ / N

However real systems introduce coordination overhead:

T(N) = 1 / (μ - λ / N) + δ(N)

Where δ(N) includes:

  • synchronization cost
  • scheduling overhead
  • network contention

Implementation: Simulation using SimPy

To validate analytical models, we use SimPy, a process-based discrete-event simulation library.

Dependencies

pip install simpy numpy matplotlib

Basic queue simulation model

import simpy
import random

RANDOM_SEED = 42
λ = 5.0   # arrival rate
μ = 7.0   # service rate

def request(env, server):
    arrival_time = env.now

    with server.request() as req:
        yield req
        service_time = random.expovariate(μ)
        yield env.timeout(service_time)

        latency = env.now - arrival_time
        latencies.append(latency)

def generator(env, server):
    while True:
        yield env.timeout(random.expovariate(λ))
        env.process(request(env, server))

latencies = []

env = simpy.Environment()
server = simpy.Resource(env, capacity=1)

env.process(generator(env, server))
env.run(until=200)

print("Average latency:", sum(latencies) / len(latencies))

Multi-node extension model

class EdgeNode:
    def __init__(self, env):
        self.env = env
        self.server = simpy.Resource(env, capacity=1)

def distributed_request(env, nodes):
    node = random.choice(nodes)
    arrival = env.now

    with node.server.request() as req:
        yield req
        service = random.expovariate(μ)
        yield env.timeout(service)

        latencies.append(env.now - arrival)

What this simulation captures

  • queue buildup under high λ
  • latency explosion near saturation
  • effect of distributed load balancing
  • variability across nodes

Key references

  • Kleinrock, L. “Queueing Systems, Volume 1: Theory”
  • Dean, J., Barroso, L. “The Tail at Scale”
  • Harchol-Balter, “Performance Modeling and Design of Computer Systems”
  • Chen et al., “Edge Computing: Vision and Challenges”

Conclusion

Performance modeling provides the mathematical foundation for reasoning about distributed system behavior.

However, real systems require:

  • adaptive modeling of λ and μ
  • simulation-based validation
  • integration with runtime control systems

Bridging analytical models and real-world behavior remains a central challenge in Cloud-Edge system research.