2016-04-12 62 views
0
的NodeJS這裏

是代碼:是什麼原因造成process.hrtime()掛在

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不響應而掛起。

+0

剛剛在Windows 10上的節點4.2.4上試了一下,在我決定停止它之前得到了超過一百萬的處決權。 –

回答

0

您的代碼是一個無限循環 - 在某些時候,這將永遠耗盡系統資源並導致應用程序掛起。

除了導致您的應用程序掛起之外,您發佈的代碼還沒有其他功能。從本質上講,它可以這樣來描述:

For the rest of eternity, or until my app hangs, (whichever happens first): 
    Get the current high-resolution real time, and then ignore it without doing anything with it. 
    Increment a number and log it 
Repeat as quickly as possible 

如果這真的是你想要做什麼 - 你已經來達到的,但它總是會在某個時候掛起。否則,你可能想進一步解釋你想要的結果。

+0

是的,我意識到這是一個愚蠢的問題。我更新了我的問題,請檢查。現在它可能會解釋我自己。 「 – user3736388

+0

」在某些時候,這將永遠耗盡系統資源並導致應用程序掛起。「 ---究竟是什麼資源耗盡? – zerkms

相關問題