回顾一下非响应式网络应用程序的堆栈跟踪,我意识到有些数据与我认为的tomcat工作方式不符。
上下文
对于缓慢的网址,应用程序快速连续受到攻击。这些请求似乎堆积如山,即在应用服务器中形成交通堵塞。记录显示线程/ http连接器的数量已达到最大值(忙线程数已达到maxThreads值120)。
问题
许多线程都在“做某事” - 即。从数据库读取,写入输出流等...然而,超过50个线程“等待连接器提供新的套接字”(来自评论)
这对非套接字程序员究竟意味着什么?
我之前的假设:错误
我假设每个http线程都“做自己的工作” - 获取请求,做一些工作,然后编写响应 - 不需要等待任何事情。
所以...
** 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();
}
感谢
答案 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版本。检查一下。现在我看一下你的症状,我相信你的问题出现在配置文件中。