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

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

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

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

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

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

我已经尝试在沿途的不同点强制刷新OutputStream,包括在请求标题之后,在块之后,甚至在每个点尝试多次刷新调用只是为了好玩.

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

我的理论:底层套接字实现中的某些东西忽略了刷新底层套接字缓冲区的Java请求,尽管Java调用了flush().

最佳答案 禁用Nagle的算法可以解决此问题.

http://www.boundary.com/blog/2012/05/know-a-delay-nagles-algorithm-and-you/

点赞