通过Java套接字发送小文件时的性能问题

时间:2015-03-12 05:08:17

标签: java sockets

我正在构建一个Web服务器应用程序,根据请求使用HTTP 1.1协议和分块传输编码将不同大小的文件从服务器发送到客户端。

我使用Java Sockets / ServerSockets来处理连接。我使用从socket.getOutputStream()获得的输出流将数据发送到客户端。注意:我将套接字的输出流包装在BufferedOutputStream中。

(我使用chrome调试器来分析资源时间)

我看到的问题是,一个大小为1285字节的文件(加上标题和块编码)需要花费超过50毫秒才能让chrome接收请求的第一个字节。 (Chrome报告的TTFB为~50ms),然后快速传输剩余(1-2ms)(总传输时间~52ms)

但是如果我将文件的大小增加到1286字节,TTFB会急剧下降到~1ms。 (总传输时间~3ms)

我尝试在flush强制OutputStream处于不同的点,包括在请求标头之后,在块之后,甚至在每个点尝试多个flush调用乐趣。

我的问题:为什么小文件的传输时间比任何大于或等于1286字节的文件长得多?我该怎么做才能解决这个性能问题?

我的理论:底层套接字实现中的某些内容忽略了对flush底层套接字缓冲区的Java请求,尽管Java调用{{1} }。

1 个答案:

答案 0 :(得分:2)