2013-08-22 3 views
0

WCF 웹 서비스에서 사용되는 C로 작성된 관리되지 않는 라이브러리 (내부적으로 인텔 MKL 라이브러리 사용)가 있습니다. 스트레이트 업 PInvoke는 노출 된 메서드를 호출하는 데 사용되며 라이브러리 호출은 포인터에서 free()를 호출하기 전에 C#의 관리 배열에 복사되는 이중 배열에 대한 포인터를 반환합니다.IIS를 통해 호출 될 때 콘솔이 아닌 IIS를 통해 호출 될 때 비보호 코드가 누수됩니다.

 double* xStars = null; 
     metaData meta = new metaData(); 
     double[] output = null; 
     bool hasError; 
     string errorMessage; 
     try 
     { 
      int errCode = someCFunction(...some params... 
       &xStars, 
       &meta); 

      output = new double[meta.ArrayLength]; 
      for (int j = 0; j < meta.ArrayLength; j++) 
      { 
       output[j] = (xStars[j]); 
      } 
     } 
     catch (Exception e) 
     { 
      WriteToEventLog(); 
      throw; 
     } 
     finally 
     { 
          //Also in the C library 
          //Calls free(void *) 
      freeDoubleArray(&xStars); 
      freeMeta(&meta); 
     } 

나는 웹 서비스 호출로

  • IIS를 통해이 문제를 호출하거나 할 수 있습니다 테스트 스위트를
  • 다른 모든 비즈니스 로직을 실행하지만 WS로 작동하지 않는
  • 콘솔 응용 프로그램 단지 VI를 실행하면 PInvoke를

  • 을 수행하는 클래스를 행사

  • 작은 콘솔 응용 프로그램 콘솔 응용 프로그램 (2)을 사용하면 사용 된 시작 메모리가 ~ 50MB이고 기본 C 코드가 루프에서 여러 번 100 번 호출 된 후에도 꽤 안정적입니다.

  • 콘솔 app (2) 메모리는 약 24MB이며 약 100MB의 호출 후에도 안정적입니다.
  • 서비스 시작시에도 IIS를 통해 실행될 때 메모리 사용량은 약 150-200MB이며 C 라이브러리에 대한 호출이 계속 증가합니다. 드디어 IIS 사용중인 메모리가 제한

그것이 IIS에서 사용되고있는 방식에 어떤 문제가 설정 초과하기 때문에 그것을 재활용 지점에 도달? 콘솔 app (2)는 기본적으로 모든 코드이지만 웹 서비스가 아닌 독립 실행 형 응용 프로그램으로 실행됩니다. 즉, 응용 프로그램이 메모리 누수 또는 과도한 사용을 나타내지 않습니다. 전용 바이트의 프로필을

  1. 사용 성능 모니터 및 GC는 모든 힙에 바이트 : 내가 지금까지했던

    것들은 근본 원인을 이해합니다. 처리 된 메모리 사용량은 프로세스 시작시에 올라가 테스트 전반에 걸쳐 거의 평평한 상태를 유지하는 반면 개인용 바이트는 첫 번째 호출에서 약 100MB로 스파이크를 사용하고 테스트 반복마다 조금씩 증가합니다.

  2. 디버그 Diag를 사용하여 관리되지 않는 메모리 누수와 IIS 작업자 프로세스에서 사용하는 500MB의 프로필을 디버깅 할 수 있습니다. Debug diag는 C 라이브러리에 누출이라고 생각되는 약 43MB의 미 릴리스 메모리가 있음을 나타내지 만 나머지는 사용 중임
  3. ANTS 메모리 프로파일 러를 사용하여 메모리의 주요 부분이 관리되지 않고 관리 메모리 사용이 최악의 경우 30MB 이내 였음을 나타냅니다.

나는 그림을 게시하기에 충분한 rep 지점이 없거나 성능 모니터의 스크린 샷을 게시 할 수 있다고 생각합니다. C 코드를 작성한 사람은 이것이 IIS 문제 (또는 웹 서비스 C# 코드와 관련이 있음)라고 생각하고 독립 실행 형 응용 프로그램에서 사용될 때 명백한 누수가 없음을 지적합니다. 내가 사용한 디버깅 도구는 그렇지 않다는 것을 나타냅니다.

문제가 어디에 있는지 정확히 알아 내기 위해 내가 할 수있는 것에 대한 제안 사항이 있습니까?

답변

1

ANTS 메모리 프로파일 러가 관리되지 않는 메모리 사용을 예상하지 않는 관리되지 않는 코드에 메모리의 "주요 부분"이 할당되었다고 확인하면 조사를 시작할 수있는 좋은 곳입니다.

"freeDoubleArray (& xStars); 주석 처리를 제거하면 어떻게됩니까? 및 "freeMeta (& 메타)"; ISS 웹 서비스에서했던 것처럼 콘솔 응용 프로그램에서도 비슷한 동작을합니까?

finally 블록의 끝에 GC 수집을 강제하면 어떻게됩니까? 그런 다음 ISS 웹 서비스가 콘솔 응용 프로그램과 비슷한 방식으로 작동합니까?

관련 문제