var process = require('process')
var c = 0;
while (true) {
var t = process.hrtime();
console.log(++c);
}
這裏是我的環境:
的NodeJS V4.2.4,Ubuntu的LTS 14.04上的Oracle VM VirtualBox V5.0.4 r102546在Windows 7中運行
此循環在掛起之前只能運行約60k到80k次。之後沒有任何反應。
在我的同事的電腦裏可能是40k到60k次。但是這個循環不應該永遠持續嗎?
我第一次運行一個基準測試avg執行時間來設置連接,所以我不能只在一開始就得到開始時間,然後在所有事情完成之後結束時間。
這與我使用的操作系統有關嗎?
謝謝如果有人知道這個問題。
============================================== ============
更新2016年4月13日:
一天後的權利我提出這個問題,我意識到這是多麼愚蠢的問題。這不是我真正想做的。所以我會進一步解釋它。
下面是測試結構:
我有處理connections.Client將在「連接」事件發送一個「設置」事件節點服務器。 Redis訂閱頻道將在服務器端進行,然後從db中進行一些查詢,然後調用客戶端的'setup'事件回調。客戶端在'setup'回調中斷開套接字,並在'disconnect'事件上重新連接。
客戶端代碼使用socket.io-client在後端運行,集羣模擬高併發性。
代碼是這樣的: (一些功能這裏沒有列出)
[server]
socket.on('setup', function(data, callback) {
queryFromDB();
subscribeToRedis();
callback();
}
[client]
var requests = 1000;
if (cluster.isMaster) {
for (var i = 0; i < 100; ++i) {
cluster.fork();
}
} else {
var count = 0;
var startTime = process.hrtime();
socket = io.connect(...);
socket.on('connect', function() {
socket.emit('setup', {arg1:'...', arg2:'...'}, function() {
var setupEndTime = process.hrtime();
calculateSetupTime(startTime, setupEndTime);
socket.disconnect();
}
}
socket.on('disconnect', function() {
if (count++ < requests) {
var disconnectEndTime = process.hrtime();
calculateSetupTime(startTime, disconnectEndTime);
socket.connect();
} else {
process.exit();
}
}
}
起初的連接只能做500或600倍。不知何故,我刪除了所有的hrtime()代碼,它使它達到1000次。但後來我提出的請求數量達到2000次(沒有hrtime()代碼),它不能再完成。
我完全糊塗了。昨天我認爲它與時間有關,但當然不是,任何無限循環都會掛起。我被hrtime誤導了。
但是現在的問題是什麼?
============================================== ===================== 更新2016.4.19
我解決了這個問題。
原因是我的客戶端代碼使用socket.disconnect和socket.connect來模擬新用戶。這是錯誤的。
在這種情況下,服務器可能無法識別斷開的舊套接字。你必須刪除你的套接字對象,並新建一個。
所以你可能會發現連接計數不等於斷開連接計數,這將阻止我們的代碼斷開連接到redis,因此整個循環因redis不響應而掛起。
剛剛在Windows 10上的節點4.2.4上試了一下,在我決定停止它之前得到了超過一百萬的處決權。 –