인터넷에서 LFH 관련 자료를 찾다가 찾은 문서입니다.



저작자 표시
신고
by 흥배 2009.08.04 18:36

근래에 회사에서 만들고 있는 게임의 서버 애플리케이션에 LFH을 적용하면서 관련 자료를 좀 모아 보았습니다.


LFH ( Low fragmentation Heap )

1. 단편화 방지를 위해서 만들어진 것이지만 멀티코어 환경에서 특히 좋다.

2. 코어가 하나 있을 때는 오히려 10% 성능 하락도 있다( 신뢰 여부는 측정 불가 ^^; )

3. CRT에서는 크게 성능 향상을 볼 수 없다.
   (nhn Japan 블로그 글에서 CRT도 LFH를 적용했는지 정확하게 모르겠음
    CRT도 LFH 적용을 위해서는 CRT 힙 핸들을 HeapSetInformation에 적용해야 한다 )

4. LFH가 극상의 성능을 내기 위해서 Private Heap과의 조합이 최상이다.

5. Windows Server 2008/Vista 기본적으로 사용되도록 되어 있음
   : 이 때문에 메모리 측정(Private Bytes)를 할 때 정보가 좀 틀릴 수도 있음

6. LFH는 Windows XP, Windows 2000 Professional with SP4, Windows Server 2003 이상 가능



참고

1. 책
  Windows via C/C++ 672 페이지

2. 웹
http://workspace.office.live.com/?wa=wsignin1.0#jacking75/프로그래밍%20문서/CHB001%20-%20About%20Heap.docx

http://kslive.tistory.com/49

http://www.cyworld.com/jupihistory/2870669

http://blog.naver.com/mmouse77?Redirect=Log&logNo=50014020705

http://blog.naver.com/neuk?Redirect=Log&logNo=150012867627

http://re-thinkthings.spaces.live.com/Blog/cns!1C5AE98DA3645F42!587.entry   (일본어 )

윈도우즈의 LFH와 Hoard의 비교
http://devnote.net/55


NHN Japan 블로그에 있는 글 ( 성능 측정 그래프도 있음 )
http://techlog.nhncorp.jp/index.php/low-fragmentation-heap/#more-21
  (일본어)




사용 방법

1. 프로세스 힙에 LFH 적용
ULONG ulEnableLFH = 2;
HeapSetInformation (
        GetProcessHeap(), 
        HeapCompatibilityInformation, 
        &ulEnableLFH, 
        sizeof(ulEnableLFH));

2. CRT 힙에 LFH 적용
intptr_t hCrtHeap = _get_heap_handle();
ULONG ulEnableLFH = 2;
if (HeapSetInformation((PVOID)hCrtHeap,
                           HeapCompatibilityInformation,
                           &ulEnableLFH, sizeof(ulEnableLFH)))
        puts("Enabling Low Fragmentation Heap succeeded");
    else
        puts("Enabling Low Fragmentation Heap failed");
    return 0;


3. 프로세스의 모든 힙에 적용

HANDLE Heaps[1025];
DWORD Count = GetProcessHeaps( 1024, Heaps );
for( DWORD i = 0; i < Count; ++i )
{
     ULONG  HeapFragValue = 2;

     if( HeapSetInformation( Heaps[i], HeapCompatibilityInformation, &HeapFragValue, sizeof(HeapFragValue) ) )
    {
          .............
    }
    else
    {
         ...................
    }
}


제가 적용한 프로젝트에서는 프로세스에서 생성한 힙이 총 9개이며 세번째는 무조건 실패를 합니다.

이유는 이 힙에는 HEAP_NO_SERIALIZE flag가 설정 되어 있기 때문입니다.

HEAP_NO_SERIALIZE flag는 멀티 스레드에서 그 힙에 동시에 접근하여 할당, 해제를 가능하게 하기 위한 설정입니다.
( 참고   http://support.microsoft.com/kb/929136/ja  )


모든 힙에 적용하므로 따로 CRT 힙에는 LFH를 적용하지 않아도 된다.   

모든 프로세스의 힙에 LFH를 적용 후 따로 CRT 힙에 LFH를 적용하면 실패합니다.

이유는 이미 적용을 했기 때문이다. 저는 9번째가 CRT 힙이었습니다.




Windows Heap과 관련된 볼만한 글입니다.

Analyzing the heap(s) of a Win32 program



 

이 글은 스프링노트에서 작성되었습니다.

신고
by 흥배 2009.05.21 22:00
| 1 |

티스토리 툴바