2 Arguments
The array process.argv
contains information about how the program
was started:
node fs.js file.txt
The contents of the array might be:
['/Users/b/.nvm/versions/node/v5.9.0/bin/node', '/Users/b/code/fs.js', 'file.txt' ]
3 Standard Input and Standard Output channels
are streams in node:
process.stdout.write("Hello World\n");
process.stderr.write("you're doing it wrong");
console.log("this", true, 42, that);
node app.js > out.txt 2> err.txt
5 process id
console.log(`process ${process.pid}`)
Or find it on the commandline:
$ ps
PID TTY TIME CMD
71422 ttys000 0:00.05 bash
20877 ttys002 0:00.11 node app.js
6 Sending and reacting to signals
process.on( "SIGINT", function() {
console.log(`stopping`);
process.exit();
});
Send SIGINT by pressing CTRL-C
Send SIGINT with kill 20877
SIGTERM is used by docker, always handle it!
process.on( "SIGTERM", function() {
console.log(`stopping`);
process.exit();
});
SIGHUB can be used for less serious signals, for example to get the app to dump some statistics, or reload a configuration file:
let count = 1;
process.on( "SIGHUP", function() {
console.log(`count = ${count}`);
});
kill –HUP 20877
7 Scaling Node with cluster.js
V8 has a default memory limit of ~1.5GB
If your server has more memory
this might be unsatisfactory!
You can increase this by starting node with the option
--max-old-space-size
.
The Eventloop uses 1 core If your server has 64 cores this might be unsatisfactory! To get around this limitation use cluster.js
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
console.log('working!');
}
sockets are shared between slave processes:
if (cluster.isMaster) {
// ...
} else {
// Workers can share any
// TCP connections
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
}
the master process is in charge:
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`${worker.process.pid} died`);
});
}
they do not share the same memory space = objects are local to each instance of the app. You cannot maintain state in the application code! You can send messages:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
let worker = cluster.fork();
worker.send('do something!');
}
} else {
process.on('message', (msg) => {
process.send('nope.');
});
}
Where do we keep the state of the app? The answers are the same as for PHP, Rails, etc:
- in a Database (full featured)
- in a key value store like Memcached, Redis (faster, minimal features)
- by sending messages