我有一个我写的golang程序(它是一个FTP服务器),在运行时有100%的CPU。我在strace中看到了:
futex(0xa83918, FUTEX_WAIT, 0, NULL
read(9, "", 4096) = 0
read(9, "", 4096) = 0
read(9, "", 4096) = 0
read(9, "", 4096) = 0
read(9, "", 4096) = 0
read(8, "", 4096) = 0
read(8, "", 4096) = 0
read(8, "", 4096) = 0
read(8, "", 4096) = 0
read(8, "", 4096) = 0
一遍又一遍。它陷入了一些无限循环。它的主要循环是:
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()
}
}
知道造成无限循环的原因是什么?当程序启动时,它不处于这种不良状态。它正常循环使用正常的cpu。它需要几个小时的运行才能进入这种糟糕的状态。
答案 0 :(得分:2)
事实证明这与TCP无关。由于“\ n”输入问题,这是代码永远不会结束的while循环。即我:
for {
if something {
break;
}
}
它永远不会破裂。
答案 1 :(得分:0)
当您尝试在出错时创建新驱动程序时,可能尝试关闭tcpConn。另外,尝试检查Server.newConn(tcpConn,driver,Server.Auth)在完成连接时是否实际关闭了连接。