문제

우리의 서비스는 고객의 서버에서 밤 동안 잠들고 깨어나는 데 어려움을 겪는 경향이 있습니다. 발생하는 것은 때때로 수백 MB 인 프로세스 힙이 스왑 파일로 이동된다는 것입니다. 이것은 우리의 서비스가 사용되지 않고 다른 서비스를 실행할 예정인 밤에 발생합니다 (DB 백업, AV 스캔 등). 이런 일이 발생하면 몇 시간의 비 활동 후 첫 번째 서비스 호출은 몇 분이 걸립니다 (결과적으로 전화는 몇 초가 걸립니다).

나는 그것이 가상 메모리 관리의 문제라고 확신하며, OS가 물리적 메모리에 서비스를 유지하도록 강요한다는 아이디어를 정말로 싫어합니다. 서버의 다른 프로세스를 해치고 전체 서버 처리량을 줄일 수 있다는 것을 알고 있습니다. 그럼에도 불구하고, 우리의 고객은 우리의 앱이 반응이되기를 원합니다. 그들은 야간 일자리가 더 오래 걸리는지 상관하지 않습니다.

나는 Windows가 물리적 기억에 페이지를 유지하도록 강요하는 방법이 있다는 것을 모호하게 기억하지만, 나는 그 아이디어를 정말 싫어합니다. 나는 더 높은 수준의 기능을 시작할 내부 또는 외부 감시자에게 더 많이 기대고 있습니다 (이미 거의하지 않고 차이가없는 내부 스케줄러가 이미 있습니다). 그런 종류의 서비스가 제공되는 제 3 자 도구가 있다면 좋았을 것입니다.

이런 종류의 문제에 대한 의견, 권장 사항 및 일반적인 솔루션을 듣고 싶습니다. 이 서비스는 VC2005로 작성되며 Windows 서버에서 실행됩니다.

도움이 되었습니까?

해결책

당신이 언급했듯이, 앱을 메모리에 유지하도록 강요하는 것이 기계에서 리소스를 공유하는 가장 좋은 방법은 아닙니다. 잘 작동하는 빠른 솔루션은 고객이 사용하기 시작하기 전에 매일 아침 특정 시간에 서비스를 깨우는 이벤트를 예약하는 것입니다. 간단한 스크립트 또는 EXE 호출로 Windows 작업 스케줄러에서 예약 할 수 있습니다.

다른 팁

나는 당신이 이것을하고 싶거나 그것이 모범 사례라고 말하는 것이 아니지만, 그것이 당신에게 충분히 잘 작동 할 수 있습니다. 그것은 당신이 요청한 것과 일치하는 것 같습니다.

요약 : 프로세스의 모든 페이지를 한 번에 한 페이지에 정기적으로 터치합니다.

백그라운드에서 실행되고 n 초마다 깨어 난 스레드는 어떻습니까? 페이지가 깨어날 때마다 주소 X에서 읽으려고 시도합니다. 시도는 잘못된 주소를 읽을 경우 예외 핸들러로 보호됩니다. 그런 다음 페이지 크기로 x를 증가시킵니다.

4GB에는 65536 페이지, 3GB의 49152 페이지, 2GB의 32768 페이지가 있습니다. 유휴 시간 (밤새 데드 타임)을 각 페이지를 누르는 것을 원하는 빈도 (시도)로 나눕니다.

BYTE *ptr;

ptr = NULL;
while(TRUE)
{
    __try
    {
        BYTE b;

        b = *ptr;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        // ignore, some pages won't be accessible
    }

    ptr += sizeofVMPage;

    Sleep(N * 1000);
}

getsysteminfo ()에서 반환 된 결과에서 dwpagesize 값에서 sizeofvmpage 값을 얻을 수 있습니다.

앱의 다른 스레드가 동시에 메모리 보호를 수정할 수 있으므로 if (! isbadreadptr (ptr))를 사용하여 예외 핸들러를 피하려고 시도하지 마십시오. 이로 인해 멈추지 않으면 이유를 식별하는 것이 거의 불가능할 것입니다 (반복 불가능한 경주 상태 일 가능성이 높습니다). 시간을 낭비하지 마십시오.

물론, 당신은 낮에는이 스레드를 끄고 죽은 시간 동안 만 실행하고 싶을 것입니다.

세 번째 접근 방식은 서비스가 카운터를 늘리는 것과 같은 사소한 일을 한 다음 10 초 동안 상당히 오랫동안 잠을 자도록하는 것입니다. Thios는 다른 응용 프로그램에 최소한의 영향을 미쳐야하지만 최소한 일부 페이지를 사용할 수 있습니다.

보장해야 할 또 다른 사항은 귀하의 데이터가 현지화되어 있다는 것입니다.

다시 말해서, 당신은 무엇이든하기 전에 기억의 300 mib가 모두 필요합니까? 사용하는 데이터 구조가 재 배열되어 특정 요청이 몇 메가 바이트 만 충족 될 수 있습니까?

예를 들어

  • 300 MIB의 힙 메모리에 얼굴 인식 데이터가 포함 된 경우. 남성 및 여성 얼굴 데이터가 함께 저장되도록 데이터를 내부적으로 배열 할 수 있습니까? 아니면 큰 노즈가 작은 코와 분리되어 있습니까?

  • 그것이 일종의 논리적 구조를 가지고 있다면 분류 될 수 있습니까? 이진 검색을 사용하여 많은 페이지를 건너 뛸 수 있습니까?

  • 특권, 인 메모리, 데이터베이스 엔진 인 경우 데이터가 너무 많은 메모리 페이지 히트를 필요로하지 않도록 데이터를 더 잘 인덱싱/클러스터링 할 수 있습니까?

  • 이미지 텍스처 인 경우 일반적으로 사용 된 텍스처가 서로 가까이에있을 수 있습니까?

무엇이든 할 수 있기 전에 메모리의 300 mib가 모두 필요합니까? 당신은없이 서비스 요청을 할 수 없습니다 모두 메모리로 다시 데이터?


그렇지 않으면: 6시에 예약 된 작업.

비용 측면에서 가장 저렴하고 가장 쉬운 솔루션은 아마도 해당 서버에 대해 더 많은 RAM을 구매하는 것일 것입니다. 그러면 페이지 파일을 완전히 비활성화 할 수 있습니다. 32 비트 창문을 실행하는 경우 4GB의 RAM을 구입하십시오. 그러면 전체 주소 공간은 물리적 메모리로 백업되며 페이지 파일은 어쨌든 아무것도하지 않습니다.

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