2012-04-06 43 views
4

採用與nodejs.org主頁上相同的代碼。提供1.8Mb的靜態文件。並對Nginx做同樣的事情,並觀察其差異。爲什麼Nodejs提供的文件CPU使用率比Nginx多80倍?

Code :http://pastie.org/3730760

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

,如果你知道什麼,想阻止這種情況的發生,所以我們並不需要部署服務器nginx的和我們的生活變得複雜,請分享。

ps1。這個測試是在節點0.6.12完成的。出於好奇,我降級到0.4.12只是爲了檢查是否迴歸,相反,情況更糟。相同的文件使用了25%兩次。

PS2。這篇文章不是nodejs的憎恨 - 我們使用nodejs,我們喜歡它,除了這個故障實際上延遲了我們的發佈(讓我們非常難過),並且對我來說似乎相當嚴重。我從來沒有讀過,聽過,看過或預期會遇到。

+6

我想Nginx會調用['sendfile'](http://linux.die.net/man/2/sendfile)將字節直接從磁盤寫入線程,而不會留下任何內核空間,您的JavaScript做了很多工作。 – 2012-04-06 06:05:22

回答

21

您的節點基準測試的問題是您將靜態文件存儲在V8堆內的變量中。由於V8處理內存的方式,它不能直接將JavaScript變量中包含的數據發送到網絡,因爲分配對象的地址在運行時可能會發生變化,因此V8必須在每個請求中創建1.8MB字符串的副本,當然這會殺死性能。

你可以做的是使用Buffer

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

有:longAssString = fs.readFileSync(pathToABigFile);

這樣,你有一個緩衝的靜態文件,緩衝區存儲V8引擎堆之外並且在發送到網絡時不需要拷貝,因此應該快得多。

+0

感謝您的解釋和哇,確實有很大的不同。它下降到0.4 - 0.7!謝謝stewe .. – Devrim 2012-04-06 06:55:41

+2

我很高興我可以幫助:) – stewe 2012-04-06 07:08:05

相關問題