我有一個我編寫的 golang 程序(它是一個 FTP 服務器),它在運行時具有 100% 的 CPU。我在 strace 中看到:futex(0xa83918, FUTEX_WAIT, 0, NULLread(9, "", 4096) = 0read(9, "", 4096) = 0read(9, "", 4096) = 0read(9, "", 4096) = 0read(9, "", 4096) = 0read(8, "", 4096) = 0read(8, "", 4096) = 0read(8, "", 4096) = 0read(8, "", 4096) = 0read(8, "", 4096) = 0一遍又一遍。它陷入了一些無限循環(huán)。它的主要 for 循環(huán)是: for { tcpConn, err := listener.Accept() if err != nil { Server.logger.Print("listening error") break } driver, err := Server.driverFactory.NewDriver() if err != nil { Server.logger.Print("Error creating driver, aborting client connection") } else { ftpConn := Server.newConn(tcpConn, driver, Server.Auth) go ftpConn.Serve() } }知道是什么導致了無限循環(huán)?當程序啟動時,它并不處于這種糟糕的狀態(tài)。它以正常的 CPU 使用率正常循環(huán)。它需要運行幾個小時才能進入這種不良狀態(tài)。
2 回答

守著星空守著你
TA貢獻1799條經(jīng)驗 獲得超8個贊
原來這根本不是 TCP 相關的。由于“\n”輸入問題,這是代碼中的一個while循環(huán),永遠不會結束。即我有:
for {
if something {
break;
}
}
它從未破裂。

慕桂英3389331
TA貢獻2036條經(jīng)驗 獲得超8個贊
當您嘗試在錯誤時創(chuàng)建新驅(qū)動程序時,也許嘗試關閉 tcpConn。此外,嘗試檢查 Server.newConn(tcpConn, driver, Server.Auth) 在連接完成時是否實際關閉了連接。
- 2 回答
- 0 關注
- 219 瀏覽
添加回答
舉報
0/150
提交
取消