Home

Awesome

Heroku Node Settings

Since Node 2, the default garbage collection settings allow the app to consume up to 1.5GB before garbage collection occurs. In Heroku this is specially problematic as it might kill your app before that limit is reached (smaller dynos do not have such amount of memory). As Heroku provides an environment variable $WEB_MEMORY to let the system know what the limit is, you can start your app passing the appropriate flags so that this limit is never reached.

Installation

  npm install --save heroku-node-settings

Usage

If you are using the default start mechanism in Heroku (npm start) then you only need to change the start command in your package.json so that it uses heroku-node-settings instead of node.

  {
    "name": "my-proyect",
    "version": "0.0.1",
    "description": "A web app that does not get killed by high memory consumption in Heroku.",
    "main": "server/bin/web.js",
    "repository": "https://github.com/myuser/myproyect.git",
    "scripts": {
      "test": "grunt test",
      "start": "heroku-node-settings server/bin/web.js"
    }
  }

Note that any arguments you pass into this command will be used when calling nodeas well.

If you're using a Procfile, be sure to include the path: node_modules/.bin/heroku-node-settings.

How does it work

Essentially, the script uses the following V8 flags to start node. The values of these flags depends on the $WEB_MEMORY the dyno has. Check the source for the details.

Also note that, although these settings constrain the memory usage, there are other elements that can make the whole process use more memory that what these flags set (buffers, files, etc.).

Acknowledgments