Java - 对特定主机的第一个http请求明显变慢

时间:2013-04-02 14:26:43

标签: java benchmarking apache-httpclient-4.x apache-httpcomponents

我正在编写一个针对Web应用程序运行的基准测试工具。我面临的问题是对服务器的第一个请求总是比后续请求花费更长的时间。 我遇到过apache http client 3.x,4.x和Google http client的问题。 apache http client 4.x显示了最大的差异(第一个请求比后续请求长7倍。对于Google和3.x,它大约是后者的3倍。

我的工具必须能够使用线程对同步请求进行基准测试。我不能使用例如HttpClient并从所有线程调用它,因为这会抛出并发异常。因此,我必须在每个线程中使用一个单独的实例,它只执行一个请求。这会大大改变整体结果。

我不明白这种行为。我不认为这是由于服务器上的缓存机制,因为a)正在考虑的webapp不使用任何缓存(据我所知)和b)当首次请求www.hostxy.com时,此效果也可见www.hostxy.com/my/webapp。

我分别在调用client.execute(get)get.execute()之前和之后立即使用System.nanoTime()。

有没有人知道这种行为源于何方?这些httpclients自己做任何缓存吗?我会非常感谢任何提示。

4 个答案:

答案 0 :(得分:0)

阅读本文:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html了解连接池。

您的第一个连接可能需要最长时间,因为它是一个Connect:keep-alive连接,因此,一旦建立连接后,连接可以重用该连接。这只是猜测

答案 1 :(得分:0)

您是否在服务器启动后第一次访问JSP?如果服务器在每次启动时刷新它的工作目录,那么第一次命中JSP编译并且需要很长时间。

还在第一个事务上完成:如果事务使用ca证书信任存储,则将加载并缓存它。

答案 2 :(得分:0)

答案 3 :(得分:0)

如果您的问题是“对特定主机的第一个http请求明显变慢”,可能是服务器上出现此症状的原因,而您担心客户端。

如果您呼叫的“特定主机”是Google App Engine应用程序(或任何其他Cloud Plattform),那么第一次调用该应用程序会让您再等一会儿是正常的。这是因为谷歌在不活动时将其置于休眠状态。

在最近的呼叫(通常需要更长时间才能响应)之后,后续呼叫的响应速度更快,因为服务器实例都处于唤醒状态。

看看这个: Google App Engine Application Extremely slow

我希望它对你有所帮助,祝你好运!