2011-11-03 3 views
1

HTTP 테스트를 테스트하기 위해 테스트 장치를 작성 중입니다. 테스트 케이스는 10 초 간격으로 webclient 클래스에서 UploadValuesAsync를 사용하여 8 HTTP 요청을 보냅니다. 8 회의 요청이있을 때마다 10 초 후에 대기합니다. 각 요청의 시작 시간과 종료 시간을 기록합니다. 평균 응답 시간을 계산할 때. 나는 약 800 밀리미터를 얻고있다. 그러나이 테스트 케이스를 웹 클라이언트에서 UploadValues ​​메소드를 사용하여 동 기적으로 실행하면 평균 응답 시간이 250 밀리 초입니다. 이 두 가지 방법의 차이점은 무엇이라고 말할 수 있습니까? Aync에서 응답 시간이 짧을 것으로 예상했지만 그걸 얻지 못했습니다. 여기UploadValuesAsync 응답 시간

는 업데이트]

     var count = 0; 
     foreach (var nameValueCollection in requestCollections) 
     { 
      count++; 
      NameValueCollection collection = nameValueCollection; 
      PostToURL(collection,uri); 
      if (count % 8 == 0) 
      { 
       Thread.Sleep(TimeSpan.FromSeconds(10)); 
       count = 0; 
      } 
     } 

비동기 8 개 요청을 보내는 코드입니다 여기에 8 개 요청 여기

public void PostToURLSync(NameValueCollection collection,Uri uri) 
    { 
     var response = new ServiceResponse 
     { 
      Response = "Not Started", 
      Request = string.Join(";", collection.Cast<string>() 
             .Select(col => String.Concat(col, "=", collection[col])).ToArray()), 
      ApplicationId = collection["ApplicationId"] 

     }; 

     try 
     { 
      using (var transportType2 = new DerivedWebClient()) 
      { 
       transportType2.Expect100Continue = false; 
       transportType2.Timeout = TimeSpan.FromMilliseconds(2000); 
       response.StartTime = DateTime.Now; 
       var responeByte = transportType2.UploadValues(uri, "POST", collection); 
       response.EndTime = DateTime.Now; 
       response.Response = Encoding.Default.GetString(responeByte); 
      } 

     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
     response.ResponseInMs = (int)response.EndTime.Subtract(response.StartTime).TotalMilliseconds; 
     responses.Add(response); 
     Console.WriteLine(response.ResponseInMs); 
    } 

를 동기화 전송 코드입니다 URI

는 HTTP에 게시 코드 여기
public void PostToURL(NameValueCollection collection,Uri uri) 
    { 
     var response = new ServiceResponse 
         { 
          Response = "Not Started", 
          Request = string.Join(";", collection.Cast<string>() 
                 .Select(col => String.Concat(col, "=", collection[col])).ToArray()), 
          ApplicationId = collection["ApplicationId"] 

         }; 

     try 
     { 
      using (var transportType2 = new DerivedWebClient()) 
      { 
       transportType2.Expect100Continue = false; 
       transportType2.Timeout = TimeSpan.FromMilliseconds(2000); 
       response.StartTime = DateTime.Now; 
       transportType2.UploadValuesCompleted += new UploadValuesCompletedEventHandler(transportType2_UploadValuesCompleted); 
       transportType2.UploadValuesAsync(uri, "POST", collection,response); 
      } 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
    } 

는 uplo이고 광고 완료 이벤트 당신은 아마로 실행중인

private void transportType2_UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e) 
    { 
     var now = DateTime.Now; 
     var response = (ServiceResponse)e.UserState; 
     response.EndTime = now; 
     response.ResponseInMs = (int) response.EndTime.Subtract(response.StartTime).TotalMilliseconds; 
     Console.WriteLine(response.ResponseInMs); 

     if (e.Error != null) 
     { 
      response.Response = e.Error.ToString(); 
     } 
     else 
     if (e.Result != null && e.Result.Length > 0) 
     { 
      string downloadedData = Encoding.Default.GetString(e.Result); 
      response.Response = downloadedData; 
     } 
     //Recording response in Global variable 
     responses.Add(response); 
    } 
+0

보내시는 컬렉션의 크기는 어느 정도입니까? async를 사용할 때 모든 요청을 병렬로 보내지 만 동기화 버전은 다른 요청을 한 번 보냅니다. 그리고 동기화 코드도 올릴 수 있습니까? – svick

+0

테스트중인 @svick 컬렉션에는 100 개의 개체가 포함되어 있습니다. 업데이트 된 동기화 코드. – Amzath

답변

0

, 나는 ServicePointManager.DefaultConnectionLimit을 시도하지만 문제가 해결되지 않았다. 저스틴이 제안한 다른 문제를 재현 할 수 없었습니다. 나는 그들을 처음부터 재현하는 방법을 잘 모른다.

내가 무슨 짓을, 나는 응답 완벽하게 내가 예상 시간을 실행 피어 기계에 동일한 코드 조각을 달렸다. 두 시스템의 차이점은 운영 체제입니다. 광산은 Windows Server 2003에서 실행 중이며 다른 컴퓨터는 Windows Server 2008에서 실행 중입니다.

다른 컴퓨터에서도 작동했기 때문에 저스틴이 지정한 문제 중 하나 일 수도 있고 2003 년 또는 다른 서버 설정 일 수도 있습니다. 나는이 문제를 파헤 치기 위해 그 이후로 많은 시간을 할애하지 않았다. 이것은 우리가이 문제에 우선 순위가 낮은 테스트 장비이기 때문에. 우리는 더 이상 시간이 없다.

정확하게 고정 된 것에 접착제가 없으므로이 외에 다른 답변을 수락하지 않습니다. 적어도 내가 서버 2008로 전환하면이 문제가 해결된다는 것을 알고 있습니다.

2

하나의 문제는 기본적으로 관련 RFC에 의해 위임 된 한계 (원격 호스트 당 2 개 개의 동시 연결) 나가는 HTTP 연결을 스로틀 것, 그 .NET입니다. 두 개의 동시 연결 및 요청 당 250ms라고 가정하면 처음 두 요청에 대한 응답 시간은 250ms이고 두 번째 2는 500ms, 세 번째 750ms 및 마지막 1000ms가됩니다. 그러면 625ms의 평균 응답 시간이 생길 것이며, 이는 800ms와 크게 다르지 않습니다.

조절을 제거하려면 ServicePointManager.DefaultConnectionLimit을 최대 동시 연결 수로 늘리십시오. 평균 응답 시간이 많이 줄어들 것입니다.

보조 문제는 서버 자체가 한 번에 하나 개의 요청을 전달보다 느린 처리 ​​다중 동시 접속이라고 할 수있다. 위의 스로틀 문제를 해결해도 서버가 한 번에 하나의 요청 만 실행하는 경우보다 비동기 요청이 평균적으로 다소 느리게 실행될 것으로 예상됩니다. 서버가 동시 요청에 얼마나 잘 최적화되어 있는지에 따라 속도가 얼마나 느려지는지 알 수 있습니다.

최종 문제는

테스트 방법에 의해 야기 될 수있다. 예를 들어 테스트 클라이언트가 쿠키를 저장하고 각 요청과 함께 쿠키를 다시 보내 브라우저 세션을 시뮬레이션하는 경우 단일 사용자의 요청을 직렬화하는 일부 서버에서 문제가 발생할 수 있습니다. 이것은 종종 서버 응용 프로그램을 단순화하기 때문에 세션 상태와 같은 교차 요청 상태를 처리 할 필요가 없습니다. 이 문제가 발생하면 각 WebClient가 서로 다른 쿠키를 보내어 다른 사용자를 시뮬레이트해야합니다.

나는 당신이이 모든 세 가지로 실행중인 것을 말하는 게 아니에요 당신이 단지 1로 실행 중이거나 할 수있는 문제를 - 2-- 그러나 이들은 당신이보고있는이 문제에 대한 가장 likley 범인입니다. 저스틴 말했듯이