是什么导致 golang 程序处于 100% CPU?
What is causing golang program being at 100% CPU?
我有一个我写的 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循环是:
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 用法正常循环。它需要几个小时 运行 才能进入这种不良状态。
当您尝试创建新的驱动程序时出错,也许可以尝试关闭 tcpConn。另外,尝试检查 Server.newConn(tcpConn, driver, Server.Auth) 是否在连接完成时实际关闭连接。
事实证明这根本与 TCP 无关。这是代码中的一个 while 循环,由于“\n”输入问题而永远不会结束。即我有:
for {
if something {
break;
}
}
它从未坏过。
我有一个我写的 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循环是:
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 用法正常循环。它需要几个小时 运行 才能进入这种不良状态。
当您尝试创建新的驱动程序时出错,也许可以尝试关闭 tcpConn。另外,尝试检查 Server.newConn(tcpConn, driver, Server.Auth) 是否在连接完成时实际关闭连接。
事实证明这根本与 TCP 无关。这是代码中的一个 while 循环,由于“\n”输入问题而永远不会结束。即我有:
for {
if something {
break;
}
}
它从未坏过。