发送请求到127.0.0.1:8084/ (Tomcat)需要~1000ms,而发送到127.0.0.1/ (Wamp)


    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpClient httpclient = new DefaultHttpClient(params);
    HttpPost httppost = new HttpPost(address);
    try {
        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
    } catch (IOException ex) {
        logger.log(Level.SEVERE, null, ex);
    }

我使用这个代码片段向位于本地主机上的Apache Tomcat上的servlet发送HTTP POST请求。发送到Tomcat地址(即http://127.0.0.1:8084)的请求(没有任何参数)大约需要1000毫秒。而同样的请求发送到地址http://127.0.0.1的Apache (wamp服务器)只需要20毫秒。

我已经尝试了两个Http版本(1.0/1.1),但响应时间没有影响。

知道哪里出了问题吗?或者如何提高这种性能?还是Tomcat本身太慢了,我对这个问题无能为力?(但是浏览器能够加载servlet而没有任何明显的网络延迟!)

附加信息:

这段代码本身在一个Servlet中,它基本上什么都不做,只是发出这个请求。应该处理请求的servlet也是"空白"的。而且,整个场景中不涉及JSP。计时记录不是为冷猫准备的。第一次和(有时)第二次调用占用超过2000ms。但是连续的请求被标准化为超过1000ms。所以,这肯定不是一个冷tomcat问题。

现在,这里的人也要求我提供servlet代码。下面是我正在做的基本设计:

Servlet A应该做一些工作,并使用我编写的AgniLogger类进行记录。该类位于一个库中,计划在多个组件中使用。反过来,它使用上面编写的代码将POST请求发送给servlet B。servlet B将执行实际的日志记录。现在,这个servlet B还没有实现。Servlet A和B是不同的web应用程序的一部分。

Servlet A: http://pastebin.com/tQjtvG3g

AgniLogger: http://pastebin.com/nGJypmCN

Servlet B: http://pastebin.com/psCxLCYY

注::我使用Netbeans进行开发,到目前为止,项目中没有web.xml。

变通方法(虽然很奇怪!)

如果我将Servlet B中的processRequest()函数的定义从{blank}更改为:

    PrintWriter out = response.getWriter();
    try {
        //do nothing
    } finally { 
        out.close();
    }

问题解决了。响应时间减少到20毫秒左右,就像端口80上的Apache (WAMP)服务器一样。但是,我不知道,无论如何,为什么这个工作得很好!

您没有给出servlet做什么的任何线索。例如,如果它在其响应中嵌入jsp,则可能需要在第一次访问时将jsp编译为servlet(实现jsp的方式)。在这种情况下,尝试第二个请求,它应该比第一个快得多。

你也可以从一个"冷"的tomcat请求一个页面,例如,不是所有的东西都被初始化——类似于第一个选项,这会做一些一次性的操作,这些操作不会出现在以后的请求中。

我在过去也看到过这样的行为,当一个web或应用服务器被配置为解析客户端的ip地址(到一个反向查找的DNS地址)。如果此操作失败,则通常需要一段时间—并且此操作在过去一直阻止请求。

(澄清:我见过web服务器为其日志文件反向解析IP地址。对于成功的地方,这是相对较快的(但有代价),但是当请求的IP地址无法解析时,它只被记录为IP(正如您所期望的那样),但是在请求的应答时间中也可以看到严重的延迟。我不指望任何应用服务器都能像这样开箱即用,但我在过去看到过这个问题。缺点是,如果您只在日志中看到延迟和IP地址,可能很难判断您是否遭受了这种痛苦。只有当你在日志中看到各种请求主机的DNS名称与IP地址混合时,才会清楚

同样,你给"127.0.0.1"作为一个例子-如果这不是真正的地址,确保两种方式绝对访问相同的端点。例如,现在"localhost"通常解析为"::1"(本地IPV6地址),但不会解析为"127.0.0.1"(IPV4本地地址)。并不是说我期望这两种访问servlet的方式有很大的不同,但是如果您可以在这两种访问选项之间确定不同的路由,那么您可能会更接近于找到潜在的问题。

相关内容

  • 没有找到相关文章

最新更新