91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs問題是怎么樣排查的

發布時間:2021-12-13 17:43:34 來源:億速云 閱讀:170 作者:柒染 欄目:大數據

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

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

nodejs問題是怎么樣排查的  

這是連接成功后執行的nodejs回調。回調里執行了新建一個socket表示和客戶端通信的對象。我們看new Socket做了什么事情。  
 
nodejs問題是怎么樣排查的  

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

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

直接調用handle的readStart函數。因為我們這里使用的是tcp服務。所以handle對應的實現在tcp_wrap.cc里。但是我們發現tcp_wrap.cc沒有readStart函數。一路往父類找,最終在stream_wrap.cc找到了該函數。  
 
nodejs問題是怎么樣排查的  

該函數直接調用libuv的uv_read_start函數,三個入參分別是  
1 uv_tcp_t結構體  
2 分配內存保存讀取的數據  
3 讀取后執行的回調(包括讀取失敗)  
繼續往下走。  
 
nodejs問題是怎么樣排查的  

這時候nodejs就在底層注冊了一個可讀事件,等到有數據或者發送出錯的時候,會觸發上層回調(雖然只注冊了可讀事件,但是如果有錯誤發生,epoll會返回POLLIN和POLLERR事件)。這時候客戶端發送了一個rst。這時候會執行libuv的回調uv__stream_io(而不是nodejs傳進來那個,那個read_cb,read_cb是由libuv回調的)  
 
nodejs問題是怎么樣排查的  

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

重點在read函數,我們不妨多看點代碼,看一下rst和read在linux下的實現。  
 
nodejs問題是怎么樣排查的  

上面是操作系統收到一個rst包時的操作。設置對應socket的錯誤信息為ECONNRESET,并設置狀態為close。如果這時候用戶執行read會怎樣呢?  
 
nodejs問題是怎么樣排查的  

read函數會直接把錯誤信息返回給調用方。我們回到libuv中,當libuv調用read函數的時候,返回了錯誤碼ECONNRESET。然后libuv執行nodejs的read_cb回調。如果我們還記得的話,nodejs提供的回調是OnUvRead。  
 
nodejs問題是怎么樣排查的  

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

nodejs的onread函數執行了destroy函數。這里就不具體展開,destroy做的事情就是調用_destroy函數。然后emit一個error事件,并傳入一個Error對象(包含了錯誤碼和系統調用函數等信息)。觸發error事件的時候,我們就輸出了read ECONNRESET。至此,整個源碼分析過程結束。


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

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

保存為cap文件,然后下載到wireshark分析(linux下分析會比較麻煩點)。最后發現同一個時間點,抓包和日志系統都輸出了相關的錯誤。

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汶川县| 普兰县| 六枝特区| 灌阳县| 东丽区| 宁阳县| 托里县| 玛沁县| 屯留县| 合水县| 遂宁市| 新化县| 莱西市| 平泉县| 堆龙德庆县| 抚顺市| 五峰| 峨眉山市| 宿迁市| 娄底市| 乌兰察布市| 新巴尔虎右旗| 怀来县| 天峨县| 成安县| 乐陵市| 黄龙县| 英吉沙县| 三门峡市| 罗平县| 林周县| 凉城县| 台北县| 泰兴市| 乌拉特中旗| 邓州市| 渑池县| 浦东新区| 襄城县| 休宁县| 云林县|