# Use todos os cores da CPU com o modo de cluster

> Comece vários processos de trabalhadores por trás de um porto com a opção de cluster do Total.run(), e saiba o que é compartilhado entre eles e o que não é.

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

Um processo Node.js usa um só núcleo do CPU. `Total.run({ cluster: N })` inicia um **master** que cria `N` processos worker, cada um a executar toda a sua aplicação, e o sistema operativo reparte entre eles as ligações recebidas (`'auto'` em vez de um número deixa o master acrescentar threads à medida que a carga aumenta). Execute-o em modo release (`release: true`, que o script de arranque gerado ativa com `--release`); o watcher do modo debug não foi pensado para um cluster. No script de arranque é uma única opção:

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

Cada worker é um processo separado com a sua própria memória, por isso tudo o que guardar numa variável, em `CACHE` ou em `MEMORIZE` existe uma vez **por worker** e não é partilhado: dois pedidos do mesmo utilizador podem cair em workers diferentes. Guarde o estado partilhado numa base de dados, num armazenamento de ficheiros ou num serviço de mensagens, e mantenha as sessões num armazenamento que todos os workers consigam ler. As tarefas agendadas como `CRON()` também correm em cada worker, por isso proteja-as se só devem correr uma vez.

**Verifique que todos os workers estão ativos.** Após um deploy, peça várias vezes um URL como `/pid/` abaixo e conte os ids distintos: devem ser tantos quantos os workers pedidos.

Cada trabalhador tem seu próprio ID de processo.O exemplo inicia dois trabalhadores e inclui esse ID na resposta.

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