是什么导致golang程序处于100%CPU状态?

是什么导致golang程序处于100%CPU状态?,go,infinite-loop,ftp-server,Go,Infinite Loop,Ftp Server,我有一个我写的golang程序(它是一个FTP服务器),运行时有100%的CPU。我清楚地看到: futex(0xa83918, FUTEX_WAIT, 0, NULL read(9, "", 4096) = 0 read(9, "", 4096) = 0 read(9, "", 4096) = 0 read(9, "", 4096)

我有一个我写的golang程序(它是一个FTP服务器),运行时有100%的CPU。我清楚地看到:

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使用情况下正常循环。它需要运行几个小时才能进入这种糟糕的状态。

当您试图在出错时创建新的驱动程序时,也许可以尝试关闭tcpConn。另外,尝试检查Server.newConn(tcpConn,driver,Server.Auth)是否在连接完成时实际关闭了连接。

结果表明,这与TCP无关。由于“\n”输入问题,代码中的while循环从未结束。i、 e.我有:

for {
  if something {
    break;
  }
}

它从来没有坏过。

什么是FD9?检查
ls-lah/proc/YOURPID/fd/9
TCP ftp-001.foo.bar.com:ftp->1a.a1.11a1.ip4.static.sl reverse.com:30006(CLOSE_WAIT)啊,这好像是我的问题:“你的程序还在运行,还没有关闭套接字(内核正在等待它关闭)”,这段代码没有显示问题。看起来您的ftp包没有正确关闭连接