2012-03-24 3 views
1

ASP.NET MVC3을 사용하여 웹 서비스를 개발하고 있습니다. HTTP API의 메소드 중 하나는 POST 요청의 본문에서 이미지를 수신하여 추후 처리를 위해 디스크에 저장해야합니다. 방법의 시작은 다음과 같이이다 :동시 요청에 대한 ASP.NET (또는 IIS?) 동작

Stopwatch stopwatch = new Stopwatch(); 
stopwatch.Start(); 

Interlocked.Increment(ref _generateCount); 

byte[] fileBuffer; 
using (Stream inputStream = Request.InputStream) 
{ 
    if (inputStream.Length == 0) 
    { 
     Trace.WriteLine("Submitted file is empty", "Warning"); 
     inputStream.Close(); 
     Interlocked.Decrement(ref _generateCount); 
     return new HttpStatusCodeResult(400, "Content is empty"); 
    } 

    fileBuffer = new byte[inputStream.Length]; 
    inputStream.Read(fileBuffer, 0, (int)inputStream.Length); 
    inputStream.Close(); 
} 
stopwatch.Stop() 
... (storing the fileBuffer on disk & quite CPU intensive processing on the file) 

나는 작은 푸른 인스턴스의 서비스를 호스팅하고 있습니다.

이제 이상한 동작은 서비스에 대한 병렬 요청을 발행 할 때입니다. 첫 번째 요청을 발행하고 5 초 후에 두 번째 요청을 발행한다고 가정 해 보겠습니다. 보시다시피 저는 스톱워치를 사용하여 성능을 모니터링하고 있습니다. 첫 번째 요청의 경우 ElapsedTime은 매우 작아 (1 초 미만), 두 번째 요청의 경우 ElapsedTime은 일반적으로 약 1 초입니다. 14 초!

단일 요청의 평균 처리 시간은 약입니다. 25 초 (여러 요청이 처리 될 때 40 이상이 됨), 첫 번째 요청이 완료되지 않았지만 14 초 후에 입력 스트림을 읽게됩니다.

어떻게 지연을 설명 할 수 있습니까?

감사

최종 목표는 왜 당신이 메모리를로드하는 디스크에 파일을 저장하는 경우

답변

1

?

public ActionResult SomeAction() 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    if (Request.InputStream.Length == 0) 
    { 
     return new HttpStatusCodeResult(400, "Content is empty"); 
    } 

    var filename = Server.MapPath("~/app_data/foo.dat"); 
    using (var output = System.IO.File.Create(filename)) 
    { 
     Request.InputStream.CopyTo(output); 
    } 
    stopwatch.Stop(); 

    ... 
} 

은 또한 당신이 당신의 서버에서 동일한 파일에 쓰기를 시도하는 2 개 개의 동시 요청을 할 경우, 당신은 데이터 또는 당신은에 쓸 수있는 오류를 손상받을 수 있다는주의 사항 : 직접 출력 스트림에 쓸 수 동시에 같은 파일.

+0

안녕하세요, 디버그 목적으로 스트림을 메모리에로드하고 있었지만 디스크에서 직접 스트림을 플러시하는 것이 실제로 문제를 해결하는 것으로 보입니다. 그 차이를 어떻게 설명 할 수 있겠습니까? 아니면 내 inputStream.Close() 그 IIS에서 일부 동기화를 기다리는 올 수 있습니다? – ThomasWeiss

+0

디버깅 목적으로 log4net 로깅을 사용하고 로그 파일을 특정 파일에 기록하고 있습니다. 그런 다음 동시 http 요청이 해당 로그 파일을 덮어 씁니까? – teenup

+0

@teenup, 아니 파일을 덮어 쓰지 않습니다, 그것에 메시지가 추가됩니다. –

관련 문제