Java OutputStream文件使用httpclient上传性能

时间:2016-07-28 16:27:25

标签: java multithreading io apache-httpclient-4.x

我有一个在我的linux服务器(debian 7)的后台运行的java jar应用程序。服务器通常通过apache接收文件,然后jar定期拉出数据库,使用来自httpclient(v2.5)的http连接池将文件上传到最终目的地。

服务器是16GB内存,8内核cpu,1To磁盘和2Gb / s互联网带宽。我的问题是,jar的上传仅占10%或20%的带宽。经过多次调查后,我认为这是因为远程服务器的容量可能是瓶颈。 所以我想在我的服务器上启动更多线程以同时处理更多文件并使用我拥有的所有带宽,不幸的是,使用httpclient进行文件上传似乎正在吃掉很多cpu!

实际上,jar正在使用20个同时上传的可运行线程,并且cpu始终处于100%,如果我尝试启动更多线程,则平均负载增加并打破记录,使系统变得如此缓慢且无法使用。 奇怪的是,iowaits似乎是空的,所以我真的不知道是什么导致了平均负载。

我只使用一个线程运行一个hprof,结果如下:

/users/xx/xxxx/pyenvs/xx/lib/python2.7/site-packages/pandas-0.16.2+xxx1- py2.7-linux-x86_64.egg/pandas/sparse/series.py in get_values(self) 228 def get_values(self): 229 """ same as values """ --> 230 return self._data._values.to_dense().view() 231 232 @property

使用一个常见的httpclient POST执行请求发送文件,该请求使用来自filebody类的覆盖writeTo()方法,该类使用8kb的bufferedInputStream。

您是否认为可以降低文件上传的性能影响,并解决我未使用的带宽问题?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您应该尝试 https://hc.apache.org/

您可以将httpclient库更改为基于java.nio的库: https://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html

HttpCore是一组低级HTTP传输组件,可用于以最小的占用空间构建自定义客户端和服务器端HTTP服务。 HttpCore支持两种I / O模型:基于经典Java I / O的阻塞I / O模型和基于Java NIO 的非阻塞事件驱动I / O模型

请查看https://hc.apache.org/httpcomponents-asyncclient-dev/index.html

希望这是正确的想法。

答案 1 :(得分:0)

事实上,问题似乎不是来自java进程,而是来自apache消耗硬盘驱动器的所有IO,搞砸了性能。 无论如何,谢谢你的帮助。