diff --git a/.config/example.yml b/.config/example.yml
index 05dc43c44b..b84a50c525 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -131,3 +131,6 @@ drive:
 # Ghost account is an account used for the purpose of delegating
 # followers when putting users in the list.
 # ghost: user-id-of-your-ghost-account
+
+# Clustering
+# clusterLimit: 1
diff --git a/src/config/types.ts b/src/config/types.ts
index a3d55e2843..f220e15822 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -92,6 +92,8 @@ export type Source = {
 	};
 
 	google_maps_api_key: string;
+
+	clusterLimit?: number;
 };
 
 /**
diff --git a/src/index.ts b/src/index.ts
index 9c16c4d223..eae25762ec 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -66,7 +66,7 @@ async function masterMain() {
 
 	Logger.succ('Misskey initialized');
 
-	spawnWorkers(() => {
+	spawnWorkers(config.clusterLimit, () => {
 		Logger.succ('All workers started');
 		Logger.info(`Now listening on port ${config.port} on ${config.url}`);
 	});
@@ -137,14 +137,16 @@ async function init(): Promise<Config> {
 	return config;
 }
 
-function spawnWorkers(onComplete: Function) {
+function spawnWorkers(limit: number, onComplete: Function) {
 	// Count the machine's CPUs
 	const cpuCount = os.cpus().length;
 
-	const progress = new ProgressBar(cpuCount, 'Starting workers');
+	const count = limit || cpuCount;
+
+	const progress = new ProgressBar(count, 'Starting workers');
 
 	// Create a worker for each CPU
-	for (let i = 0; i < cpuCount; i++) {
+	for (let i = 0; i < count; i++) {
 		const worker = cluster.fork();
 		worker.on('message', message => {
 			if (message === 'ready') {