【问题标题】:WebSphere response bufferingWebSphere 响应缓冲
【发布时间】:2014-01-09 14:42:18
【问题描述】:

我正在向 WebSphere 的 response.getOutputStream() 写入一个大响应(数百 Mb)。 看起来,Web Sphere 总是将整个输出流数据存储在一些内部内存缓冲区中,然后再将其提供给 cient。所以我的servet处理(生成数据)在几秒钟内完成,而浏览器可能仍在下载半小时。在此期间,整个响应仍然缓冲在内存中。

是否可以避免这种缓冲? 我宁愿更多的 servlet 线程等待输出流,而不是浪费 Gbs 的内存。

我的 Web Sphere 版本是 8.5.0。

我已经尝试设置内容长度和分块响应 - 都是一样的,仍然在缓冲。 我的 TCP 传输链设置默认为 32 kb 响应缓冲区,但不知何故被忽略了。

【问题讨论】:

    标签: http servlets websphere


    【解决方案1】:

    同时在 WAS Web 容器 custom properties 中找到了答案。

    默认情况下,Web 容器使用异步写入将响应数据以块的形式写入响应缓冲区大小。对于大于响应缓冲区大小的较大响应,Web 容器继续将响应数据缓冲到内存中,同时等待响应数据块的异步写入完成。此过程可能会导致部分大型响应保存在内存中,这可能导致内存使用率高,并可能导致内存不足错误。当服务器同时处理的请求多于 Web 容器定义的线程时,也可能发生应用程序服务器挂起。

    如果com.ibm.ws.webcontainer.channelwritetype属性设置为sync,则使用同步写入,否则默认使用异步写入。使用同步写入,响应数据以最大为 responsebuffersize 值的块同步写入,并且在等待响应数据块的同步写入完成时,没有响应数据缓冲到内存中。因此,内存中保存的响应数据的最大近似值等于响应缓冲区大小乘以 Web 容器线程数。 Web 容器可以同时处理的最大请求数受 Web 容器线程数的限制。其他请求排队等待处理中的请求完成。

    responsebuffersize Web 容器自定义属性定义了 Web 容器在单个块中写入的最大响应数据量,默认为 32k。因此,它用于更改 Web 容器发送完整响应数据所需的写入次数。但是,如果应用程序刷新响应数据,则 Web 容器保存的任何响应数据都会立即写入,而与响应缓冲区大小无关。

    使用以下名称-值对通过同步写入来写入数据块。

    com.ibm.ws.webcontainer.channelwritetype async

    【讨论】:

      【解决方案2】:

      您确定 Websphere 将这些数据存储在内部内存缓冲区中吗? Websphere 通道输出缓冲区一次只能保存 32K 的数据。所以剩下的数据可能由你的 servlet 持有,因为你已经生成了一些存储在堆中并被你的代码引用的大数据。

      查看您的代码,看看您的代码引用了哪些数据,如果您想知道内存中存储了什么以及谁在保持它处于活动状态,请拍摄堆快照(堆转储)。

      【讨论】:

      • 我开始查看我的代码并调查内存使用情况,没有发现任何可疑之处。我最终得到了一个简单的测试 servlet,它只是将字节写入输出流,它不存储任何东西。而且 WAS 本身使用本机内存作为“异步响应”缓冲区,因此它作为堆的一部分是不可见的。
      猜你喜欢
      • 2020-12-03
      • 1970-01-01
      • 2019-12-03
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多