1.避免使用同步程式碼:
// Good: write files asynchronously fs.writeFile('message.txt', 'Hello Node', function (err) { console.log("It's saved and the server remains responsive!"); }); // BAD: write files synchronously fs.writeFileSync('message.txt', 'Hello Node'); console.log("It's saved, but you just blocked ALL requests!");
2.關閉sockect池:
nodejs的http客戶端會自動的使用sockect池,預設情況下,每一臺主機限制你最多使用5個sockect連線,sockect重用能保持很多的資源能夠在一定範圍內重用,如果你想控制從相同主機取資料的大量請求,這會有很多的瓶頸。在這種情況下,一個很好的辦法是提高maxSockets 的值或者是徹底的關閉sockect池
var http = require('http'); var options = {.....}; options.agent = false; var req = http.request(options)
3.不要使用nodejs 做靜態資源儲存
4.在客戶端渲染頁面
5.使用gzip壓縮
6.並行
試著去處理你的所有阻礙操作,也就是說,並行請求你的遠端服務,資料庫呼叫,檔案訪問,這個將會減少潛在的最慢的請求,而不是所有的在一個佇列中的總和時間,為了保持比較好的控制回撥和錯誤資訊,我建議step 框架去做工作流控制
7.session 空閒
LinkedIn mobile 使用express 框架控制請求和響應,很多的express 例子中都包含了如下的配置
app.use(express.session({ secret: "keyboard cat" }));
一般地,session 資料是儲存在記憶體中,這個將會導致系統開銷,特別是有很多的使用者組,當然你也可以使用外部的session 儲存,比如說MongoDB or Redis,但是這樣做的話,就會導致遠端請求session 資料的系統開銷。當然,如果可能,最好的選項是不在服務端儲存session資料。在express 框架中不要包含上述配置你將得到更好的效能。
8.使用二進位制模組
如果可能的話,儘量使用二進位制模組,而不使用javascript 庫,例如:當我們使用SHA模組轉換的話,我們將看到有更好的效能。
// Use built in or binary modules var crypto = require('crypto'); var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");
9.使用標準的V8而不是使用客戶端的庫
10.保持你的程式碼小而簡潔
時不時的問問自己這幾個問題:
1.我真的需要這個模組嗎?
2.我為什麼要使用這個框架?
3.這個系統開銷值得嗎?
4.我是否可以用一個更簡單的方式去實現這個?
翻譯文章地址:http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile