pm2 reload downtime in cluster mode
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 43.3k
- Forks
- 2.7k
- PR merge metrics
- No merged PRs in 30d
Description
Please see the issue I reported previously - "pm2 reload causing connection timeout and downtime". Using pm2 reload causes connection errors and downtime when running a process in cluster mode. Since I have been stuck running 1.0.1 in production for some time, I have been motivated to track down the cause of this issue. The issue still appears in the latest version 2.6.1.
Using git bisect I have been able to track this issue down to commit d0a3f49 "(god)(stopProcessId) refactor: now it only kill process without disconnecting in cluster mode"
To reproduce
- Create basic server,
server.js:
var http = require("http"),
app = require("express")();
app.use("/", function (req, res) {
return res.send(404);
});
var server = http.createServer(app);
server.listen(4000, function () {
});
-
Run
./bin/pm2 --no-daemonon master/2.6.1. -
Run
../../pm2/bin/pm2 start server.js -i 2 --name api -
Run
ab -n 100000 -c 1 http://127.0.0.1:4000/v1/ -
While
abis running, run../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 && ../../pm2/bin/pm2 reload api && sleep 2 -
Observe the following output:
Benchmarking 127.0.0.1 (be patient)
apr_pollset_poll: The timeout specified has expired (70007)
Total of 1407 requests completed
- Run
git revert d0a3f49and observe thatabcompletes without error.
I have also reproduced this issue with a small script
var Promise = require("bluebird"),
request = require("request");
setInterval(function () {
var startDate = new Date();
Promise.promisify(request)({
uri: "http://127.0.0.1:4000/v1/",
timeout: 10000,
forever: false
}).then(function (res) {
console.log(new Date(), res.statusCode, (new Date() - startDate));
if (res.statusCode !== 404) {
process.exit(0);
}
}).catch(function (err) {
console.log(new Date(), err, (new Date() - startDate));
process.exit(0);
});
}, 5);
Solution
It appears that reverting d0a3f49 solves the issue, but I am not sure what the motivation for that change was. I have been running 2.6.1 in production for about a week and, since I regularly use pm2 reload, I have noticed a number of connection errors in my nginx logs. I suspect this issue is related to the above.
Update (10 Sep)
I have downgraded PM2 2.1.1 overnight on my production machine. See this chart from my status server for the past 24 hours. I use pm2 reload every hour and you can clearly see many downtime running under PM2 2.6.1 and no downtime while running PM2 2.1.1.

Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the pm2 reload path invoked through bin/pm2 and inspect commit d0a3f49, especially the stopProcessId change for cluster mode. Reproduce with server.js, two clustered processes, ApacheBench, and repeated pm2 reload commands. Done means the benchmark completes without connection timeouts or downtime while reloads continue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, nodejs
- Domain
- cli, devops
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100