4

웹 응용 프로그램에 대해 실행할 벤치마킹 도구를 쓰고 있습니다. 내가 직면하고있는 문제는 서버에 대한 첫 번째 요청이 항상 후속 요청보다 훨씬 오래 걸린다는 것입니다. 아파치 http 클라이언트 3.x, 4.x 및 Google http client에서이 문제가 발생했습니다. apache http 클라이언트 4.x가 가장 큰 차이점을 보여줍니다 (첫 번째 요청은 후속 요청보다 약 7 배 오래 걸림). Google 및 3.x의 경우 약 3 배 더 길어졌습니다.Java - 특정 호스트에 대한 첫 번째 HTTP 요청이 상당히 느림

내 도구는 동시 요청을 벤치마킹 할 수 있어야합니다 스레드와 함께 .HttpClient 인스턴스 하나를 사용할 수 없으며 모든 스레드에서 호출 할 수 있습니다. 동시성 예외가 발생하기 때문에 각 스레드에서 하나의 요청 만 실행하는 개별 인스턴스를 사용해야합니다.

나는이 동작을 이해하지 못한다. 고려해야 할 webapp는 (내 지식에) 캐싱을 사용하지 않기 때문에 서버의 캐싱 메커니즘 때문이라고 생각하지 않는다. 그리고 b)이 효과는 처음 다시 볼 때 표시됩니다. questing www.hostxy.com 그리고 이후 www.hostxy.com/my/webapp.

client.execute(get) 또는 get.execute()을 호출하기 전과 후에 System.nanoTime()을 사용합니다.

누구나이 문제의 원인을 알 수 있습니까? 이 httpclient 자체가 캐싱을 수행합니까? 나는 어떤 힌트에 대해서도 매우 감사 할 것입니다.

답변

0

읽기 내용 : 연결 풀링을위한 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html.

첫 번째 연결은 Connect : keep-alive 연결 (연결 이후)이 설정되면 해당 연결을 다시 사용할 수 있기 때문에 가장 긴 시간이 걸립니다. 이것은 정당하다.

+0

계속 작동 시키려고했으나 성공했는지 확실하지 않습니다. 그럼에도 불구하고 이후의 요청 사이에 25 초를 기다리면 차이가 발생합니다.이 시간에는 활성 상태의 타임 아웃이 발생 했어야합니까, 그렇지 않았습니까?나는 또한 왜 아파치 http 클라이언트 4.x가 3.x보다 훨씬 오래 걸리는지 이해하지 못한다. – feob

+0

흠. 내가 너라면 Wireshark를 채찍질하고 철조망이 무엇인지 확인해 볼거야. 또한 HttpClient 용 PoolingClientConnectionManager에 대해 읽어보십시오. 이렇게하면이 문제를 피하는 방법에 대한 아이디어를 얻을 수 있습니다. –

0

서버를 시작한 후 처음으로 JSP를 사용하고 있습니까? 서버가 매번 시작할 때마다 작업 디렉토리를 비우는 경우 JSP가 처음 컴파일되면 시간이 많이 걸립니다.

또한 첫 번째 트랜잭션에서 수행됩니다. 트랜잭션이 ca cert 신뢰 저장소를 사용하면로드되고 캐시됩니다. 당신이 걱정하는 동안 문제가 "특정 호스트 상당히 느린로 처음 HTTP 요청"인 경우

0

캐싱에 대해 그것을보고,이 현상의 아마 원인은 서버에 고객.

호출중인 "특정 호스트"가 Google App Engine 응용 프로그램 (또는 다른 Cloud Plattform) 인 경우 해당 응용 프로그램에 대한 첫 번째 호출이 조금 더 기다리는 것이 정상입니다. 이는 Google이 활동이 없을 때 휴면 상태에 놓기 때문입니다.

최근 호출 (일반적으로 응답하는 데 더 오래 걸림) 후에 서버 인스턴스가 모두 깨어 있기 때문에 후속 호출이 더 빠른 응답을 보입니다.

이에 봐 : Google App Engine Application Extremely slow

내가 당신을 도움이되기를 바랍니다, 행운을 빌어 요!