【发布时间】: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