是什么导致 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;
  }
}

它从未坏过。