欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang服務報錯:?write:?broken?pipe的解決方案

 更新時間:2022年09月07日 14:58:33   作者:杰哥的技術(shù)雜貨鋪  
在開發(fā)在線客服系統(tǒng)的時候,看到日志里有一些錯誤信息,下面這篇文章主要給大家介紹了關(guān)于golang服務報錯:?write:?broken?pipe的解決方案,需要的朋友可以參考下

一、程序報錯

發(fā)現(xiàn)BSC節(jié)點報錯: write: broken pipe

2022/04/11 11:23:00 http: panic serving 172.31.34.109:32952: write tcp 172.31.6.64:9093->172.31.34.109:32952: write: broken pipe
goroutine 145578 [running]:
net/http.(*conn).serve.func1(0xc000399720)
    /usr/local/go/src/net/http/server.go:1824 +0x153
panic(0xfbc720, 0xc008f36be0)
    /usr/local/go/src/runtime/panic.go:971 +0x499
github.com/gin-gonic/gin/render.JSON.Render(...)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/render/json.go:56
github.com/gin-gonic/gin.(*Context).Render(0xc00621d600, 0xc8, 0x133ab98, 0xc00be29b10)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/context.go:927 +0x149
github.com/gin-gonic/gin.(*Context).JSON(...)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/context.go:970
bsc-wallet/router/apicommon.ReturnSuccessResponse(0xc00621d600, 0x0, 0x10c16c7, 0x7, 0xee3960, 0xc00ae84d20)
    /go/src/bsc-wallet/router/apicommon/common.go:38 +0xc5
bsc-wallet/router/handler.BlockInfo(0xc00621d600)
    /go/src/bsc-wallet/router/handler/wallethandler.go:395 +0x27e
github.com/gin-gonic/gin.(*Context).Next(...)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/context.go:168
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000120340, 0xc00621d600)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/gin.go:555 +0x2b0
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000120340, 0x133ec38, 0xc0067767e0, 0xc00621d500)
    /go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/gin.go:511 +0x16b
net/http.serverHandler.ServeHTTP(0xc0001881c0, 0x133ec38, 0xc0067767e0, 0xc00621d500)
    /usr/local/go/src/net/http/server.go:2887 +0xa3
net/http.(*conn).serve(0xc000399720, 0x13405b8, 0xc0059e4a40)
    /usr/local/go/src/net/http/server.go:1952 +0x8cd
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:3013 +0x39b

這個錯誤的字面意思為:客戶端可能會在收到服務端響應之前斷開連接

二、問題原因

想到的問題原因可能是以下兩種原因:

  • 服務端所在的服務器,超過了最大連接數(shù)
  • 客戶端在接收到服務端響應之前斷開連接

2.1 連接數(shù)過大

當我們有一些高并發(fā)請求量環(huán)境時,會遇到來自于系統(tǒng)級別的連接數(shù)限制問題,這是因為CentOS根據(jù)系統(tǒng)硬件信息自己默認初始了一個限制連接數(shù)量,往往這個數(shù)量是我們遇到的問題,所以今天我們需要修改系統(tǒng)的默認值來達到我們需要的要求,解決一定的高并發(fā)產(chǎn)生的連接數(shù)問題。

使用以下命令查看當前最大連接數(shù):

# ulimit -n 
1024

臨時修改: 該方法只在當前起作用

# ulimit -n 65535
# ulimit -n 
65535

永久修改:修改以下配置文件

# vim /etc/security/limits.conf

*       soft    nofile  65535
*       hard    nofile  65535
*       soft    nproc  65535
*       hard    nproc  65535

即便你使用limit -n 1024 等這樣的修改是無法其效果的,

以及各種修改可能都不起作用:

經(jīng)過我們的大量研究最終解決了該問題

2.2 調(diào)用者在接收到服務端響應之前斷開連接

該問題可能是因為:client端獲取響應數(shù)據(jù),突然異常退出或直接close連接。

client退出后,server將會發(fā)送兩次數(shù)據(jù),server第一次發(fā)送給client,client返回給server RST。第二次在這個RST的連接上,server繼續(xù)發(fā)送,出現(xiàn)broken pipe。即如下錯誤:

2022/04/11 12:27:53 http: panic serving 172.31.34.109:45842: write tcp 172.31.6.64:9093->172.31.34.109:45842: write: broken pipe

那么此時就會出現(xiàn)兩個問題,server端遲遲沒有響應數(shù)據(jù)給client端,那么也有可能是以下兩個原因:

server端去節(jié)點請求數(shù)據(jù)的時候,節(jié)點一直沒有返回連接數(shù)過高,請求需要排隊處理,可能有的請求還沒有處理完,就已經(jīng)請求超時了

關(guān)于此問題已向client端進行求證,目前連接server端設置的超時時間是:連接超時:0.5秒,響應超時5秒

2.2.1 排查服務器上的連接數(shù)

查看系統(tǒng)連接數(shù)

# 獲取當前socket連接狀態(tài)統(tǒng)計信息
# cat /proc/net/sockstat
sockets: used 1138
TCP: inuse 21 orphan 0 tw 0 alloc 786 mem 220
UDP: inuse 4 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# 統(tǒng)計當前各種狀態(tài)的連接的數(shù)量的命令
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 1020
ESTABLISHED 59

查看端口范圍

# 允許系統(tǒng)打開的端口范圍,用于向外鏈接的端口范圍
# cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999

查看文件打開數(shù)

# 查看當前打開文件數(shù) 
# 如果執(zhí)行緩慢,那么執(zhí)行結(jié)果顯示系統(tǒng)當前打開文件數(shù)500w
# lsof | wc -l
4792741

# 把當前打開文件列表保存
# lsof>>/tmp/lsof.log  

# 查看 5-6萬 行之間的數(shù)據(jù)
sed -n '50000,60000p' /tmp/lsof.log

結(jié)果,bsc,且沒有關(guān)閉:

COMMAND      PID         PPID      USER       PGID      FD          DEVICE       SIZE     NODE     NAME
進程名稱 進程標識符 父進程標識符 進程所有者 進程所屬組 文件描述符   指定磁盤名稱     文件大小   索引節(jié)點  打開文件的確切名稱
bsc-wallet  2105       2125        root      1872u      sock       0,7           0t0    2800355 protocol: TCPv6
bsc-wallet  2105       2125        root      1873u      sock       0,7           0t0    2802021 protocol: TCPv6
bsc-wallet  2105       2125        root      1874u      sock       0,7           0t0    2765499 protocol: TCPv6
bsc-wallet  2105       2125        root      1875u      sock       0,7           0t0    2803112 protocol: TCPv6
bsc-wallet  2105       2125        root      1876u      sock       0,7           0t0    2769274 protocol: TCPv6
bsc-wallet  2105       2125        root      1877u      sock       0,7           0t0    2803114 protocol: TCPv6
bsc-wallet  2105       2125        root      1878u      sock       0,7           0t0    2770305 protocol: TCPv

2.2.2 查看連接狀態(tài)為CLOSE_WAIT的連接情況

統(tǒng)計當前各種狀態(tài)的連接的數(shù)量的命令

#  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 1169
ESTABLISHED 84

查看CLOSE_WAIT是哪臺服務器請求的,以及請求數(shù)

# netstat -a |grep "CLOSE_WAIT"|awk '{print $5}'|awk -F '.' '{print $1}' |sort | uniq -c | sort -nr
   1382 ip-172-31-34-109

2.2.3 延時測試

可以看到情況為:另外一臺服務器上面的服務(客戶端)請求到bsc-clinet(服務端)時,由于在他設置的超時時間內(nèi)未返回請求數(shù)據(jù),客戶端主動關(guān)閉了連接,導致服務端所在的服務器出現(xiàn)大量關(guān)于該服務端的CLOSE_WAIT的連接狀態(tài),最后服務端無法提供服務,報錯: write: broken pipe

服務端未出現(xiàn) CLOSE_WAIT 時的響應時間及延時

服務端目前沒有CLOSE_WAIT連接狀態(tài)

#  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 21

獲取服務端請求響應時間

# curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" -d "number=16619272&sign=b8aaab58e4d73753430c473ba29756d3" http://127.0.0.1:9093/api/block/blockInfo

0.000::0.000::0.088::0.088::1572245.000

-o:把curl 返回的html、js 寫到垃圾回收站[ /dev/null]
-s:去掉所有狀態(tài)
-w:按照后面的格式寫出rt
time_namelookup:DNS 解析域名www.36nu.com的時間
time_commect:client和server端建立TCP 連接的時間
time_starttransfer:從client發(fā)出請求;到web的server 響應第一個字節(jié)的時間
time_total:client發(fā)出請求;到web的server發(fā)送會所有的相應數(shù)據(jù)的時間
speed_download:下周速度 單位 byte/s

上面這條命令及返回結(jié)果可以這么理解:
0.000: DNS 服務器解析www.36nu.com 的時間單位是s
0.000: client發(fā)出請求,到c/s 建立TCP 的時間;里面包括DNS解析的時間
0.088: client發(fā)出請求;到s響應發(fā)出第一個字節(jié)開始的時間;包括前面的2個時間
0.088: client發(fā)出請求;到s把響應的數(shù)據(jù)全部發(fā)送給client;并關(guān)閉connect的時間
1572245.000 :下載數(shù)據(jù)的速度
建立TCP連接到server返回client第一個字節(jié)的時間:0.088s – 0.000s = 0.088s
server把響應數(shù)據(jù)發(fā)送給client的時間:0.088s – 0.088s = 0.000s

模擬客戶端超時時間:連接超時:1秒,響應超時5秒

使用CURL時,有兩個超時時間:一個是連接超時時間,另一個是數(shù)據(jù)傳輸?shù)淖畲笤试S時間。

連接超時時間用–connect-timeout參數(shù)來指定,數(shù)據(jù)傳輸?shù)淖畲笤试S時間用-m參數(shù)來指定。

# curl --connect-timeout 1 -m 5 -d "number=16619272&sign=b8aaab58e4d73753430c473ba29756d3" http://127.0.0.1:9093/api/block/blockInfo

超時時間沒有問題,可以返回數(shù)據(jù)

服務端出現(xiàn) CLOSE_WAIT 時的響應時間及延時

服務端目有大量有CLOSE_WAIT連接狀態(tài)

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 1185
ESTABLISHED 31

獲取服務端請求響應時間

# curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" -d "number=16619272&sign=b8aaab58e4d73753430c473ba29756d3" http://127.0.0.1:9093/api/block/blockInfo

無法請求到服務端

模擬客戶端超時

連接超時的話,出錯提示形如:

curl: (7) Failed connect to 127.0.0.1:9093; Connection refused

數(shù)據(jù)傳輸?shù)淖畲笤试S時間超時的話,出錯提示形如:

curl: (28) Operation timed out after 30001 milliseconds with 0 out of -1 bytes received

三、解決方法

服務端出現(xiàn)大量的CLOSE_WAIT連接狀態(tài),并且都是客戶端請求過來的,說明是客戶端主動關(guān)閉該連接,客戶端需要修改以下兩個問題:

  • 客戶端必須使用HTTP長連接池
  • 客戶端設置的響應超時時間5秒過于理想化,應修改該超時時間

當然,服務端此時需要請求其它服務獲取數(shù)據(jù)返回給客戶端,所以服務端請求時,也必須使用HTTP長連接池,延時可能也會影響該問題的出現(xiàn),不過最主要的原因還是在客戶端上,先修改以上兩個問題即可。

希望大家通過以上方式可以解決自己的實際需求,解決自己目前所遇到的問題。

到此這篇關(guān)于golang服務報錯: write: broken pipe解決的文章就介紹到這了,更多相關(guān)golang服務報錯write: broken pipe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語言中的udp協(xié)議及TCP通訊實現(xiàn)示例

    go語言中的udp協(xié)議及TCP通訊實現(xiàn)示例

    這篇文章主要為大家介紹了go語言中的udp協(xié)議及TCP通訊的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang實現(xiàn)自己的Redis(有序集合跳表)實例探究

    Golang實現(xiàn)自己的Redis(有序集合跳表)實例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)自己的Redis(有序集合跳表)實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang實現(xiàn)AES加密和解密的示例代碼

    Golang實現(xiàn)AES加密和解密的示例代碼

    AES( advanced encryption standard)使用相同密鑰進行加密和解密,也就是對稱加密。本文將詳細講解Golang實現(xiàn)AES加密和解密的方法,感興趣的可以學習一下
    2022-05-05
  • 用Go語言標準庫實現(xiàn)Web服務之創(chuàng)建路由

    用Go語言標準庫實現(xiàn)Web服務之創(chuàng)建路由

    在上一節(jié)中創(chuàng)建了項目,這篇文章主要介紹如何用Go語言標準庫創(chuàng)建路由,文中有詳細的代碼示例,對大家的學習或工作有一定的幫助,感興趣的同學可以參考下
    2023-05-05
  • go-spew調(diào)試利器詳解

    go-spew調(diào)試利器詳解

    這篇文章主要介紹了調(diào)試利器?go-spew,go-spew?可以以一種非常友好的方式輸出完整的數(shù)據(jù)結(jié)構(gòu)信息,go-spew?支持一些自定義配置,可以通過?spew.Config?修改,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • goland 搭建 gin 框架的步驟詳解

    goland 搭建 gin 框架的步驟詳解

    這篇文章主要介紹了goland 搭建 gin 框架的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • go語言處理TCP拆包/粘包的具體實現(xiàn)

    go語言處理TCP拆包/粘包的具體實現(xiàn)

    TCP的拆包/粘包也算是網(wǎng)絡編程中一個比較基礎的問題了,本文主要介紹了go語言處理TCP拆包/粘包,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 如何使用Golang創(chuàng)建與讀取Excel文件

    如何使用Golang創(chuàng)建與讀取Excel文件

    我最近工作忙于作圖,圖表,需要自己準備數(shù)據(jù)源,所以經(jīng)常和Excel打交道,下面這篇文章主要給大家介紹了關(guān)于如何使用Golang創(chuàng)建與讀取Excel文件的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • go語言interface接口繼承多態(tài)示例及定義解析

    go語言interface接口繼承多態(tài)示例及定義解析

    這篇文章主要為大家介紹了go語言interface接口繼承多態(tài)示例及定義解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • golang如何實現(xiàn)三元運算符功能

    golang如何實現(xiàn)三元運算符功能

    這篇文章主要介紹了在其他一些編程語言中,如?C?語言,三元運算符是一種可以用一行代碼實現(xiàn)條件選擇的簡便方法,那么在Go語言中如何實現(xiàn)類似功能呢,下面就跟隨小編一起學習一下吧
    2024-02-02

最新評論