【问题标题】:Connect exception when load testing tomcat 7 using Spring Boot使用Spring Boot负载测试tomcat 7时连接异常
【发布时间】:2014-12-07 20:13:00
【问题描述】:

我正在针对 Spring Boot 应用程序(在 64 位 Windows 7 上使用嵌入式 Tomcat 7)运行一些负载测试,并且我经常遇到偶尔的连接异常。

负载测试工具使用 8 个线程运行,每 15-20 秒,每个线程会在大约 200-600 毫秒(250-350 个请求失败)内获得异常,然后恢复正常(大约 4000 个请求/秒)。

考虑到异常的模式,我认为这一定是 GC 暂停导致 Tomcat 无法允许连接(尽管我希望超时而不是连接失败)。

为了消除所有其他错误来源,我创建了一个示例 Spring Boot 应用程序,其中除了 Hello World RestController 之外什么都没有。运行单线程 JUnit 测试,我遇到了同样的问题。打印 GC 信息并没有显示垃圾收集和异常之间的相关性(收集比问题多得多),所以我很难过!

感谢您在尝试追踪此问题方面的任何帮助!

控制器代码(缩短)

@RestController
    public class GreetingController {

    private static final String template = "Hello, %s!";

    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name) {
        return String.format(template, name);
    }
}

测试代码(缩短)

@Test
public void performanceTest() throws IOException
{
    RestTemplate restTemplate = new TestRestTemplate();
    for (int i = 0; i < 20000; i++) {
        ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8080/greeting?name=Test", String.class);
        assertThat( response.getStatusCode(), equalTo( HttpStatus.OK ) );
    }
}

构建输出(缩短)

3.764: [GC [PSYoungGen: 76285K->10729K(76288K)] 79675K->18359K(249856K), 0.0133242 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
4.619: [GC [PSYoungGen: 76265K->10745K(76288K)] 83895K->18647K(249856K), 0.0108216 secs] [Times: user=0.12 sys=0.00, real=0.02 secs]
5.330: [GC [PSYoungGen: 76281K->11129K(146432K)] 84183K->19039K(320000K), 0.0108998 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
6.575: [GC [PSYoungGen: 142201K->6484K(146432K)] 150111K->19457K(320000K), 0.0129915 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
7.644: [GC [PSYoungGen: 137556K->848K(276992K)] 150529K->19461K(450560K), 0.0069513 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
9.631: [GC [PSYoungGen: 261456K->1424K(251904K)] 280069K->20109K(425472K), 0.0066538 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
11.126: [GC [PSYoungGen: 251792K->1424K(250368K)] 270477K->20165K(423936K), 0.0044447 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
12.446: [GC [PSYoungGen: 242064K->1296K(232960K)] 260805K->20229K(406528K), 0.0041284 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 12.915 sec <<< FAILURE! - in com.test.connectionrefused.controllers.GreetingControllerTest
performanceTest(com.test.connectionrefused.controllers.GreetingControllerTest)  Time elapsed: 9.53 sec  <<< ERROR!
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8080/greeting?name=Test":Permission denied: connect; nested exception is java.net.SocketException: Permission denied: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
    at sun.net.www.http.HttpClient.New(HttpClient.java:308)
    at sun.net.www.http.HttpClient.New(HttpClient.java:326)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:996)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:932)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
    at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:78)
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:551)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:268)
    at com.test.connectionrefused.controllers.GreetingControllerTest.performanceTest(GreetingControllerTest.java:55)

【问题讨论】:

    标签: java performance tomcat garbage-collection spring-boot


    【解决方案1】:

    我最近遇到了这个问题,我通过使用这样的相对路径解决了这个问题:

    /greeting?name=Test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多