什么“Tomcat Endpoint”等待对象监视器意味着什么?

时间:2011-03-15 03:59:01

标签: java http sockets tomcat jboss

回顾一下非响应式网络应用程序的堆栈跟踪,我意识到有些数据与我认为的tomcat工作方式不符。

上下文

对于缓慢的网址,应用程序快速连续受到攻击。这些请求似乎堆积如山,即在应用服务器中形成交通堵塞。记录显示线程/ http连接器的数量已达到最大值(忙线程数已达到maxThreads值120)。

  • Jboss 4.2.2
  • 使用名为'jboss-web'
  • 的tomcat 6.0变体

问题

许多线程都在“做某事” - 即。从数据库读取,写入输出流等...然而,超过50个线程“等待连接器提供新的套接字”(来自评论)

这对非套接字程序员究竟意味着什么?

我之前的假设:错误

我假设每个http线程都“做自己的工作” - 获取请求,做一些工作,然后编写响应 - 需要等待任何事情。

所以...

  • 发生了什么事?有人可以澄清socket-ish的东西吗?
  • tomcat设置的这个瓶颈有什么含义? (即增加此设置,减少该设置等)

** Stack Trace **

"http-0.0.0.0-80-90" daemon prio=6 tid=0x695e1400 nid=0x24c in Object.wait() [0x6e8cf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
    - locked <0x09c34480> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
    at java.lang.Thread.run(Thread.java:619)
   Locked ownable synchronizers:
    - None

来自Tomcat的org.apache.tomcat.util.net.JIOEndpoint的代码片段

     /**
     * Process an incoming TCP/IP connection on the specified socket.  Any
     * exception that occurs during processing must be logged and swallowed.
     * <b>NOTE</b>:  This method is called from our Connector's thread.  We
     * must assign it to our own thread so that multiple simultaneous
     * requests can be handled.
     *
     * @param socket TCP socket to process
     */
    synchronized void assign(Socket socket) {

        // Wait for the Processor to get the previous Socket
        while (available) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }

        // Store the newly available Socket and notify our thread
        this.socket = socket;
        available = true;
        notifyAll();

    }

感谢

1 个答案:

答案 0 :(得分:4)

maxNumThreads设置不会影响servlet容器的性能,而是需要更大的堆和更多的cpu周期(如果你的线程被激活)。但是,每次将该设置修改为大于150的数字时,您可能会认为应用程序存在瓶颈。

Web服务器的设计不能处理超过100个并发请求。如果您发现自己处于这种情况,请考虑进行群集。我看到你正在使用jbossweb,这里有一篇非常好的文章:

http://refcardz.dzone.com/refcardz/getting-started-jboss

但是,由于我认为您不会有超过100个同时请求,我认为这是您应用程序的瓶颈。要检查的是您的jdbc驱动程序,您使用的jdk版本,tomcat版本(在您的情况下为6.0)。对您的应用程序的请求应该在不到1秒的时间内完成 - 网络延迟(甚至这是一个太大的延迟),如果您发现它们需要更多,它可能在您的代码中的某个位置。您是手动关闭/打开数据库连接,在后台使用高效线程,是否使用JMS。这是通常要看的东西。另一个可能是您的特定servlet容器版本中的错误。

P.S如果您决定使用更多数量的最大线程,可能有必要减少/增加线程堆栈大小并查看它如何影响性能。如果你有长期存在的线程(不应该这样),你可能想要增加堆栈大小。如果您有短暂的线程,请尝试减小堆栈大小以保留一点内存。 -Xss是旗帜。

另外,我刚刚看到你正在使用的jboss AS版本。检查一下。现在我看一下你的症状,我相信你的问题出现在配置文件中。