Why Nodejs serves a file with 80x more CPU usage than Nginx?

Take the same code that sits on nodejs.org home page. Serve a static file that is 1.8Mb. And do the same with Nginx, and watch the difference.

Code : http://pastie.org/3730760

Screencast : http://screencast.com/t/Or44Xie11Fnp

Please share if you know anything that'd prevent this from happening, so we don't need to deploy nginx servers and complicate our lives.

ps1. this test is done with node 0.6.12. out of curiosity, i downgraded to 0.4.12 just to check if it's a regression, on the contrary, it was worse. same file used 25% twice.

ps2. this post is not a nodejs hate - we use nodejs, and we love it, except this glitch which actually delayed our launch (made us really sad), and seemed quite serious to me. i've never read, heard, seen or expected to come across.

Problem courtesy of: Devrim

Solution

The problem with your node benchmark is that you store the static file in a variable inside the V8 heap. Due to the way how V8 handles memory it can't directly send data contained in javascript variables to the network, because addresses of allocated objects may change during runtime, therefore V8 has to make a copy of your 1.8MB string on every request, sure that kills performance.

What you could do is to use a Buffer :

replace: longAssString = fs.readFileSync(pathToABigFile, 'utf8');

with: longAssString = fs.readFileSync(pathToABigFile);

that way you have your static file in a buffer, buffers are stored outside of V8s heap and require no copy when sent to the network and should therefore be much faster.

Solution courtesy of: stewe

关键词:Node.js Nginx

相关推荐:

Get Posted Data From Form

Is the Meteor JS framework compatible with Google App Engine?

Why does the following code not change the property in my object in Node.js

Reading all files in a directory, store them in objects, and send the object

Can Express with EJS render HTML to a variable (so I can send as e-mail)?

Expressjs raw body

JavaScript test (mocha) with the file js 'import'

Send IP Address in email with node.js

PyQt connects SIGNAL to several SLOTs

2 certificates on a node server