2011-03-15 60 views
1

回顾无响应的web应用程序的堆栈跟踪,我意识到一些数据与我的想法tomcat作品不匹配。等待对象监视器的“Tomcat Endpoint”是什么意思?

语境

该应用程序是击中快速连续一个缓慢的URL。这些请求似乎堆积如山,即在应用程序服务器中形成堵车。日志记录显示线程/ http连接器的数量已经最大(繁忙线程的数量已爬升至maxThreads值120)。

  • 的Jboss 4.2.2
  • 使用名为 'JBoss的,网络'

问题

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

这对于非易失性存储器来说意味着什么,套接字编程器?

我之前的假设:错误

我曾以为,每个HTTP线程将“做自己的工作” - 获得请求,做了一些工作,并写出反应 - 需要等待任何事情。

所以......

  • 这是怎么回事?有人可以澄清socket-ish的东西吗?
  • 这样的tomcat设置的瓶颈是什么意思?从Tomcat的org.apache.tomcat.util.net.JIOEndpoint

    (即增加此设置,降低一个等)

**堆栈跟踪**

"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 

代码片段

 /** * 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(); } 

感谢

回答

4

的maxNumThreads设置不会影响servlet容器的PERFO而不是要求更大的堆和更多的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版本。检查也。现在我看看你的症状,我相信你的问题在配置文件中。