DEV Community

Cover image for Scalability 101: I/O vs CPU Bound Tasks.
Sk
Sk

Posted on

Scalability 101: I/O vs CPU Bound Tasks.

Have You Ever Thrown Threads at a Problem?

Well, I did! Five threads later, my C# file search and indexing code was crumbling. Way worse than the non-threaded version. Nearly broke me. Like a classic noob, I blamed C#.

It took wrestling an FFmpeg worker node to teach me the difference between a text file and an algorithm.

FFmpeg is weird because it lives in the valley between CPU and I/O:

video -> [READ: I/O][PROCESS: CPU][WRITE: I/O] -> output  
Enter fullscreen mode Exit fullscreen mode

See the trick? One phase is I/O‑bound, the other CPU‑bound, now that distinction is step one in mastering scale.

  • CPU‑bound: All the heavy lifting happens inside your processor. Every extra cycle competes for the same CPU time.

  • I/O‑bound: Your code is waiting on external entities (files, networks, that one slow AWS API).


Why the Distinction Matters

Let’s use one of my new favorite analogies from Data-Oriented Design:

the restaurant

Your Computer is a Kitchen

  • Main thread = Head chef
  • Cores = Workstations
  • Programming language = Knives/utensils
  • I/O = Delivery trucks outside

SCALING LAWS OF THE KITCHEN:

  1. More trucks ≠ faster chopping (adding I/O won’t fix CPU limits)
  2. Better knives ≠ faster deliveries (optimizing code won’t fix slow disks, networks, databases)

You need to know the difference between a txt file and an algorithm.


Scaling an Algorithm (CPU‑bound)

Algorithms live in the CPU. In a single‑threaded program, nothing else runs until the algorithm finishes:

function fib(n) {
  if (n < 2) return n;
  return fib(n - 1) + fib(n - 2);
}

fib(50)

// nothing here will run
Enter fullscreen mode Exit fullscreen mode

You need sous‑chefs (threads) so the head chef can delegate and juggle other tasks. more sous‑chefs means you must scale your kitchen too. Add more RAM, more cores. This is vertical scaling.

But as the kitchen grows, you’ll need more trucks to supply ingredients! So now you spin up clusters of processes. Instead of one Node.js process, run multiple isolated ones. Distribute the weight.

Here’s the fun part: adding a process creates a fresh event loop. Now you’ve got multiple trucks fetching ingredients on the same machine.

This is mini horizontal scaling. Still one machine, but you’re thinking like a distributed system.

Browsers do this brilliantly with tabs. If one tab crashes, no others die—that’s a cluster of processes.

But eventually, you’ll need to go beyond 1 machine


True Horizontal Scaling

  • Build new restaurants (servers)
  • Replicate kitchen blueprints (containers)
  • Deploy a global delivery network (CDNs/cloud)

This is the rabbit hole of distributed systems.

But it all loops back to one question: What’s the difference between a txt file and an algorithm?

You can find me on x.

More Content
Free:

Top comments (4)

Collapse
 
nevodavid profile image
Nevo David

Pretty cool, Ive smashed my head on this stuff too and it always gets messy fast

Collapse
 
sfundomhlungu profile image
Sk • Edited

oo facts. very messy! it's so easy to "shoot your leg off". years in I still feel like a noob. every problem feels unique for some reason

Collapse
 
nathan_tarbert profile image
Nathan Tarbert

been there way too many times tbh, scaling stuff always messes with my head at first - you ever hit that point where it feels like no matter what you tweak, something else gets slow?

Collapse
 
sfundomhlungu profile image
Sk

LOL i know it too well. I haven't touched my C# project in over a year 😔. but one advice I got since starting a C++ journey, is using a GUI profiler. it's so easy to see bottlenecks.