真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nodejs問題是怎么樣排查的

nodejs問題是怎么樣排查的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司專注于廬陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供廬陽營(yíng)銷型網(wǎng)站建設(shè),廬陽網(wǎng)站制作、廬陽網(wǎng)頁設(shè)計(jì)、廬陽網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造廬陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供廬陽網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

相信大家都遇到過Error: read ECONNRESET這個(gè)錯(cuò)誤。雖然通過ECONNRESET錯(cuò)誤碼我們很容易查到這個(gè)錯(cuò)誤意味著什么,但是通過源碼和分析工具進(jìn)行一次徹底的分析,會(huì)讓你更加了解這個(gè)錯(cuò)誤的產(chǎn)生和原理。更讓人神清氣爽。
下面分為兩個(gè)部分,首先通過nodejs源碼分析這個(gè)錯(cuò)誤產(chǎn)生的原因,然后通過網(wǎng)絡(luò)工具抓包的方式捕獲這個(gè)錯(cuò)誤。
1 源碼分析
我們從建立一個(gè)tcp連接成功后,nodejs執(zhí)行的操作開始分析(net.js)。

nodejs問題是怎么樣排查的  

這是連接成功后執(zhí)行的nodejs回調(diào)?;卣{(diào)里執(zhí)行了新建一個(gè)socket表示和客戶端通信的對(duì)象。我們看new Socket做了什么事情。  
 
nodejs問題是怎么樣排查的  

new Socket的主要邏輯有  
1 保存和客戶端通信的handle(socket)  
2 注冊(cè)讀回調(diào)  
3 注冊(cè)讀事件  
我們先看第三點(diǎn)  
 
nodejs問題是怎么樣排查的  

socket是可讀可寫的流,read(0)直接調(diào)用可讀流的函數(shù),可讀流提供了抽象的邏輯,具體的讀取操作由子類實(shí)現(xiàn)(實(shí)現(xiàn)_read函數(shù),可讀取的read會(huì)調(diào)用_read函數(shù))。我們看一下Socket類_read函數(shù)的實(shí)現(xiàn)。  
 
nodejs問題是怎么樣排查的  

直接調(diào)用handle的readStart函數(shù)。因?yàn)槲覀冞@里使用的是tcp服務(wù)。所以handle對(duì)應(yīng)的實(shí)現(xiàn)在tcp_wrap.cc里。但是我們發(fā)現(xiàn)tcp_wrap.cc沒有readStart函數(shù)。一路往父類找,最終在stream_wrap.cc找到了該函數(shù)。  
 
nodejs問題是怎么樣排查的  

該函數(shù)直接調(diào)用libuv的uv_read_start函數(shù),三個(gè)入?yún)⒎謩e是  
1 uv_tcp_t結(jié)構(gòu)體  
2 分配內(nèi)存保存讀取的數(shù)據(jù)  
3 讀取后執(zhí)行的回調(diào)(包括讀取失敗)  
繼續(xù)往下走。  
 
nodejs問題是怎么樣排查的  

這時(shí)候nodejs就在底層注冊(cè)了一個(gè)可讀事件,等到有數(shù)據(jù)或者發(fā)送出錯(cuò)的時(shí)候,會(huì)觸發(fā)上層回調(diào)(雖然只注冊(cè)了可讀事件,但是如果有錯(cuò)誤發(fā)生,epoll會(huì)返回POLLIN和POLLERR事件)。這時(shí)候客戶端發(fā)送了一個(gè)rst。這時(shí)候會(huì)執(zhí)行l(wèi)ibuv的回調(diào)uv__stream_io(而不是nodejs傳進(jìn)來那個(gè),那個(gè)read_cb,read_cb是由libuv回調(diào)的)  
 
nodejs問題是怎么樣排查的  

接著我們看uv_read  
 
nodejs問題是怎么樣排查的  

重點(diǎn)在read函數(shù),我們不妨多看點(diǎn)代碼,看一下rst和read在linux下的實(shí)現(xiàn)。  
 
nodejs問題是怎么樣排查的  

上面是操作系統(tǒng)收到一個(gè)rst包時(shí)的操作。設(shè)置對(duì)應(yīng)socket的錯(cuò)誤信息為ECONNRESET,并設(shè)置狀態(tài)為close。如果這時(shí)候用戶執(zhí)行read會(huì)怎樣呢?  
 
nodejs問題是怎么樣排查的  

read函數(shù)會(huì)直接把錯(cuò)誤信息返回給調(diào)用方。我們回到libuv中,當(dāng)libuv調(diào)用read函數(shù)的時(shí)候,返回了錯(cuò)誤碼ECONNRESET。然后libuv執(zhí)行nodejs的read_cb回調(diào)。如果我們還記得的話,nodejs提供的回調(diào)是OnUvRead。  
 
nodejs問題是怎么樣排查的  

nodejs套了很多層,不過我們還是找到了他,最后的MakeCallback(env->onread_string(), arraysize(argv), argv)就是執(zhí)行js層的onread函數(shù)。這個(gè)函數(shù)我們一開始的時(shí)候也提到了?;氐絥et.js。  
 
nodejs問題是怎么樣排查的  

nodejs的onread函數(shù)執(zhí)行了destroy函數(shù)。這里就不具體展開,destroy做的事情就是調(diào)用_destroy函數(shù)。然后emit一個(gè)error事件,并傳入一個(gè)Error對(duì)象(包含了錯(cuò)誤碼和系統(tǒng)調(diào)用函數(shù)等信息)。觸發(fā)error事件的時(shí)候,我們就輸出了read ECONNRESET。至此,整個(gè)源碼分析過程結(jié)束。

2 抓包分析
登錄服務(wù)器,使用tcpdump工具,主要是過濾出想要的數(shù)據(jù)包。這里找出有問題的那幾個(gè)ip。過濾條件設(shè)置為

tcpdump -i any -q -A  -nn src ip1 or dst ip1 or src ip2 or dst ip2 -w tcp.cap
 

保存為cap文件,然后下載到wireshark分析(linux下分析會(huì)比較麻煩點(diǎn))。最后發(fā)現(xiàn)同一個(gè)時(shí)間點(diǎn),抓包和日志系統(tǒng)都輸出了相關(guān)的錯(cuò)誤。

nodejs問題是怎么樣排查的  
在這里插入圖片描述
nodejs問題是怎么樣排查的  

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


標(biāo)題名稱:nodejs問題是怎么樣排查的
鏈接地址:http://weahome.cn/article/jpgsei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部