我正在向WebSphere 的response.getOutputStream() 编写一个大型响应(数百Mb)。
看起来,Web Sphere 总是将整个输出流数据存储在一些内部内存缓冲区中,然后再将其提供给客户端。因此,我的服务器处理(生成数据)在几秒钟内完成,而浏览器可能仍在下载半个小时。在此期间,整个响应仍缓冲在内存中。
是否可以避免这种缓冲?
我宁愿有更多的 servlet 线程等待输出流,也不愿浪费 Gb 的内存。
我的Web Sphere 版本是8.5.0。
我尝试过设置内容长度和分块响应 - 它都是一样的,仍在缓冲。
我的 TCP 传输链设置默认为 32 kb 响应缓冲区,但不知何故被忽略。
同时在WAS Web容器中找到了答案自定义属性 http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/rweb_custom_props.html.
默认情况下,Web 容器使用异步写入以块形式写入响应数据,最多可达响应缓冲区大小。对于大于响应缓冲区大小的较大响应,Web 容器会继续将响应数据缓冲到内存中,同时等待响应数据块的异步写入完成。此过程可能会导致内存中保存大量响应,从而导致内存使用率较高,并可能导致内存不足错误。当服务器同时处理的请求多于 Web 容器定义的线程时,也可能会发生应用程序服务器挂起。
如果 com.ibm.ws.webcontainer.channelwritetype 属性设置为sync,则使用同步写入,否则默认情况下使用异步写入。使用同步写入时,响应数据将同步写入最大为responsebuffersize 值的块中,并且在等待响应数据块的同步写入完成时不会将任何响应数据缓冲到内存中。因此,内存中保存的响应数据的最大量大约等于响应缓冲区大小乘以 Web 容器线程数。 Web 容器可以同时处理的最大请求数受到 Web 容器线程数的限制。其他请求将排队,等待正在处理的请求完成。
responsebuffersize Web 容器自定义属性定义 Web 容器在单个块中写入的最大响应数据量,默认情况下为 32k。因此,它用于更改 Web 容器发送完整响应数据所需的写入次数。但是,如果应用程序刷新响应数据,则无论响应缓冲区大小如何,Web 容器保存的任何响应数据都会立即写入。
使用以下名称/值对通过同步写入来写入数据块。
com.ibm.ws.webcontainer.channelwritetype 异步
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)