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

时间:2016-03-11 00:13:52

标签: go infinite-loop ftp-server

我有一个我写的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。它需要几个小时的运行才能进入这种糟糕的状态。

2 个答案:

答案 0 :(得分:2)

事实证明这与TCP无关。由于“\ n”输入问题,这是代码永远不会结束的while循环。即我:

for {
  if something {
    break;
  }
}

它永远不会破裂。

答案 1 :(得分:0)

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