# Utilisez tous les cœurs CPU avec le mode cluster

> Commencez plusieurs processus travaillants derrière un port avec l'option de cluster de Total.run(), et sachez ce qui est partagé entre eux et ce qui n'est pas.

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

Un processus Node.js n'utilise qu'un seul cœur. `Total.run({ cluster: N })` démarre un **master** qui lance `N` processus worker, chacun exécutant toute votre application, et le système d'exploitation répartit les connexions entrantes entre eux (`'auto'` à la place d'un nombre laisse le master ajouter des threads quand la charge augmente). Exécutez-le en mode release (`release: true`, que le script de démarrage généré active avec `--release`) ; le watcher du mode debug n'est pas prévu pour un cluster. Dans le script de démarrage, c'est une seule option :

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

Chaque worker est un processus distinct avec sa propre mémoire : tout ce que vous conservez dans une variable, dans `CACHE` ou dans `MEMORIZE` existe une fois **par worker** et n'est pas partagé. Deux requêtes d'un même utilisateur peuvent donc tomber sur des workers différents. Conservez l'état partagé dans une base de données, un stockage de fichiers ou un service de messages, et gardez les sessions dans un stockage que tous les workers peuvent lire. Les tâches planifiées comme `CRON()` s'exécutent aussi dans chaque worker ; protégez-les si elles ne doivent s'exécuter qu'une fois.

**Vérifiez que tous les workers sont démarrés.** Après un déploiement, demandez plusieurs fois une URL comme `/pid/` ci-dessous et comptez les ids distincts : il doit y en avoir autant que de workers demandés.

Chaque travailleur a son propre ID de processus.L'exemple commence par deux travailleurs et comprend ce ID dans la réponse.

```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 });
```
