2014-07-16 2 views
3

UPDATE몇 가지 조사 후 멀티 스레드 응용 프로그램

에 AFNetworking에서 응답 시간을 측정 나는 내 코드에 약간의 개선을했다. 먼저 시간을 측정 한 각 위치를 다음과 같이 교체합니다. 다음과 같은 원자 시간 측정을 사용합니다. CFAbsoluteTimeGetCurrent();

아무런 차이가 없었던 것으로 나타났습니다. 우리 서버 녀석과 확인해 보니 나는 서버가 인상적인 결과를 보여 주었다는 것을 알았습니다.이 때문에 병목 현상은 서버가 아니라 랩탑/그 밖의 다른 지점으로 생각됩니다.


내가 응용 프로그램에서 사용자 흐름을 모방 시나리오를 구축, 그래서 내 서버를 테스트로드하기 위해 노력하고있어

원래 게시 할 수 있습니다. 이 흐름에는 서버에 약 11-17 건의 호출이 포함되어 있으며 일부는 다른 화면을 통과하지 않으면 사용자가 특정 화면에 도달 할 수 없기 때문에 동기식이어야합니다.

그런 다음이 시나리오를 X 스레드를 사용하여 동시에 실행하여 서버에 스트레스를 가하고 가장 취약한 링크가있는 곳을 확인하려고했습니다. 정보를 분석하기 위해 응답이 성공하거나 실패 할 때마다 파일에 관련 정보를 기록했으며 각 호출의 타이밍에 매우 이상한 일이 일어나고 있음을 알았습니다.

은 내가 사용하여 발사 직전에 각 통화의 시작 시간을 측정 호출의 시간을 측정하려면 :

test.startTime = [NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]]; 
//fire the request 
[operation start]; 

그리고 성공에 일이 제일 먼저/실패 블록은 다음과 같습니다

성공

void (^successWrapper) (AFHTTPRequestOperation *, id) = ^(AFHTTPRequestOperation *operation, id responseObject){ 
    //#################TEST ANALYTICS############### 
    NSDate *endTime = [NSDate date]; 
    test.endTime = [NSNumber numberWithDouble:[endTime timeIntervalSince1970]]; 
    test.lat = [NSNumber numberWithDouble:(test.endTime.doubleValue - test.startTime.doubleValue)]; 
    //############################################## 

    //Some other success stuff... 

    }; 

실패 :

void (^failureWrapper) (AFHTTPRequestOperation *, NSError *) = ^(AFHTTPRequestOperation *operation, NSError *error) { 

    //#################TEST ANALYTICS############### 
    NSDate *endTime = [NSDate date]; 
    test.endTime = [NSNumber numberWithDouble:[endTime timeIntervalSince1970]]; 
    test.lat = [NSNumber numberWithDouble:(test.endTime.doubleValue - test.startTime.doubleValue)]; 
    //############################################## 

    //Some other failure stuff... 

    }; 

그러나 로그 파일에서 대기 시간이 매우 길어지고 X이 점점 더 커지고있어 악화되고 있습니다.

스레드 사이의 컨텍스트 전환으로 인해 문제가 발생한다고 생각하지만 확실치 않습니다. 그래서 내 질문은 : 많은 스레드가있는 시스템에서 AFNetworking에있는 각 호출의 응답 시간을 올바르게 측정하려면 어떻게해야합니까?

일부 노트 : 위에서 언급 한 바와 같이 다른 순차적으로 일어날 수있는 반면

  • , 통화 중 일부는 동시에 발생할 수 있습니다.
  • X은 결국 매우 높아야합니다 (> 10000).

감사합니다.

+0

10,000 스레드에서는 상당한 오버 헤드가 발생하므로 테스트 응용 프로그램을 한 줌으로 제한하는 것이 좋습니다. –

+0

@SamMiller, 글쎄요. 100 개의 스레드 (그리고 그보다 적은 수)에 대해 높은 수치를 보였습니다. 약 10000을 말하는 것이 아닙니다. – goldengil

+0

@ goldjinil, 100 개가 아닌 20 개의 스레드를 사용해야합니다. –

답변

3

동시에 실행할 수있는 네트워크 요청은 제한된 수의 NSURLConnection 개입니다. 원하는만큼 많은 작업을 시작할 수는 있지만, NSURLConnection은 제한된 수의 운영체제 (OS 버전에 따라 4-6)를 동시에 실행합니다. 이후 NSURLConnection 요청은 이전 요청이 완료 될 때까지 대기합니다. 극한 상황 (예 :수백 개의 요청을 제출하는 경우), 이는 후자의 요청이 시간 초과되도록 할 수도 있습니다 (충분히 큰 시간 초과 매개 변수를 지정하지 않은 경우). 이 제한 조건은 네트워크 대기 시간 중 하나가 아니라 클라이언트에서 OS가 부과하는 제한된 수의 동시 요청의 아티팩트입니다.

클라이언트 측 응용 프로그램에서 AFNetworking과 같은 NSOperationQueue 기반 프레임 워크를 사용하는 경우 작업을 직접 시작하지 않고 NSOperationQueue에 추가하면이 제한 사항을 처리 할 수 ​​있습니다. 그런 다음 작업 대기열의 maxConcurrentOperationCount을 임의의 주어진 시간에 실행할 수있는 동시 NSURLConnection 요청 수 (예 : 5 일 수 있음)에 해당하는 적절한 수로 제한하여 개별 작업 내에서 대기 시간을 제거 할 수 있습니다. 이러한 요청을 자체 대기열에 추가하는 경우 해당 대기열에 대해 maxConcurrentOperationCount을 지정합니다. AFHTTPRequstOperationManager을 사용하는 경우 관리자의 operationQueue 속성에서이 작업을 수행합니다.

위의 컨텍스트에서 AFNetworking의 성능을 벤치마킹하려는 경우 총 경과 시간을 측정하려고하는지 여부를 질문합니다 (이 경우 대기 시간에 시작 시간을 캡처 할 수 있으며 완료 블록에서 경과 시간을 계산하십시오. 질문에서 설명한 방법과 비슷합니다.) 또는 실제로 작업을 실행하는 데 소요 된 시간을 캡처 할 것인지 여부를 계산할 수 있습니다.

후자에 관심이 있다면, 당신은 정말 start 방법의 작업 큐 결과가 당신이 중 하나를 AFNetworkingOperationDidStartNotificationAFNetworkingOperationDidFinishNotification 알림, 아니면 그냥 포크 AFNetworking에 대한 관측을 추가 할 수있는, 호출되는 경우 타이머를 시작하려면 AFURLConnectionOperation을 수정하여 경과 시간을 계산하십시오.

마지막으로, 귀하의 질문이 실제로 응용 프로그램을 스트레스 테스트했는지 또는 서버를 스트레스 테스트했는지에 관해서는 약간 불분명합니다. 단순히 스트레스 테스트 애플 리케이션, 위의 작동합니다. 많은 동시 사용자를 시뮬레이트하기 위해 서버를 테스트하기를 원한다면, NSURLConnection/AFNetworking (CFNetwork 개략 here)을 우회하거나 물리적 장치/컴퓨터의 콜렉션을 실제로 설정하고 이들을 수행하도록해야합니다 클라이언트 측 AFNetworking 스트레스 테스트가 동시에 수행됩니다.