【问题标题】:Tomcat6 on Linux uses 100% CPU whenever ServerSocket is idle每当 ServerSocket 空闲时,Linux 上的 Tomcat6 使用 100% CPU
【发布时间】:2010-02-28 12:30:11
【问题描述】:

问候

我在 Ubuntu8.04 上的 Java6 上的 Tomcat6 上运行我的 webapp。 这个应用程序的主 servlet 打开一个 ServerSocket,代码如下:

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

当然,这在单独的线程中运行,并带有必要的 try-catch 块。

当我启动 Tomcat 时,它会立即进入 100% 的 CPU 负载并一直保持在那里,直到客户端连接到端口 6767。只要客户端连接,负载就会下降到 0%。一旦客户端断开连接,负载就会恢复到 100%。

谁能告诉我这是怎么回事?

谢谢!

解决方案:

以下两个答案都非常有帮助。问题实际上与 ServerSocket 无关,而是与应用程序的完全不同线程中的无眠 while 循环有关,还取决于客户端是否已连接。

我能够使用 JDK 命令“jstack”识别活动线程,然后很容易找到带有失控循环的线程。

感谢您的帮助! :)

【问题讨论】:

    标签: java load cpu tomcat6 serversocket


    【解决方案1】:

    也许找出正在发生的事情的最简单方法是等待它以 100% 运行,并通过Ctrl-Break(或使用SendSignal 或类似方法)生成线程转储。您将获得一组线程及其状态,并且应该很清楚哪些线程正在运行,以及它在代码中的位置。

    【讨论】:

    • 谢谢!我刚刚完成了这项工作,使用的是 JDK 中包含的命令“jstack”,您可以通过 PID 提供该命令。似乎是最简单的方法:) 现在我只需要理解那个线程转储......
    【解决方案2】:

    客户端断开连接后,负载立即恢复到 100%。

    这通常出现在没有 sleep() 的“while loop”中。
    有关说明,请参阅 this thread

    例子:

    try
    {
      while (m_flagRunUserThreadManager)
      {
        try
        {
          m_listenSocket.setSoTimeout(10000);
          Socket clientSocket = m_listenSocket.accept();
          //create a thread for client
          MyClientHandler clientHandler = new ClientHandler(clientSocket);
          clientHandler.setPriority(Thread.MIN_PRIORITY);
          clientHandler.start(); 
    
        }
        catch(SocketTimeoutException excp)
        {
          String strError = "No requests for 10 Sec.";
          //display this message    
        }
      }
    }
    catch(IOException excp)
    {
        // display the exception
    }
    

    这是因为您的 while loop 有一条没有睡眠的路径通过它,特别是当您的尝试失败时。
    您需要在某个地方睡觉,以便其他线程/进程有机会。要么这样,要么不要继续尝试已经失败的客户端。

    【讨论】:

    • 不是ServerSocket.accetp();应该阻塞,因此让所有其他线程有机会运行,直到它真正从客户端获得连接尝试?还是我理解错了?
    • @Lou: true;但是根据 where 您调用 accept() 方法,它仍然可以冻结所有内容:请参阅 stackoverflow.com/questions/2170551/…
    • 我添加了一个 sleep() 和 setSoTimeout(10000),它们肯定都是好东西,让我的应用程序更健壮。但我的问题不是应用程序没有响应,而是 CPU 负载在 accept() 阻塞时达到 100%(或者至少看起来是这样)。
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2019-04-26
    • 2021-06-04
    • 2012-09-17
    • 1970-01-01
    • 2012-05-18
    • 2020-03-15
    相关资源
    最近更新 更多