Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision a06023f31f2874dece1185526cd49d37b944d463)
+++ benchmark/io/http/main.cfa	(revision 348f81d5b66902e3ab25c1227eeeea38994143b5)
@@ -29,37 +29,4 @@
 
 //=============================================================================================
-// Globals
-//=============================================================================================
-struct ServerProc {
-	processor self;
-};
-
-void ?{}( ServerProc & this ) {
-	/* paranoid */ assert( options.clopts.instance != 0p );
-	(this.self){ "Benchmark Processor", *options.clopts.instance };
-
-	#if !defined(__CFA_NO_STATISTICS__)
-		if( options.clopts.procstats ) {
-			print_stats_at_exit( this.self, options.clopts.instance->print_stats );
-		}
-		if( options.clopts.viewhalts ) {
-			print_halts( this.self );
-		}
-	#endif
-}
-
-struct ServerIoContext {
-	io_context self;
-};
-
-void ?{}( ServerIoContext & this ) {
-	/* paranoid */ assert( options.clopts.instance != 0p );
-	(this.self){ *options.clopts.instance };
-}
-
-extern void init_protocol(void);
-extern void deinit_protocol(void);
-
-//=============================================================================================
 // Stats Printer
 //============================================================================================='
@@ -67,6 +34,6 @@
 thread StatsPrinter {};
 
-void ?{}( StatsPrinter & this ) {
-	((thread&)this){ "Stats Printer Thread" };
+void ?{}( StatsPrinter & this, cluster & cl ) {
+	((thread&)this){ "Stats Printer Thread", cl };
 }
 
@@ -80,7 +47,102 @@
 		sleep(10`s);
 
-		print_stats_now( *options.clopts.instance, CFA_STATS_READY_Q | CFA_STATS_IO );
-	}
-}
+		print_stats_now( *active_cluster(), CFA_STATS_READY_Q | CFA_STATS_IO );
+	}
+}
+
+//=============================================================================================
+// Globals
+//=============================================================================================
+// struct ServerProc {
+// 	processor self;
+// };
+
+// void ?{}( ServerProc & this ) {
+// 	/* paranoid */ assert( options.clopts.instance != 0p );
+// 	(this.self){ "Benchmark Processor", *options.clopts.instance };
+
+// 	#if !defined(__CFA_NO_STATISTICS__)
+// 		if( options.clopts.procstats ) {
+// 			print_stats_at_exit( this.self, options.clopts.instance->print_stats );
+// 		}
+// 		if( options.clopts.viewhalts ) {
+// 			print_halts( this.self );
+// 		}
+// 	#endif
+// }
+
+// struct ServerIoContext {
+// 	io_context self;
+// };
+
+// void ?{}( ServerIoContext & this ) {
+// 	/* paranoid */ assert( options.clopts.instance != 0p );
+// 	(this.self){ *options.clopts.instance };
+// }
+
+struct ServerCluster {
+	cluster self;
+	processor    * procs;
+	io_context   * ctxs;
+	StatsPrinter * prnt;
+
+};
+
+void ?{}( ServerCluster & this ) {
+	(this.self){ "Server Cluster", options.clopts.params };
+
+	this.procs = alloc(options.clopts.nprocs);
+	for(i; options.clopts.nprocs) {
+		(this.procs[i]){ "Benchmark Processor", this.self };
+
+		#if !defined(__CFA_NO_STATISTICS__)
+			if( options.clopts.procstats ) {
+				print_stats_at_exit( *this.procs, this.self.print_stats );
+			}
+			if( options.clopts.viewhalts ) {
+				print_halts( *this.procs );
+			}
+		#endif
+	}
+
+	this.ctxs = alloc(options.clopts.nprocs);
+	for(i; options.clopts.nprocs) {
+		(this.ctxs[i]){ this.self };
+	}
+
+	this.prnt = alloc(options.clopts.nprocs);
+	for(i; options.clopts.nprocs) {
+		(this.prnt[i]){ this.self };
+	}
+
+	#if !defined(__CFA_NO_STATISTICS__)
+		print_stats_at_exit( this.self, CFA_STATS_READY_Q | CFA_STATS_IO );
+	#endif
+
+	options.clopts.instance[options.clopts.cltr_cnt] = &this.self;
+	options.clopts.cltr_cnt++;
+}
+
+void ^?{}( ServerCluster & this ) {
+	for(i; options.clopts.nprocs) {
+		^(this.prnt[i]){};
+	}
+	free(this.prnt);
+
+	for(i; options.clopts.nprocs) {
+		^(this.ctxs[i]){};
+	}
+	free(this.ctxs);
+
+	for(i; options.clopts.nprocs) {
+		^(this.procs[i]){};
+	}
+	free(this.procs);
+
+	^(this.self){};
+}
+
+extern void init_protocol(void);
+extern void deinit_protocol(void);
 
 //=============================================================================================
@@ -146,11 +208,4 @@
 	// Run Server Cluster
 	{
-		cluster cl = { "Server Cluster", options.clopts.params };
-		#if !defined(__CFA_NO_STATISTICS__)
-			print_stats_at_exit( cl, CFA_STATS_READY_Q | CFA_STATS_IO );
-		#endif
-		options.clopts.instance = &cl;
-
-
 		int pipe_cnt = options.clopts.nworkers * 2;
 		int pipe_off;
@@ -167,7 +222,5 @@
 
 		{
-			ServerProc procs[options.clopts.nprocs];
-			ServerIoContext ioctxs[options.clopts.nprocs];
-			// StatsPrinter printer;
+			ServerCluster cl[options.clopts.nclusters];
 
 			init_protocol();
@@ -190,5 +243,9 @@
 					unpark( workers[i] );
 				}
-				sout | options.clopts.nworkers | "workers started on" | options.clopts.nprocs | "processors";
+				sout | options.clopts.nworkers | "workers started on" | options.clopts.nprocs | "processors /" | options.clopts.nclusters | "clusters";
+				for(i; options.clopts.nclusters) {
+					sout | options.clopts.thrd_cnt[i] | nonl;
+				}
+				sout | nl;
 				{
 					char buffer[128];
@@ -230,5 +287,5 @@
 			sout | "done";
 
-			sout | "Stopping processors..." | nonl; flush( sout );
+			sout | "Stopping processors/clusters..." | nonl; flush( sout );
 		}
 		sout | "done";
Index: benchmark/io/http/options.cfa
===================================================================
--- benchmark/io/http/options.cfa	(revision a06023f31f2874dece1185526cd49d37b944d463)
+++ benchmark/io/http/options.cfa	(revision 348f81d5b66902e3ab25c1227eeeea38994143b5)
@@ -13,4 +13,5 @@
 #include <kernel.hfa>
 #include <parseargs.hfa>
+#include <stdlib.hfa>
 
 #include <stdlib.h>
@@ -36,4 +37,5 @@
 
 	{ // cluster
+		1,     // nclusters;
 		1,     // nprocs;
 		1,     // nworkers;
@@ -50,4 +52,5 @@
 	// bool iokpoll = false;
 	unsigned nentries = 16;
+	bool isolate = false;
 
 
@@ -56,4 +59,5 @@
 		{ 'c', "cpus",           "Number of processors to use", options.clopts.nprocs},
 		{ 't', "threads",        "Number of worker threads to use", options.clopts.nworkers},
+		{'\0', "isolate",        "Create one cluster per processor", isolate, parse_settrue},
 		{'\0', "log",            "Enable logs", options.log, parse_settrue},
 		{'\0', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog},
@@ -85,5 +89,16 @@
 		nentries = v;
 	}
+	if(isolate) {
+		options.clopts.nclusters = options.clopts.nprocs;
+		options.clopts.nprocs = 1;
+	}
 	options.clopts.params.num_entries = nentries;
+	options.clopts.instance = alloc(options.clopts.nclusters);
+	options.clopts.thrd_cnt = alloc(options.clopts.nclusters);
+	options.clopts.cltr_cnt = 0;
+	for(i; options.clopts.nclusters) {
+		options.clopts.thrd_cnt[i] = 0;
+	}
+
 
 	// if( fixedfd ) {
Index: benchmark/io/http/options.hfa
===================================================================
--- benchmark/io/http/options.hfa	(revision a06023f31f2874dece1185526cd49d37b944d463)
+++ benchmark/io/http/options.hfa	(revision 348f81d5b66902e3ab25c1227eeeea38994143b5)
@@ -26,4 +26,5 @@
 
 	struct {
+		int nclusters;
 		int nprocs;
 		int nworkers;
@@ -31,5 +32,7 @@
 		bool procstats;
 		bool viewhalts;
-		cluster * instance;
+		cluster ** instance;
+		size_t   * thrd_cnt;
+		size_t     cltr_cnt;
 	} clopts;
 };
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision a06023f31f2874dece1185526cd49d37b944d463)
+++ benchmark/io/http/protocol.cfa	(revision 348f81d5b66902e3ab25c1227eeeea38994143b5)
@@ -182,5 +182,5 @@
 
 void ?{}( DateFormater & this ) {
-	((thread&)this){ "Server Date Thread", *options.clopts.instance };
+	((thread&)this){ "Server Date Thread", *options.clopts.instance[0] };
 	this.idx = 0;
 	memset( this.buffers[0].buff, 0, sizeof(this.buffers[0]) );
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision a06023f31f2874dece1185526cd49d37b944d463)
+++ benchmark/io/http/worker.cfa	(revision 348f81d5b66902e3ab25c1227eeeea38994143b5)
@@ -17,5 +17,7 @@
 //=============================================================================================
 void ?{}( Worker & this ) {
-	((thread&)this){ "Server Worker Thread", *options.clopts.instance };
+	size_t cli = rand() % options.clopts.cltr_cnt;
+	((thread&)this){ "Server Worker Thread", *options.clopts.instance[cli] };
+	options.clopts.thrd_cnt[cli]++;
 	this.pipe[0] = -1;
 	this.pipe[1] = -1;
