4

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

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

我不明白这种行为。我不认为这是由于服务器上的缓存机制造成的,因为 a) 所考虑的 web 应用程序没有使用任何缓存(据我所知)b) 这种效果在第一次请求 www.hostxy.com 时也是可见的,之后www.hostxy.com/my/webapp。

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

有谁知道这种行为来自哪里?这些httpclients自己做缓存吗?我将非常感谢任何提示。

4

4 回答 4

0

如果您的问题是“对特定主机的第一次 http 请求明显较慢”,则可能导致此症状的原因在服务器上,而您关心的是客户端。

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

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

看看这个: Google App Engine 应用程序非常慢

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

于 2013-12-12T11:52:05.607 回答
0

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

同样在第一个事务上完成:如果事务使用 ca cert trust store,它将被加载和缓存。

于 2013-04-02T14:48:45.453 回答
0

你最好看看它关于缓存 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html

于 2013-04-02T15:07:49.447 回答
0

阅读此:http ://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html用于连接池。

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

于 2013-04-02T14:30:49.337 回答