ISAPI 필터에서 여러 프로세스에 대한 공통 로그 파일에 대한 좋은 접근법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1511290

문제

IIS6 또는 7에서 실행되는 ISAPI 필터가 있습니다. 여러 작업자 프로세스 ( "웹 가든")가 있으면 필터가 각 w3wp.exe에로드되어 실행됩니다.

필터가 단일 통합 로그 파일로 활동을 효율적으로 로그인 할 수있는 방법은 무엇입니까?

  • 다른 (동시) 프로세스의 로그 메시지는 서로를 방해해서는 안됩니다. 다시 말해, W3WP.EXE에서 방출 된 단일 로그 메시지는 로그 파일에서 단일 연속선으로 실현되어야합니다.

  • 로그 파일에 대한 최소화가 있어야합니다. 웹 사이트는 초당 100 개의 요청에 서비스를 제공 할 수 있습니다.

  • 엄격한 시간 주문이 선호됩니다. 다시 말해서 W3WP.EXE 프로세스 #1이 T1에서 메시지를 제출 한 다음 프로세스 #2가 T2에서 메시지를 방출 한 다음 프로세스 #1은 T3에서 메시지를 방출하고 로그 파일에 메시지가 올바른 시간 순서로 표시되어야합니다.

내가 가진 현재 접근법은 각 프로세스가 별도의 로그 파일을 소유한다는 것입니다. 이것은 명백한 단점이 있습니다.

몇 가지 아이디어 :

  • W3wp.exe 중 하나를 "로그 파일 소유자"로 지명하고 해당 특별 프로세스를 통해 모든 로그 메시지를 보내십시오. 작업자 프로세스 재활용의 경우 문제가 있습니다.

  • OS 뮤트를 사용하여 로그 파일에 대한 액세스를 보호하십시오. 이것은 충분히 높은 사람입니까? 이 경우 각 w3wp.exe는 동일한 FileSystem 파일에 파일이 있습니다. 각 쓰기 후 로그 파일을 fflush해야합니까? 이것이 효과가 있습니까?

제안이 있습니까?

도움이 되었습니까?

해결책

처음에 나는 각 프로세스가 아무것도 공유하지 않기 때문에 현재의 접근 방식이 가장 좋아한다고 말하면서, 나는 아마도 그 아래에 동일한 하드 드라이브를 공유하고 있다는 것을 깨달았습니다. 따라서 경합이 발생하는 병목 현상이 여전히 있습니다. 아니면 OS와 하드 드라이브 컨트롤러가 처리하는 데 정말 현명할까요?

나는 당신이하고 싶은 것은 실제 작업을 수행하는 스레드를 늦추지 않는 로그의 글을 쓰는 것입니다.

따라서 동일한 기계에서 다른 프로세스를 실행하여 (우선 순위가 낮습니까?)는 실제로 로그 메시지를 디스크에 작성합니다. 제안 된대로 UDP를 사용하여 다른 프로세스와 통신하는 것이 아니라 프로세스가 공유하는 메모리를 사용합니다. 혼란스럽게도 메모리 매핑 파일로도 알려져 있습니다. 더 많은 것에 대해 메모리 매핑 파일. 회사에서는 메모리 매핑 파일이 동일한 상자의 통신을 위해 Loopback TCP/IP보다 훨씬 빠른 것으로 나타 났으므로 UDP보다 빠르다고 가정합니다.

공유 메모리에 실제로 가지고있는 것은 우선, 푸시와 팝이 뮤트를 사용하여 보호되는 STD :: 대기열 일 수 있습니다. 당신의 ISAPI 실이 뮤트를 잡아서 물건을 대기열에 넣을 것입니다. 로깅 프로세스는 뮤트를 잡아 큐에서 물건을 꺼내고 뮤트를 풀고 디스크에 항목을 씁니다. Mutex는 파일의 업데이트가 아니라 공유 메모리의 업데이트 만 보호되므로 이론적으로 Mutex는 간단한 시간 동안 유지되어 병목 현상을 줄일 수 있습니다.

로깅 프로세스는 타임 스탬프를 순서대로 얻기 위해 쓰고있는 내용의 순서를 다시 정리할 수도 있습니다.

또 다른 변형은 다음과 같습니다. Contine 각 프로세스에 대해 별도의 로그를 갖는 Contine이지만 각 프로세스 내에 로거 스레드가있어 기본 시간 크리티컬 스레드가 작업을 진행하기 위해 로깅이 발생할 때까지 기다릴 필요가 없습니다.

내가 여기에 쓴 모든 내용의 문제점은 전체 시스템 (하드웨어, OS, Multicore CPU L1/L2 캐시가 작동하는 방식)이 소프트웨어가 너무 복잡하다는 것입니다. 간단한 개념 증명 앱을 코딩하고 일부 타이밍으로 계측 한 다음 실제 하드웨어에서 시도해보십시오.

다른 팁

데이터베이스에 로그인이 여기에서 의미가 있습니까?

과거에는 UDP 기반 로깅 시스템을 사용했으며 이런 종류의 솔루션에 만족했습니다.

로그는 UDP를 통해 로그-수집기 프로세스로 전송되어 정기적으로 파일에 저장해야합니다.

그것이 당신의 높은 perf 컨텍스트에서 작동 할 수 있는지는 모르겠지만 스트레스가 적은 응용 프로그램에서 그 솔루션에 만족했습니다.

도움이되기를 바랍니다.

파일에 대한 액세스를 제어하기 위해 OS MUTEX 대신 LockFile () 및 UnlockFile ()을 사용하여 Win32 파일 잠금 메커니즘을 사용할 수 있습니다.

내 제안은 로그 기록을 담당하는 프로세스로 비동기 (UDP)를 비동기로 보내는 것입니다.
프로세스는 다음과 같습니다.
- 하나의 스레드 수신기가 메시지를 큐에 넣습니다.
- 하나의 스레드는 정렬 된 목록을 넣는 대기열에서 메시지를 제거 할 책임이 있습니다.
- 목록의 스레드 모니터 메시지와 최소보다 시간 길이가 큰 메시지 만 파일에 저장해야합니다 (지연된 메시지가 순서대로 작성되지 않도록).

파일을 별도의 파일로 계속 기록하고 나중에 합병 할 수있는 도구를 찾거나 작성할 수 있습니다 (아마도 자동화되거나 파일을 사용하려는 시점에서 실행할 수 있습니다.)

Windows의 이벤트 추적, Windows Vista에 포함 된 나중에는 이에 대한 훌륭한 기능을 제공합니다.

발췌 :

Windows (ETW)의 이벤트 추적은 효율적인 커널 수준 추적 기능으로 커널 또는 응용 프로그램 정의 이벤트를 로그 파일에 로그인 할 수 있습니다. 실시간 또는 로그 파일에서 이벤트를 소비하여 응용 프로그램을 디버깅하거나 응용 프로그램에서 성능 문제가 발생하는 위치를 결정하는 데 사용될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top