# Gebruik alle CPU-cores met de clustermodus

> Begin meerdere werknemersprocessen achter één port met de clusteroptie van Total.run(), en weet wat er gedeeld is tussen hen en wat niet.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: f859dc565ca2e3bb68c4db857aaad66647e851ec47586d63cdfb7b5e98a72c14
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Een Node.js-proces gebruikt één CPU-kern. `Total.run({ cluster: N })` start een **master** die `N` workerprocessen afsplitst, elk met je hele applicatie, en het besturingssysteem verdeelt de binnenkomende verbindingen over hen (`'auto'` in plaats van een getal laat de master threads toevoegen naarmate de belasting stijgt). Draai het in releasemodus (`release: true`, wat het gegenereerde startscript met `--release` instelt); de debug-watcher is niet bedoeld voor een cluster. In het startscript is het één optie:

```js
Total.run({ cluster: 4, release: true }); // or cluster: 'auto'
```

Elke worker is een apart proces met eigen geheugen, dus alles wat je in een variabele, in `CACHE` of in `MEMORIZE` bewaart, bestaat één keer **per worker** en wordt niet gedeeld: twee verzoeken van dezelfde gebruiker kunnen bij verschillende workers uitkomen. Bewaar gedeelde status in een database, een bestandsopslag of een berichtendienst en houd sessies in een opslag die alle workers kunnen lezen. Geplande taken zoals `CRON()` draaien ook in elke worker, dus beveilig ze als ze maar één keer mogen draaien.

**Controleer of alle workers draaien.** Vraag na een deploy meerdere keren een URL zoals `/pid/` hieronder op en tel de verschillende id’s: het moeten er evenveel zijn als de workers die je vroeg.

Elk werknemer heeft zijn eigen proces-ID. Het voorbeeld begint met twee werknemers en omvat dat ID in de reactie.

```js controllers/pid.js
exports.install = function() {
	ROUTE('GET /pid/', pid);
	ROUTE('GET /dir/', dir);
};

function pid($) {
	$.json({ pid: process.pid });
}

function dir($) {
	$.json({ dir: PATH.root() });
}
```

```js cluster.js
require('total5');
Total.run({ cluster: 2, port: 8766, release: true });
```
