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 초 후에 입력 스트림을 읽게됩니다.
어떻게 지연을 설명 할 수 있습니까?
감사
최종 목표는 왜 당신이 메모리를로드하는 디스크에 파일을 저장하는 경우
안녕하세요, 디버그 목적으로 스트림을 메모리에로드하고 있었지만 디스크에서 직접 스트림을 플러시하는 것이 실제로 문제를 해결하는 것으로 보입니다. 그 차이를 어떻게 설명 할 수 있겠습니까? 아니면 내 inputStream.Close() 그 IIS에서 일부 동기화를 기다리는 올 수 있습니다? – ThomasWeiss
디버깅 목적으로 log4net 로깅을 사용하고 로그 파일을 특정 파일에 기록하고 있습니다. 그런 다음 동시 http 요청이 해당 로그 파일을 덮어 씁니까? – teenup
@teenup, 아니 파일을 덮어 쓰지 않습니다, 그것에 메시지가 추가됩니다. –