8

对 WebSphere 有疑问,但在文档中找不到任何内容...

当 WebContainer 线程池被完全使用并收到新的请求时会发生什么?我说的是当所有线程池都被使用并且我们达到最大线程池大小时的情况,这意味着可能不会创建新的线程池来处理请求。

请求会: - 立即失败并且响应将包含某种错误吗?- WAS 会以某种方式将请求“排队”给定时间段并在其中一个线程返回池中时对其进行处理?如果等待时间太长,仍然可能会发生某种错误/超时?- WAS 将无限期地“排队”请求并且超时可能只发生在用户端(Web 浏览器/应用程序)?

4

1 回答 1

9

确切的行为可能没有记录,因此可以在版本之间更改细节以改进行为。您可以通过查看 javacore 或从各种文档中收集信息来推断行为,例如此IBM WebSphere Application Server Performance Cookbook文档的 BoundedBuffer 部分:

线程池请求缓冲区本质上是线程池前面的积压。如果线程池达到其最大大小并且所有线程都已调度,那么工作将在 requestBuffer 中排队。requestBuffer 的最大大小等于线程池最大大小;但是,如果工作单元在阻塞模式为 EXPAND_WHEN_QUEUE_IS_FULL_ERROR_AT_LIMIT 或 EXPAND_WHEN_QUEUE_IS_FULL_WAIT_AT_LIMIT 的线程池上执行,则最大大小为 ThreadPoolMaxSize * 10。当 requestBuffer 填满时,将发出 WSVR0629I(尽管这种情况仅在每次JVM 每个线程池运行)。当 requestBuffer 已满时,工作将等待或抛出 ThreadPoolQueueIsFullException,具体取决于工作单元的执行方式。

实际上,这意味着在 maxThreads 线程忙于执行工作之后,额外的 maxThreads 请求将在有界缓冲区中排队,当该缓冲区已满时,套接字线程将阻塞,直到它可以将工作排队,这意味着进一步的传入请求将被阻塞,直到线程变得可用并在有界缓冲区中腾出空间。

于 2015-08-12T17:06:00.833 回答