검색결과 리스트
HeapSetInformation에 해당되는 글 1건
- 2009.05.21 LFH에 대해서 (5)
근래에 회사에서 만들고 있는 게임의 서버 애플리케이션에 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://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
이 글은 스프링노트에서 작성되었습니다.
댓글
wow Thank u for share good information.
It is really good to increase server performance in multi core system.
Have a nice weekend.
p.s. Sorry I do not write korean. (This system do not support korea character...)
도움이 되었다니 기분 좋네요^^
업무 이슈중에 메모리에 관련된 것들이 더러 있어서,
저도 LFH에 관심을 두고 있는데, 좋은 정보를 한데 모아주셔서 감사합니다.
유익한 내용들 잘 참고하도록 하겠습니다.
"HEAP_NO_SERIALIZE flag는 멀티 스레드에서 그 힙에 동시에 접근하여 할당, 해제를 가능하게 하기 위한 설정입니다." 설명을 반대로 하신 것 같습니다. HEAP_NO_SERIALIZE 가 설정되면 개별 쓰레드만 사용해야하는 것 아닌가요.
알려주셔서 수정했습니다. 다시 글을 HEAP_NO_SERIALIZE 이 기본으로 설정되어 있어서 멀티스레드 접근이 가능한데 만약 이걸 설정해버리면 상호배제가 안된다는 것을 제가 반대로 받아들였네요;;;